feat(sms): add real instance message workflow

This commit is contained in:
chick
2026-07-19 02:12:57 +08:00
parent 38a26c2ce1
commit 0112e3320a
17 changed files with 781 additions and 450 deletions
@@ -0,0 +1,59 @@
import type { MessagesDataSource, MessagesSnapshot, SendMessageInput } from './messages-module.js';
interface Options {
readonly fetcher?: typeof fetch;
}
function record(value: unknown): Record<string, unknown> | undefined {
return value !== null && typeof value === 'object' && !Array.isArray(value)
? (value as Record<string, unknown>)
: undefined;
}
export function createMessagesApiDataSource(options: Options = {}): MessagesDataSource {
const fetcher = options.fetcher ?? fetch;
return {
async load(instanceId, signal): Promise<MessagesSnapshot> {
const response = await fetcher(
`/api/v1/instances/${encodeURIComponent(instanceId)}/messages?limit=50&offset=0`,
{ headers: { accept: 'application/json' }, signal },
);
if (!response.ok) throw new Error('message load failed');
const root = record(await response.json());
if (!Array.isArray(root?.messages)) throw new Error('message load failed');
return {
messages: root.messages.flatMap((item) => {
const value = record(item);
return typeof value?.id === 'string' &&
typeof value.phoneNumber === 'string' &&
typeof value.content === 'string' &&
typeof value.timestamp === 'string' &&
typeof value.status === 'string' &&
typeof value.direction === 'string'
? [
{
id: value.id,
phoneNumber: value.phoneNumber,
content: value.content,
timestamp: value.timestamp,
status: value.status,
direction: value.direction,
},
]
: [];
}),
};
},
async send(instanceId: string, input: SendMessageInput): Promise<void> {
const response = await fetcher(
`/api/v1/instances/${encodeURIComponent(instanceId)}/messages/send`,
{
method: 'POST',
headers: { accept: 'application/json', 'content-type': 'application/json' },
body: JSON.stringify(input),
},
);
if (!response.ok) throw new Error('message send failed');
},
};
}