imessage-sdk 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,265 @@
1
+ /** Runtime feature declaration for one configured provider connection. */
2
+ interface IMessageCapabilities {
3
+ readonly messages: {
4
+ readonly text: boolean;
5
+ readonly attachments: boolean;
6
+ readonly replies: boolean;
7
+ readonly get: boolean;
8
+ readonly edit: boolean;
9
+ readonly delete: boolean;
10
+ };
11
+ readonly conversations: {
12
+ readonly direct: boolean;
13
+ readonly groups: boolean;
14
+ readonly get: boolean;
15
+ readonly markRead: boolean;
16
+ };
17
+ readonly interactions: {
18
+ readonly reactions: boolean;
19
+ readonly typingStart: boolean;
20
+ readonly typingStop: boolean;
21
+ readonly readReceipts: boolean;
22
+ };
23
+ readonly events: {
24
+ readonly webhooks: boolean;
25
+ readonly stream: boolean;
26
+ };
27
+ }
28
+
29
+ /** Provider names stay literal through generics but are open to custom adapters. */
30
+ type IMessageProviderName = string;
31
+ type IMessageAddressKind = "phone" | "email";
32
+ interface IMessageAddress {
33
+ readonly kind: IMessageAddressKind;
34
+ readonly value: string;
35
+ }
36
+ type NonEmptyReadonlyArray<T> = readonly [T, ...T[]];
37
+ type IMessageAttachmentKind = "image" | "video" | "file";
38
+ type IMessageAttachmentSource = {
39
+ readonly type: "url";
40
+ /** A URL that the selected provider can fetch. */
41
+ readonly url: string;
42
+ } | {
43
+ readonly type: "blob";
44
+ readonly data: Blob;
45
+ } | {
46
+ readonly type: "bytes";
47
+ readonly data: Uint8Array;
48
+ };
49
+ interface IMessageAttachmentInput {
50
+ readonly kind: IMessageAttachmentKind;
51
+ readonly source: IMessageAttachmentSource;
52
+ readonly filename?: string;
53
+ readonly contentType?: string;
54
+ }
55
+ interface IMessageAttachment {
56
+ readonly kind: IMessageAttachmentKind;
57
+ readonly id?: string;
58
+ readonly url?: string;
59
+ readonly filename?: string;
60
+ readonly contentType?: string;
61
+ readonly size?: number;
62
+ readonly raw: unknown;
63
+ }
64
+ interface MessageReplyReference {
65
+ /** Provider-native message identifier. */
66
+ readonly messageId: string;
67
+ readonly partIndex?: number;
68
+ }
69
+ /** Identifies a provider message within its native conversation. */
70
+ interface MessageLocator {
71
+ readonly conversationId: string;
72
+ readonly messageId: string;
73
+ }
74
+ type SendDestination = {
75
+ readonly conversationId: string;
76
+ readonly to?: never;
77
+ } | {
78
+ readonly conversationId?: never;
79
+ readonly to: IMessageAddress | NonEmptyReadonlyArray<IMessageAddress>;
80
+ };
81
+ type SendContent = {
82
+ readonly text: string;
83
+ readonly attachments?: readonly IMessageAttachmentInput[];
84
+ } | {
85
+ readonly text?: string;
86
+ readonly attachments: NonEmptyReadonlyArray<IMessageAttachmentInput>;
87
+ };
88
+ type SendMessageInput = SendDestination & SendContent & {
89
+ readonly replyTo?: MessageReplyReference;
90
+ readonly idempotencyKey?: string;
91
+ readonly metadata?: Readonly<Record<string, string>>;
92
+ };
93
+ interface EditMessageInput {
94
+ readonly text: string;
95
+ }
96
+ type IMessageDirection = "inbound" | "outbound";
97
+ type IMessageService = "imessage" | "sms" | "rcs" | "unknown";
98
+ type IMessageStatus = "pending" | "accepted" | "sent" | "delivered" | "read" | "failed";
99
+ /**
100
+ * A provider-normalized message before the client adds connection identity.
101
+ * Provider adapters return this shape.
102
+ */
103
+ interface ProviderMessage {
104
+ readonly providerMessageId: string;
105
+ /** Opaque provider-native ID, scoped to one provider connection. */
106
+ readonly conversationId?: string;
107
+ readonly direction: IMessageDirection;
108
+ readonly sender: IMessageAddress;
109
+ readonly recipients: readonly IMessageAddress[];
110
+ readonly text: string;
111
+ readonly attachments: readonly IMessageAttachment[];
112
+ readonly replyTo?: MessageReplyReference;
113
+ readonly service: IMessageService;
114
+ readonly status: IMessageStatus;
115
+ readonly providerStatus?: string;
116
+ readonly createdAt: Date;
117
+ readonly sentAt?: Date;
118
+ readonly deliveredAt?: Date;
119
+ readonly readAt?: Date;
120
+ readonly raw: unknown;
121
+ }
122
+ type ProviderSentMessage = ProviderMessage & {
123
+ readonly direction: "outbound";
124
+ };
125
+ /** A message returned by a client bound to one provider connection. */
126
+ type Message<TProvider extends IMessageProviderName = IMessageProviderName, TConnectionId extends string = string> = Omit<ProviderMessage, "conversationId"> & {
127
+ /** Equal to providerMessageId in v0.1. */
128
+ readonly id: string;
129
+ /** Provider-native when available; otherwise a non-routable imsg-sdk-v1 fallback. */
130
+ readonly conversationId: string;
131
+ readonly provider: TProvider;
132
+ readonly connectionId: TConnectionId;
133
+ };
134
+ type SentMessage<TProvider extends IMessageProviderName = IMessageProviderName, TConnectionId extends string = string> = Message<TProvider, TConnectionId> & {
135
+ readonly direction: "outbound";
136
+ };
137
+ interface OpenConversationInput {
138
+ readonly participants: NonEmptyReadonlyArray<IMessageAddress>;
139
+ }
140
+ interface ProviderConversation {
141
+ /** Opaque provider-native ID, scoped to one provider connection. */
142
+ readonly providerConversationId: string;
143
+ readonly participants: readonly IMessageAddress[];
144
+ readonly createdAt?: Date;
145
+ readonly raw: unknown;
146
+ }
147
+ type Conversation<TProvider extends IMessageProviderName = IMessageProviderName, TConnectionId extends string = string> = ProviderConversation & {
148
+ /** Equal to providerConversationId in v0.1; scope with provider and connectionId. */
149
+ readonly id: string;
150
+ readonly provider: TProvider;
151
+ readonly connectionId: TConnectionId;
152
+ };
153
+ type IMessageReaction = "love" | "like" | "dislike" | "laugh" | "emphasize" | "question";
154
+ interface AddReactionInput extends MessageLocator {
155
+ readonly reaction: IMessageReaction;
156
+ readonly partIndex?: number;
157
+ }
158
+ type RemoveReactionInput = AddReactionInput;
159
+ interface SubscribeOptions {
160
+ readonly cursor?: string;
161
+ readonly signal?: AbortSignal;
162
+ }
163
+
164
+ interface ProviderEventBase<TType extends string> {
165
+ readonly id: string;
166
+ readonly providerEventId?: string;
167
+ readonly type: TType;
168
+ readonly timestamp: Date;
169
+ readonly raw: unknown;
170
+ }
171
+ type ProviderMessageEventType = "message.received" | "message.sent" | "message.delivered" | "message.read" | "message.failed" | "message.edited";
172
+ interface ProviderMessageEvent<TType extends ProviderMessageEventType = ProviderMessageEventType> extends ProviderEventBase<TType> {
173
+ readonly message: ProviderMessage;
174
+ }
175
+ interface ProviderMessageDeletedEvent extends ProviderEventBase<"message.deleted"> {
176
+ readonly conversationId: string;
177
+ readonly messageId: string;
178
+ }
179
+ type ProviderReactionEventType = "reaction.added" | "reaction.removed";
180
+ interface ProviderReactionEvent<TType extends ProviderReactionEventType = ProviderReactionEventType> extends ProviderEventBase<TType> {
181
+ readonly conversationId: string;
182
+ readonly messageId: string;
183
+ readonly actor: IMessageAddress;
184
+ readonly reaction: IMessageReaction;
185
+ readonly partIndex?: number;
186
+ }
187
+ type ProviderTypingEventType = "typing.started" | "typing.stopped";
188
+ interface ProviderTypingEvent<TType extends ProviderTypingEventType = ProviderTypingEventType> extends ProviderEventBase<TType> {
189
+ readonly conversationId: string;
190
+ /** Some group transports do not identify which participant is typing. */
191
+ readonly actor?: IMessageAddress;
192
+ }
193
+ type ProviderEvent = ProviderMessageEvent | ProviderMessageDeletedEvent | ProviderReactionEvent | ProviderTypingEvent;
194
+ interface IMessageEventBase<TProvider extends IMessageProviderName, TConnectionId extends string, TType extends string> extends ProviderEventBase<TType> {
195
+ readonly provider: TProvider;
196
+ readonly connectionId: TConnectionId;
197
+ }
198
+ interface IMessageMessageEvent<TProvider extends IMessageProviderName, TConnectionId extends string, TType extends ProviderMessageEventType = ProviderMessageEventType> extends IMessageEventBase<TProvider, TConnectionId, TType> {
199
+ readonly message: Message<TProvider, TConnectionId>;
200
+ }
201
+ interface IMessageDeletedEvent<TProvider extends IMessageProviderName, TConnectionId extends string> extends IMessageEventBase<TProvider, TConnectionId, "message.deleted"> {
202
+ readonly conversationId: string;
203
+ readonly messageId: string;
204
+ }
205
+ interface IMessageReactionEvent<TProvider extends IMessageProviderName, TConnectionId extends string, TType extends ProviderReactionEventType = ProviderReactionEventType> extends IMessageEventBase<TProvider, TConnectionId, TType> {
206
+ readonly conversationId: string;
207
+ readonly messageId: string;
208
+ readonly actor: IMessageAddress;
209
+ readonly reaction: IMessageReaction;
210
+ readonly partIndex?: number;
211
+ }
212
+ interface IMessageTypingEvent<TProvider extends IMessageProviderName, TConnectionId extends string, TType extends ProviderTypingEventType = ProviderTypingEventType> extends IMessageEventBase<TProvider, TConnectionId, TType> {
213
+ readonly conversationId: string;
214
+ readonly actor?: IMessageAddress;
215
+ }
216
+ type IMessageEvent<TProvider extends IMessageProviderName = IMessageProviderName, TConnectionId extends string = string> = IMessageMessageEvent<TProvider, TConnectionId> | IMessageDeletedEvent<TProvider, TConnectionId> | IMessageReactionEvent<TProvider, TConnectionId> | IMessageTypingEvent<TProvider, TConnectionId>;
217
+
218
+ interface ProviderMessages {
219
+ send(input: SendMessageInput): Promise<ProviderSentMessage>;
220
+ get?(message: MessageLocator): Promise<ProviderMessage | null>;
221
+ edit?(message: MessageLocator, input: EditMessageInput): Promise<ProviderMessage>;
222
+ delete?(message: MessageLocator): Promise<void>;
223
+ }
224
+ interface ProviderConversations {
225
+ open(input: OpenConversationInput): Promise<ProviderConversation>;
226
+ get?(conversationId: string): Promise<ProviderConversation | null>;
227
+ markRead?(conversationId: string): Promise<void>;
228
+ }
229
+ interface ProviderReactions {
230
+ add(input: AddReactionInput): Promise<void>;
231
+ remove(input: RemoveReactionInput): Promise<void>;
232
+ }
233
+ interface ProviderTyping {
234
+ start(conversationId: string): Promise<void>;
235
+ stop?(conversationId: string): Promise<void>;
236
+ }
237
+ interface ProviderWebhooks {
238
+ verify(request: Request): Promise<boolean>;
239
+ parse(request: Request): Promise<readonly ProviderEvent[]>;
240
+ }
241
+ interface ProviderEvents {
242
+ subscribe(options?: SubscribeOptions): AsyncIterable<ProviderEvent>;
243
+ }
244
+ /**
245
+ * Contract implemented by a provider adapter.
246
+ *
247
+ * The complete adapter is exposed at `client.providers.<name>`, so
248
+ * provider-specific APIs should be defined directly on the concrete provider.
249
+ */
250
+ interface IMessageProvider<TName extends IMessageProviderName = IMessageProviderName, TCapabilities extends IMessageCapabilities = IMessageCapabilities> {
251
+ readonly name: TName;
252
+ readonly capabilities: TCapabilities;
253
+ readonly messages: ProviderMessages;
254
+ readonly conversations: ProviderConversations;
255
+ readonly reactions?: ProviderReactions;
256
+ readonly typing?: ProviderTyping;
257
+ readonly webhooks?: ProviderWebhooks;
258
+ readonly events?: ProviderEvents;
259
+ close?(): Promise<void>;
260
+ }
261
+ type AnyIMessageProvider = IMessageProvider<IMessageProviderName, IMessageCapabilities>;
262
+ /** Preserves the concrete name, capabilities, and methods of an adapter. */
263
+ declare function defineProvider<const TProvider extends AnyIMessageProvider>(provider: TProvider): TProvider;
264
+
265
+ export { type AnyIMessageProvider as A, type ProviderEvents as B, type Conversation as C, type ProviderMessage as D, type EditMessageInput as E, type ProviderMessageDeletedEvent as F, type ProviderMessageEvent as G, type ProviderMessageEventType as H, type IMessageEvent as I, type ProviderMessages as J, type ProviderReactionEvent as K, type ProviderReactionEventType as L, type MessageLocator as M, type NonEmptyReadonlyArray as N, type OpenConversationInput as O, type ProviderConversation as P, type ProviderReactions as Q, type RemoveReactionInput as R, type SendMessageInput as S, type ProviderSentMessage as T, type ProviderTyping as U, type ProviderTypingEvent as V, type ProviderTypingEventType as W, type ProviderWebhooks as X, defineProvider as Y, type SentMessage as a, type Message as b, type AddReactionInput as c, type SubscribeOptions as d, type IMessageAddress as e, type IMessageAddressKind as f, type IMessageAttachment as g, type IMessageAttachmentInput as h, type IMessageAttachmentKind as i, type IMessageAttachmentSource as j, type IMessageCapabilities as k, type IMessageDeletedEvent as l, type IMessageDirection as m, type IMessageEventBase as n, type IMessageMessageEvent as o, type IMessageProvider as p, type IMessageProviderName as q, type IMessageReaction as r, type IMessageReactionEvent as s, type IMessageService as t, type IMessageStatus as u, type IMessageTypingEvent as v, type MessageReplyReference as w, type ProviderConversations as x, type ProviderEvent as y, type ProviderEventBase as z };
@@ -0,0 +1,76 @@
1
+ import { x as ProviderConversations, P as ProviderConversation, u as IMessageStatus, t as IMessageService, J as ProviderMessages, M as MessageLocator, D as ProviderMessage, e as IMessageAddress, p as IMessageProvider, Q as ProviderReactions, U as ProviderTyping, X as ProviderWebhooks } from '../provider-CCW_6OWg.js';
2
+
3
+ declare const BLOOIO_CAPABILITIES: {
4
+ readonly messages: {
5
+ readonly text: true;
6
+ readonly attachments: true;
7
+ readonly replies: true;
8
+ readonly get: true;
9
+ readonly edit: false;
10
+ readonly delete: false;
11
+ };
12
+ readonly conversations: {
13
+ readonly direct: true;
14
+ readonly groups: false;
15
+ readonly get: true;
16
+ readonly markRead: true;
17
+ };
18
+ readonly interactions: {
19
+ readonly reactions: true;
20
+ readonly typingStart: true;
21
+ readonly typingStop: true;
22
+ readonly readReceipts: true;
23
+ };
24
+ readonly events: {
25
+ readonly webhooks: true;
26
+ readonly stream: false;
27
+ };
28
+ };
29
+ interface BlooioOptions {
30
+ readonly apiKey?: string;
31
+ readonly sender?: IMessageAddress;
32
+ readonly webhookSecret?: string;
33
+ readonly baseUrl?: string;
34
+ }
35
+ interface BlooioMessageStatus {
36
+ readonly messageId: string;
37
+ readonly conversationId: string;
38
+ readonly status: IMessageStatus;
39
+ readonly providerStatus?: string;
40
+ readonly service: IMessageService;
41
+ readonly sentAt?: Date;
42
+ readonly deliveredAt?: Date;
43
+ readonly error?: string;
44
+ readonly raw: unknown;
45
+ }
46
+ type BlooioPlanKind = "shared" | "dedicated" | "inbound" | "trial" | "2fa";
47
+ interface BlooioNumber {
48
+ readonly phoneNumber: string;
49
+ readonly active: boolean;
50
+ readonly lastActive?: Date;
51
+ readonly planKind?: BlooioPlanKind;
52
+ readonly raw: unknown;
53
+ }
54
+ interface BlooioNumbers {
55
+ list(): Promise<readonly BlooioNumber[]>;
56
+ }
57
+ interface BlooioMessages extends ProviderMessages {
58
+ get(message: MessageLocator): Promise<ProviderMessage | null>;
59
+ getStatus(message: MessageLocator): Promise<BlooioMessageStatus | null>;
60
+ }
61
+ interface BlooioConversations extends ProviderConversations {
62
+ get(conversationId: string): Promise<ProviderConversation | null>;
63
+ markRead(conversationId: string): Promise<void>;
64
+ }
65
+ interface BlooioProvider extends IMessageProvider<"blooio", typeof BLOOIO_CAPABILITIES> {
66
+ readonly messages: BlooioMessages;
67
+ readonly conversations: BlooioConversations;
68
+ readonly reactions: ProviderReactions;
69
+ readonly typing: Required<ProviderTyping>;
70
+ readonly webhooks: ProviderWebhooks;
71
+ readonly numbers: BlooioNumbers;
72
+ }
73
+ /** Creates a Blooio v2 provider. No initialization call is required. */
74
+ declare function blooio(options?: BlooioOptions): BlooioProvider;
75
+
76
+ export { BLOOIO_CAPABILITIES, type BlooioConversations, type BlooioMessageStatus, type BlooioMessages, type BlooioNumber, type BlooioNumbers, type BlooioOptions, type BlooioPlanKind, type BlooioProvider, blooio };