@andocorp/sdk 0.0.1
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.
- package/dist/client.d.ts +28 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +285 -0
- package/dist/client.js.map +1 -0
- package/dist/generated/contracts.d.ts +375 -0
- package/dist/generated/contracts.d.ts.map +1 -0
- package/dist/generated/contracts.js +106 -0
- package/dist/generated/contracts.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/index.js.map +1 -0
- package/dist/realtime-events.d.ts +9 -0
- package/dist/realtime-events.d.ts.map +1 -0
- package/dist/realtime-events.js +245 -0
- package/dist/realtime-events.js.map +1 -0
- package/dist/realtime-runtime.d.ts +29 -0
- package/dist/realtime-runtime.d.ts.map +1 -0
- package/dist/realtime-runtime.js +335 -0
- package/dist/realtime-runtime.js.map +1 -0
- package/dist/realtime-types.d.ts +108 -0
- package/dist/realtime-types.d.ts.map +1 -0
- package/dist/realtime-types.js +3 -0
- package/dist/realtime-types.js.map +1 -0
- package/dist/realtime.d.ts +16 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +270 -0
- package/dist/realtime.js.map +1 -0
- package/dist/targets.d.ts +4 -0
- package/dist/targets.d.ts.map +1 -0
- package/dist/targets.js +52 -0
- package/dist/targets.js.map +1 -0
- package/dist/types.d.ts +76 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/package.json +37 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createAndoMessageDedupeCache = createAndoMessageDedupeCache;
|
|
4
|
+
exports.handleControlEvent = handleControlEvent;
|
|
5
|
+
exports.handleAndoRealtimeIncomingEvent = handleAndoRealtimeIncomingEvent;
|
|
6
|
+
exports.prepareAndoRealtimeIncomingEvent = prepareAndoRealtimeIncomingEvent;
|
|
7
|
+
const realtime_runtime_1 = require("./realtime-runtime");
|
|
8
|
+
const ANDO_CONVERSATION_TYPE_DIRECT_MESSAGE = 1;
|
|
9
|
+
const ANDO_CONVERSATION_MESSAGE_TYPE_SYSTEM = 1;
|
|
10
|
+
function isRecord(value) {
|
|
11
|
+
return typeof value === "object" && value != null;
|
|
12
|
+
}
|
|
13
|
+
function isStringProperty(value, key) {
|
|
14
|
+
return typeof value[key] === "string";
|
|
15
|
+
}
|
|
16
|
+
function normalizeMentionText(value) {
|
|
17
|
+
return (value ?? "")
|
|
18
|
+
.replace(/[\u200b-\u206f]/g, "")
|
|
19
|
+
.replace(/\s+/g, " ")
|
|
20
|
+
.trim();
|
|
21
|
+
}
|
|
22
|
+
function messageMentionsAndoAgent(params) {
|
|
23
|
+
const normalized = normalizeMentionText(params.text);
|
|
24
|
+
if (!normalized) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return params.memberGroupIds.some((memberGroupId) => {
|
|
28
|
+
const id = memberGroupId?.trim();
|
|
29
|
+
if (!id) {
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
return new RegExp(`<!member_group:${id}\\|[^>]+>`).test(normalized);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function isNonRetryableContextError(error) {
|
|
36
|
+
if (error instanceof Error &&
|
|
37
|
+
error.message.includes("/conversation-messages/") &&
|
|
38
|
+
error.message.includes("returned null")) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
return (error instanceof Error &&
|
|
42
|
+
"status" in error &&
|
|
43
|
+
error.status != null &&
|
|
44
|
+
[404, 410, 422].includes(Number(error.status)));
|
|
45
|
+
}
|
|
46
|
+
function createAndoMessageDedupeCache(options) {
|
|
47
|
+
const messages = new Map();
|
|
48
|
+
const prune = (now) => {
|
|
49
|
+
for (const [key, timestamp] of messages) {
|
|
50
|
+
if (now - timestamp <= options.ttlMs) {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
messages.delete(key);
|
|
54
|
+
}
|
|
55
|
+
while (messages.size > options.maxSize) {
|
|
56
|
+
const oldestKey = messages.keys().next().value;
|
|
57
|
+
if (!oldestKey) {
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
messages.delete(oldestKey);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
has(key, now = Date.now()) {
|
|
65
|
+
if (!key) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
prune(now);
|
|
69
|
+
const timestamp = messages.get(key);
|
|
70
|
+
if (timestamp == null) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
messages.delete(key);
|
|
74
|
+
messages.set(key, now);
|
|
75
|
+
return true;
|
|
76
|
+
},
|
|
77
|
+
mark(key, now = Date.now()) {
|
|
78
|
+
if (!key) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
prune(now);
|
|
82
|
+
messages.delete(key);
|
|
83
|
+
messages.set(key, now);
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function isMembershipNewEvent(event) {
|
|
88
|
+
if (event.eventId !== "membership/new") {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
if (!isRecord(event) || !("membership" in event) || !isRecord(event.membership)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const conversation = event.membership.conversation;
|
|
95
|
+
return isRecord(conversation) && isStringProperty(conversation, "id");
|
|
96
|
+
}
|
|
97
|
+
function isMessageNewEvent(event) {
|
|
98
|
+
if (event.eventId !== "member/message-new") {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
if (!isRecord(event) || !("message" in event) || !isRecord(event.message)) {
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
return (isStringProperty(event.message, "id") &&
|
|
105
|
+
isStringProperty(event.message, "conversation_id"));
|
|
106
|
+
}
|
|
107
|
+
function buildNormalizedMessageContext(context) {
|
|
108
|
+
if (!context?.current_text) {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return {
|
|
112
|
+
currentText: context.current_text,
|
|
113
|
+
replyThreadRootId: context.reply_thread_root_id ?? null,
|
|
114
|
+
inboundHistory: context.inbound_history.map((entry) => ({
|
|
115
|
+
sender: entry.author_name?.trim() || entry.author_id || "unknown",
|
|
116
|
+
body: entry.body,
|
|
117
|
+
timestamp: (0, realtime_runtime_1.toUnixTimestamp)(entry.created_at),
|
|
118
|
+
})),
|
|
119
|
+
threadStarterBody: context.thread_starter_body ?? null,
|
|
120
|
+
threadHistoryBody: context.thread_history_body ?? undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
function evaluateInboundMessage(params) {
|
|
124
|
+
const conversation = params.conversations.get(params.event.message.conversation_id);
|
|
125
|
+
const isDirectMessage = conversation?.type === ANDO_CONVERSATION_TYPE_DIRECT_MESSAGE;
|
|
126
|
+
const mentionsMe = messageMentionsAndoAgent({
|
|
127
|
+
text: params.event.message.markdown_content,
|
|
128
|
+
memberGroupIds: [
|
|
129
|
+
params.selfMember.member_group_id,
|
|
130
|
+
conversation?.everyone_member_group_id,
|
|
131
|
+
],
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
conversation,
|
|
135
|
+
isDirectMessage,
|
|
136
|
+
skip: params.event.message.type === ANDO_CONVERSATION_MESSAGE_TYPE_SYSTEM ||
|
|
137
|
+
params.event.message.author_id === params.selfMember.id ||
|
|
138
|
+
!mentionsMe,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
function handleControlEvent({ socket, roomId, conversations, event, }) {
|
|
142
|
+
if (event.eventId === "heartbeat/ping") {
|
|
143
|
+
(0, realtime_runtime_1.sendJson)(socket, { eventId: "heartbeat/pong" });
|
|
144
|
+
(0, realtime_runtime_1.acknowledgeEvent)({
|
|
145
|
+
socket,
|
|
146
|
+
roomId,
|
|
147
|
+
ackId: event._clientAckId,
|
|
148
|
+
});
|
|
149
|
+
return true;
|
|
150
|
+
}
|
|
151
|
+
if (isMembershipNewEvent(event)) {
|
|
152
|
+
conversations.set(event.membership.conversation.id, event.membership.conversation);
|
|
153
|
+
(0, realtime_runtime_1.acknowledgeEvent)({
|
|
154
|
+
socket,
|
|
155
|
+
roomId,
|
|
156
|
+
ackId: event._clientAckId,
|
|
157
|
+
});
|
|
158
|
+
return true;
|
|
159
|
+
}
|
|
160
|
+
if (!isMessageNewEvent(event)) {
|
|
161
|
+
(0, realtime_runtime_1.acknowledgeEvent)({
|
|
162
|
+
socket,
|
|
163
|
+
roomId,
|
|
164
|
+
ackId: event._clientAckId,
|
|
165
|
+
});
|
|
166
|
+
return true;
|
|
167
|
+
}
|
|
168
|
+
return false;
|
|
169
|
+
}
|
|
170
|
+
async function handleAndoRealtimeIncomingEvent({ api, socket, event, roomId, conversations, seenMessages, selfMember, options, }) {
|
|
171
|
+
const preparedMessage = await prepareAndoRealtimeIncomingEvent({
|
|
172
|
+
api,
|
|
173
|
+
event,
|
|
174
|
+
conversations,
|
|
175
|
+
seenMessages,
|
|
176
|
+
selfMember,
|
|
177
|
+
signal: options.signal,
|
|
178
|
+
});
|
|
179
|
+
if (preparedMessage.markSeen) {
|
|
180
|
+
seenMessages.mark(event.message.id);
|
|
181
|
+
}
|
|
182
|
+
(0, realtime_runtime_1.acknowledgeEvent)({
|
|
183
|
+
socket,
|
|
184
|
+
roomId,
|
|
185
|
+
ackId: event._clientAckId,
|
|
186
|
+
});
|
|
187
|
+
if (preparedMessage.kind !== "deliver") {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
await options.onMessage?.(preparedMessage.messageEvent);
|
|
191
|
+
}
|
|
192
|
+
async function prepareAndoRealtimeIncomingEvent({ api, event, conversations, seenMessages, selfMember, signal, }) {
|
|
193
|
+
if (seenMessages.has(event.message.id)) {
|
|
194
|
+
return {
|
|
195
|
+
kind: "drop",
|
|
196
|
+
markSeen: false,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
if (!conversations.has(event.message.conversation_id)) {
|
|
200
|
+
const memberships = await (0, realtime_runtime_1.listAllMemberships)(api, signal);
|
|
201
|
+
(0, realtime_runtime_1.updateConversationCache)(conversations, memberships);
|
|
202
|
+
}
|
|
203
|
+
const messageEvaluation = evaluateInboundMessage({
|
|
204
|
+
event,
|
|
205
|
+
conversations,
|
|
206
|
+
selfMember,
|
|
207
|
+
});
|
|
208
|
+
if (messageEvaluation.skip) {
|
|
209
|
+
return {
|
|
210
|
+
kind: "drop",
|
|
211
|
+
markSeen: false,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
let fetchedContext;
|
|
215
|
+
try {
|
|
216
|
+
fetchedContext = await api.getMessageContext(event.message.id, signal);
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
if (isNonRetryableContextError(error)) {
|
|
220
|
+
return {
|
|
221
|
+
kind: "drop",
|
|
222
|
+
markSeen: true,
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
throw error;
|
|
226
|
+
}
|
|
227
|
+
const context = buildNormalizedMessageContext(fetchedContext);
|
|
228
|
+
if (!context?.currentText) {
|
|
229
|
+
return {
|
|
230
|
+
kind: "drop",
|
|
231
|
+
markSeen: false,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
kind: "deliver",
|
|
236
|
+
markSeen: true,
|
|
237
|
+
messageEvent: {
|
|
238
|
+
message: event.message,
|
|
239
|
+
conversation: messageEvaluation.conversation,
|
|
240
|
+
isDirectMessage: messageEvaluation.isDirectMessage,
|
|
241
|
+
context,
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=realtime-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-events.js","sourceRoot":"","sources":["../src/realtime-events.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AndoMembership } from "./types";
|
|
2
|
+
import { AndoRawRealtimeEvent, AndoRealtimeApi, AndoSocket, SelfMember, SocketListener } from "./realtime-types";
|
|
3
|
+
export declare function delay(ms: number, abortSignal?: AbortSignal): Promise<void>;
|
|
4
|
+
export declare function isAbortError(error: unknown): boolean;
|
|
5
|
+
export declare function isPermanentAuthFailure(error: unknown): boolean;
|
|
6
|
+
export declare function toAbortError(reason?: unknown): Error;
|
|
7
|
+
export declare function toUnixTimestamp(value: string | Date | undefined): number | undefined;
|
|
8
|
+
export declare function pickSelfMember(me: Awaited<ReturnType<AndoRealtimeApi["getMe"]>>, memberGroupId: string | null): SelfMember;
|
|
9
|
+
export declare function buildAndoRealtimeWebSocketUrl(params: {
|
|
10
|
+
realtimeHost: string;
|
|
11
|
+
roomId: string;
|
|
12
|
+
token: string;
|
|
13
|
+
}): string;
|
|
14
|
+
export declare function addSocketListener(socket: AndoSocket, event: string, listener: SocketListener): () => void;
|
|
15
|
+
export declare function addSocketOnceListener(socket: AndoSocket, event: string, listener: SocketListener): () => void;
|
|
16
|
+
export declare function readAndoRealtimeData(raw: unknown): string;
|
|
17
|
+
export declare function parseAndoRealtimeEvent(raw: unknown): AndoRawRealtimeEvent | null;
|
|
18
|
+
export declare function sendJson(socket: AndoSocket, payload: unknown): void;
|
|
19
|
+
export declare function closeSocket(socket: AndoSocket): void;
|
|
20
|
+
export declare function acknowledgeEvent(params: {
|
|
21
|
+
socket: AndoSocket;
|
|
22
|
+
roomId: string;
|
|
23
|
+
ackId?: string;
|
|
24
|
+
}): void;
|
|
25
|
+
export declare function openSocket(url: string, abortSignal?: AbortSignal, setup?: (socket: AndoSocket) => void): Promise<AndoSocket>;
|
|
26
|
+
export declare function waitForSocketClose(socket: AndoSocket, abortSignal?: AbortSignal): Promise<void>;
|
|
27
|
+
export declare function listAllMemberships(api: Pick<AndoRealtimeApi, "getMyMemberships">, signal?: AbortSignal): Promise<AndoMembership[]>;
|
|
28
|
+
export declare function updateConversationCache(conversations: Map<string, AndoMembership["conversation"]>, memberships: AndoMembership[]): void;
|
|
29
|
+
//# sourceMappingURL=realtime-runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-runtime.d.ts","sourceRoot":"","sources":["../src/realtime-runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,eAAe,EACf,UAAU,EAGV,UAAU,EACV,cAAc,EAEf,MAAM,kBAAkB,CAAC;AAgB1B,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAoB1E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEpD;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAO9D;AAED,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,OAAO,GAAG,KAAK,CASpD;AAED,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC/B,MAAM,GAAG,SAAS,CAMpB;AAED,wBAAgB,cAAc,CAC5B,EAAE,EAAE,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,EACjD,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,UAAU,CAOZ;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE;IACpD,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf,UAcA;AAQD,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,GACvB,MAAM,IAAI,CA+BZ;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,UAAU,EAClB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,cAAc,SAEN,IAAI,CAMvB;AAgCD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAyBzD;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,OAAO,GACX,oBAAoB,GAAG,IAAI,CAW7B;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,QAM5D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,QAO7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,MAAM,EAAE,UAAU,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,QASA;AAED,wBAAsB,UAAU,CAC9B,GAAG,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,WAAW,EACzB,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,GACnC,OAAO,CAAC,UAAU,CAAC,CA4ErB;AAED,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,UAAU,EAClB,WAAW,CAAC,EAAE,WAAW,iBA4C1B;AAED,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,IAAI,CAAC,eAAe,EAAE,kBAAkB,CAAC,EAC9C,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC,CAkB3B;AAED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC,EAC1D,WAAW,EAAE,cAAc,EAAE,QAM9B"}
|
|
@@ -0,0 +1,335 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.delay = delay;
|
|
4
|
+
exports.isAbortError = isAbortError;
|
|
5
|
+
exports.isPermanentAuthFailure = isPermanentAuthFailure;
|
|
6
|
+
exports.toAbortError = toAbortError;
|
|
7
|
+
exports.toUnixTimestamp = toUnixTimestamp;
|
|
8
|
+
exports.pickSelfMember = pickSelfMember;
|
|
9
|
+
exports.buildAndoRealtimeWebSocketUrl = buildAndoRealtimeWebSocketUrl;
|
|
10
|
+
exports.addSocketListener = addSocketListener;
|
|
11
|
+
exports.addSocketOnceListener = addSocketOnceListener;
|
|
12
|
+
exports.readAndoRealtimeData = readAndoRealtimeData;
|
|
13
|
+
exports.parseAndoRealtimeEvent = parseAndoRealtimeEvent;
|
|
14
|
+
exports.sendJson = sendJson;
|
|
15
|
+
exports.closeSocket = closeSocket;
|
|
16
|
+
exports.acknowledgeEvent = acknowledgeEvent;
|
|
17
|
+
exports.openSocket = openSocket;
|
|
18
|
+
exports.waitForSocketClose = waitForSocketClose;
|
|
19
|
+
exports.listAllMemberships = listAllMemberships;
|
|
20
|
+
exports.updateConversationCache = updateConversationCache;
|
|
21
|
+
const SOCKET_CONNECTING = 0;
|
|
22
|
+
const SOCKET_OPEN = 1;
|
|
23
|
+
const SOCKET_CLOSING = 2;
|
|
24
|
+
const SOCKET_CLOSED = 3;
|
|
25
|
+
const TEXT_DECODER = new TextDecoder();
|
|
26
|
+
function isNodeRuntime() {
|
|
27
|
+
if (typeof process === "undefined") {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
return typeof process.versions?.node === "string";
|
|
31
|
+
}
|
|
32
|
+
function delay(ms, abortSignal) {
|
|
33
|
+
return new Promise((resolve) => {
|
|
34
|
+
if (abortSignal?.aborted) {
|
|
35
|
+
resolve();
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
const timeout = setTimeout(() => {
|
|
39
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
40
|
+
resolve();
|
|
41
|
+
}, ms);
|
|
42
|
+
const onAbort = () => {
|
|
43
|
+
clearTimeout(timeout);
|
|
44
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
45
|
+
resolve();
|
|
46
|
+
};
|
|
47
|
+
abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function isAbortError(error) {
|
|
51
|
+
return error instanceof Error && error.name === "AbortError";
|
|
52
|
+
}
|
|
53
|
+
function isPermanentAuthFailure(error) {
|
|
54
|
+
return (error instanceof Error &&
|
|
55
|
+
"status" in error &&
|
|
56
|
+
error.status != null &&
|
|
57
|
+
[401, 403].includes(Number(error.status)));
|
|
58
|
+
}
|
|
59
|
+
function toAbortError(reason) {
|
|
60
|
+
if (reason instanceof Error) {
|
|
61
|
+
reason.name || (reason.name = "AbortError");
|
|
62
|
+
return reason;
|
|
63
|
+
}
|
|
64
|
+
const error = new Error("aborted");
|
|
65
|
+
error.name = "AbortError";
|
|
66
|
+
return error;
|
|
67
|
+
}
|
|
68
|
+
function toUnixTimestamp(value) {
|
|
69
|
+
if (!value) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
return value instanceof Date ? value.getTime() : Date.parse(value);
|
|
73
|
+
}
|
|
74
|
+
function pickSelfMember(me, memberGroupId) {
|
|
75
|
+
return {
|
|
76
|
+
id: me.id,
|
|
77
|
+
display_name: me.display_name ?? null,
|
|
78
|
+
member_group_id: memberGroupId,
|
|
79
|
+
member_type: me.member_type,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
function buildAndoRealtimeWebSocketUrl(params) {
|
|
83
|
+
const base = params.realtimeHost.replace(/\/+$/, "");
|
|
84
|
+
const wsBase = base.startsWith("http://")
|
|
85
|
+
? `ws://${base.slice("http://".length)}`
|
|
86
|
+
: base.startsWith("https://")
|
|
87
|
+
? `wss://${base.slice("https://".length)}`
|
|
88
|
+
: base.startsWith("ws://") || base.startsWith("wss://")
|
|
89
|
+
? base
|
|
90
|
+
: `wss://${base}`;
|
|
91
|
+
return `${wsBase}/parties/main/${params.roomId}?token=${encodeURIComponent(params.token)}`;
|
|
92
|
+
}
|
|
93
|
+
function isNodeStyleSocket(socket) {
|
|
94
|
+
return typeof socket.on === "function" && typeof socket.off === "function";
|
|
95
|
+
}
|
|
96
|
+
function addSocketListener(socket, event, listener) {
|
|
97
|
+
if (isNodeStyleSocket(socket)) {
|
|
98
|
+
socket.on(event, listener);
|
|
99
|
+
return () => {
|
|
100
|
+
socket.off(event, listener);
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if (typeof socket.addEventListener === "function" &&
|
|
104
|
+
typeof socket.removeEventListener === "function") {
|
|
105
|
+
const wrapped = (browserEvent) => {
|
|
106
|
+
if (event === "message") {
|
|
107
|
+
listener(browserEvent.data);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
if (event === "error") {
|
|
111
|
+
listener(new Error("[ando-sdk] websocket error"));
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
listener(browserEvent);
|
|
115
|
+
};
|
|
116
|
+
socket.addEventListener(event, wrapped);
|
|
117
|
+
return () => socket.removeEventListener?.(event, wrapped);
|
|
118
|
+
}
|
|
119
|
+
return () => undefined;
|
|
120
|
+
}
|
|
121
|
+
function addSocketOnceListener(socket, event, listener) {
|
|
122
|
+
let remove = () => undefined;
|
|
123
|
+
remove = addSocketListener(socket, event, (...args) => {
|
|
124
|
+
remove();
|
|
125
|
+
listener(...args);
|
|
126
|
+
});
|
|
127
|
+
return remove;
|
|
128
|
+
}
|
|
129
|
+
function createStatusError(message, status) {
|
|
130
|
+
const error = new Error(message);
|
|
131
|
+
if (status != null) {
|
|
132
|
+
error.status = status;
|
|
133
|
+
}
|
|
134
|
+
return error;
|
|
135
|
+
}
|
|
136
|
+
function toUint8Array(raw) {
|
|
137
|
+
if (raw instanceof ArrayBuffer) {
|
|
138
|
+
return new Uint8Array(raw);
|
|
139
|
+
}
|
|
140
|
+
return new Uint8Array(raw.buffer, raw.byteOffset, raw.byteLength);
|
|
141
|
+
}
|
|
142
|
+
function concatUint8Arrays(chunks) {
|
|
143
|
+
const totalLength = chunks.reduce((sum, chunk) => sum + chunk.length, 0);
|
|
144
|
+
const output = new Uint8Array(totalLength);
|
|
145
|
+
let offset = 0;
|
|
146
|
+
for (const chunk of chunks) {
|
|
147
|
+
output.set(chunk, offset);
|
|
148
|
+
offset += chunk.length;
|
|
149
|
+
}
|
|
150
|
+
return output;
|
|
151
|
+
}
|
|
152
|
+
function readAndoRealtimeData(raw) {
|
|
153
|
+
if (typeof raw === "string") {
|
|
154
|
+
return raw;
|
|
155
|
+
}
|
|
156
|
+
if (raw instanceof ArrayBuffer) {
|
|
157
|
+
return TEXT_DECODER.decode(raw);
|
|
158
|
+
}
|
|
159
|
+
if (ArrayBuffer.isView(raw)) {
|
|
160
|
+
return TEXT_DECODER.decode(toUint8Array(raw));
|
|
161
|
+
}
|
|
162
|
+
if (Array.isArray(raw)) {
|
|
163
|
+
return TEXT_DECODER.decode(concatUint8Arrays(raw.filter((chunk) => chunk instanceof ArrayBuffer || ArrayBuffer.isView(chunk)).map((chunk) => toUint8Array(chunk))));
|
|
164
|
+
}
|
|
165
|
+
throw new Error("[ando-sdk] unsupported websocket payload");
|
|
166
|
+
}
|
|
167
|
+
function parseAndoRealtimeEvent(raw) {
|
|
168
|
+
try {
|
|
169
|
+
const data = readAndoRealtimeData(raw).trim();
|
|
170
|
+
if (!data) {
|
|
171
|
+
return null;
|
|
172
|
+
}
|
|
173
|
+
return JSON.parse(data);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function sendJson(socket, payload) {
|
|
180
|
+
if (socket.readyState !== SOCKET_OPEN) {
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
socket.send(JSON.stringify(payload));
|
|
184
|
+
}
|
|
185
|
+
function closeSocket(socket) {
|
|
186
|
+
if (socket.readyState === SOCKET_CONNECTING ||
|
|
187
|
+
socket.readyState === SOCKET_OPEN) {
|
|
188
|
+
socket.close();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function acknowledgeEvent(params) {
|
|
192
|
+
if (!params.ackId) {
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
sendJson(params.socket, {
|
|
196
|
+
_clientAck: params.ackId,
|
|
197
|
+
_room: params.roomId,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
async function openSocket(url, abortSignal, setup) {
|
|
201
|
+
if (abortSignal?.aborted) {
|
|
202
|
+
throw new Error("aborted");
|
|
203
|
+
}
|
|
204
|
+
const WebSocketConstructor = await getWebSocketConstructor();
|
|
205
|
+
const socket = new WebSocketConstructor(url);
|
|
206
|
+
if ("binaryType" in socket) {
|
|
207
|
+
socket.binaryType = "arraybuffer";
|
|
208
|
+
}
|
|
209
|
+
setup?.(socket);
|
|
210
|
+
await new Promise((resolve, reject) => {
|
|
211
|
+
const onRuntimeError = () => {
|
|
212
|
+
closeSocket(socket);
|
|
213
|
+
};
|
|
214
|
+
const onOpen = () => {
|
|
215
|
+
cleanup();
|
|
216
|
+
const removeRuntimeError = addSocketListener(socket, "error", onRuntimeError);
|
|
217
|
+
addSocketOnceListener(socket, "close", () => {
|
|
218
|
+
removeRuntimeError();
|
|
219
|
+
});
|
|
220
|
+
resolve();
|
|
221
|
+
};
|
|
222
|
+
const onError = (error) => {
|
|
223
|
+
cleanup();
|
|
224
|
+
reject(error instanceof Error
|
|
225
|
+
? error
|
|
226
|
+
: new Error("[ando-sdk] websocket error"));
|
|
227
|
+
};
|
|
228
|
+
const onUnexpectedResponse = (...args) => {
|
|
229
|
+
const response = args[1];
|
|
230
|
+
cleanup();
|
|
231
|
+
closeSocket(socket);
|
|
232
|
+
reject(createStatusError(`[ando-sdk] websocket upgrade failed: ${response?.statusCode ?? "unexpected response"}`, response?.statusCode));
|
|
233
|
+
};
|
|
234
|
+
const onClose = () => {
|
|
235
|
+
cleanup();
|
|
236
|
+
reject(new Error("[ando-sdk] websocket closed before open"));
|
|
237
|
+
};
|
|
238
|
+
const onAbort = () => {
|
|
239
|
+
cleanup();
|
|
240
|
+
socket.close();
|
|
241
|
+
reject(new Error("aborted"));
|
|
242
|
+
};
|
|
243
|
+
const cleanup = () => {
|
|
244
|
+
removeOpen();
|
|
245
|
+
removeError();
|
|
246
|
+
removeUnexpectedResponse();
|
|
247
|
+
removeClose();
|
|
248
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
249
|
+
};
|
|
250
|
+
const removeOpen = addSocketOnceListener(socket, "open", onOpen);
|
|
251
|
+
const removeError = addSocketOnceListener(socket, "error", onError);
|
|
252
|
+
const removeUnexpectedResponse = addSocketOnceListener(socket, "unexpected-response", onUnexpectedResponse);
|
|
253
|
+
const removeClose = addSocketOnceListener(socket, "close", onClose);
|
|
254
|
+
if (abortSignal?.aborted) {
|
|
255
|
+
onAbort();
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
259
|
+
});
|
|
260
|
+
return socket;
|
|
261
|
+
}
|
|
262
|
+
async function waitForSocketClose(socket, abortSignal) {
|
|
263
|
+
if (socket.readyState === SOCKET_CLOSING ||
|
|
264
|
+
socket.readyState === SOCKET_CLOSED) {
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
if (abortSignal?.aborted) {
|
|
268
|
+
socket.close();
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
await new Promise((resolve) => {
|
|
272
|
+
const onClose = () => {
|
|
273
|
+
cleanup();
|
|
274
|
+
resolve();
|
|
275
|
+
};
|
|
276
|
+
const onAbort = () => {
|
|
277
|
+
cleanup();
|
|
278
|
+
socket.close();
|
|
279
|
+
resolve();
|
|
280
|
+
};
|
|
281
|
+
const cleanup = () => {
|
|
282
|
+
removeClose();
|
|
283
|
+
abortSignal?.removeEventListener("abort", onAbort);
|
|
284
|
+
};
|
|
285
|
+
const removeClose = addSocketOnceListener(socket, "close", onClose);
|
|
286
|
+
if (socket.readyState === SOCKET_CLOSING ||
|
|
287
|
+
socket.readyState === SOCKET_CLOSED) {
|
|
288
|
+
cleanup();
|
|
289
|
+
resolve();
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
if (abortSignal?.aborted) {
|
|
293
|
+
onAbort();
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
abortSignal?.addEventListener("abort", onAbort, { once: true });
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
async function listAllMemberships(api, signal) {
|
|
300
|
+
const memberships = [];
|
|
301
|
+
let cursor;
|
|
302
|
+
do {
|
|
303
|
+
const response = await api.getMyMemberships({
|
|
304
|
+
limit: 200,
|
|
305
|
+
cursor,
|
|
306
|
+
signal,
|
|
307
|
+
});
|
|
308
|
+
memberships.push(...(response.items ?? []));
|
|
309
|
+
cursor = response.pageInfo?.hasNextPage
|
|
310
|
+
? response.pageInfo?.nextCursor
|
|
311
|
+
: undefined;
|
|
312
|
+
} while (cursor);
|
|
313
|
+
return memberships;
|
|
314
|
+
}
|
|
315
|
+
function updateConversationCache(conversations, memberships) {
|
|
316
|
+
conversations.clear();
|
|
317
|
+
for (const membership of memberships) {
|
|
318
|
+
conversations.set(membership.conversation.id, membership.conversation);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
let wsConstructorPromise = null;
|
|
322
|
+
async function getWebSocketConstructor() {
|
|
323
|
+
if (!isNodeRuntime() && typeof globalThis.WebSocket === "function") {
|
|
324
|
+
return globalThis.WebSocket;
|
|
325
|
+
}
|
|
326
|
+
wsConstructorPromise ?? (wsConstructorPromise = import("ws").then((module) => {
|
|
327
|
+
const ctor = module.default;
|
|
328
|
+
if (typeof ctor !== "function") {
|
|
329
|
+
throw new Error("[ando-sdk] websocket constructor unavailable");
|
|
330
|
+
}
|
|
331
|
+
return ctor;
|
|
332
|
+
}));
|
|
333
|
+
return wsConstructorPromise;
|
|
334
|
+
}
|
|
335
|
+
//# sourceMappingURL=realtime-runtime.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"realtime-runtime.js","sourceRoot":"","sources":["../src/realtime-runtime.ts"],"names":[],"mappings":"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"}
|