@syncular/testkit 0.1.2 → 0.2.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.
- package/README.md +210 -0
- package/dist/client.d.ts +68 -0
- package/dist/client.js +145 -0
- package/dist/clock.d.ts +24 -0
- package/dist/clock.js +32 -0
- package/dist/create-test-sync.d.ts +67 -0
- package/dist/create-test-sync.js +90 -0
- package/dist/faults.d.ts +52 -50
- package/dist/faults.js +74 -192
- package/dist/index.d.ts +17 -15
- package/dist/index.js +18 -15
- package/dist/react.d.ts +10 -0
- package/dist/react.js +41 -0
- package/dist/server.d.ts +44 -0
- package/dist/server.js +68 -0
- package/package.json +52 -29
- package/src/client.ts +218 -0
- package/src/clock.ts +45 -0
- package/src/create-test-sync.ts +158 -0
- package/src/faults.ts +77 -338
- package/src/index.ts +44 -14
- package/src/react.ts +46 -0
- package/src/server.ts +102 -0
- package/dist/audit.d.ts +0 -22
- package/dist/audit.d.ts.map +0 -1
- package/dist/audit.js +0 -40
- package/dist/audit.js.map +0 -1
- package/dist/client-bridge.d.ts +0 -77
- package/dist/client-bridge.d.ts.map +0 -1
- package/dist/client-bridge.js +0 -540
- package/dist/client-bridge.js.map +0 -1
- package/dist/deterministic.d.ts +0 -31
- package/dist/deterministic.d.ts.map +0 -1
- package/dist/deterministic.js +0 -69
- package/dist/deterministic.js.map +0 -1
- package/dist/disposable.d.ts +0 -10
- package/dist/disposable.d.ts.map +0 -1
- package/dist/disposable.js +0 -28
- package/dist/disposable.js.map +0 -1
- package/dist/faults.d.ts.map +0 -1
- package/dist/faults.js.map +0 -1
- package/dist/hono-node-server.d.ts +0 -20
- package/dist/hono-node-server.d.ts.map +0 -1
- package/dist/hono-node-server.js +0 -90
- package/dist/hono-node-server.js.map +0 -1
- package/dist/http-fixtures.d.ts +0 -32
- package/dist/http-fixtures.d.ts.map +0 -1
- package/dist/http-fixtures.js +0 -117
- package/dist/http-fixtures.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/project-scoped-tasks.d.ts +0 -40
- package/dist/project-scoped-tasks.d.ts.map +0 -1
- package/dist/project-scoped-tasks.js +0 -247
- package/dist/project-scoped-tasks.js.map +0 -1
- package/dist/realtime-ws.d.ts +0 -48
- package/dist/realtime-ws.d.ts.map +0 -1
- package/dist/realtime-ws.js +0 -203
- package/dist/realtime-ws.js.map +0 -1
- package/dist/runtime-process.d.ts +0 -14
- package/dist/runtime-process.d.ts.map +0 -1
- package/dist/runtime-process.js +0 -99
- package/dist/runtime-process.js.map +0 -1
- package/dist/sync-builders.d.ts +0 -48
- package/dist/sync-builders.d.ts.map +0 -1
- package/dist/sync-builders.js +0 -66
- package/dist/sync-builders.js.map +0 -1
- package/dist/sync-http.d.ts +0 -48
- package/dist/sync-http.d.ts.map +0 -1
- package/dist/sync-http.js +0 -43
- package/dist/sync-http.js.map +0 -1
- package/dist/sync-parse.d.ts +0 -8
- package/dist/sync-parse.d.ts.map +0 -1
- package/dist/sync-parse.js +0 -38
- package/dist/sync-parse.js.map +0 -1
- package/dist/sync-response.d.ts +0 -6
- package/dist/sync-response.d.ts.map +0 -1
- package/dist/sync-response.js +0 -19
- package/dist/sync-response.js.map +0 -1
- package/src/audit.ts +0 -74
- package/src/client-bridge.ts +0 -841
- package/src/deterministic.ts +0 -121
- package/src/disposable.ts +0 -50
- package/src/hono-node-server.ts +0 -144
- package/src/http-fixtures.ts +0 -187
- package/src/project-scoped-tasks.ts +0 -351
- package/src/realtime-ws.ts +0 -354
- package/src/runtime-process.ts +0 -159
- package/src/sync-builders.ts +0 -136
- package/src/sync-http.ts +0 -117
- package/src/sync-parse.ts +0 -86
- package/src/sync-response.ts +0 -43
|
@@ -1,247 +0,0 @@
|
|
|
1
|
-
import { isRecord, } from '@syncular/core';
|
|
2
|
-
import { sql } from 'kysely';
|
|
3
|
-
export const PROJECT_SCOPED_TASKS_DDL = `
|
|
4
|
-
CREATE TABLE IF NOT EXISTS tasks (
|
|
5
|
-
id TEXT PRIMARY KEY,
|
|
6
|
-
title TEXT NOT NULL DEFAULT '',
|
|
7
|
-
completed INTEGER NOT NULL DEFAULT 0,
|
|
8
|
-
user_id TEXT NOT NULL,
|
|
9
|
-
project_id TEXT NOT NULL,
|
|
10
|
-
server_version INTEGER NOT NULL DEFAULT 1
|
|
11
|
-
)
|
|
12
|
-
`;
|
|
13
|
-
function parseProjectScopedTaskPayload(payload) {
|
|
14
|
-
if (!isRecord(payload)) {
|
|
15
|
-
return {};
|
|
16
|
-
}
|
|
17
|
-
return {
|
|
18
|
-
title: typeof payload.title === 'string' ? payload.title : undefined,
|
|
19
|
-
completed: typeof payload.completed === 'number' ? payload.completed : undefined,
|
|
20
|
-
project_id: typeof payload.project_id === 'string' ? payload.project_id : undefined,
|
|
21
|
-
};
|
|
22
|
-
}
|
|
23
|
-
export async function ensureProjectScopedTasksTable(db) {
|
|
24
|
-
await sql.raw(PROJECT_SCOPED_TASKS_DDL).execute(db);
|
|
25
|
-
}
|
|
26
|
-
export function createProjectScopedTasksHandler(options = {}) {
|
|
27
|
-
const projectScopeCount = Math.max(1, options.projectScopeCount ?? 100);
|
|
28
|
-
return {
|
|
29
|
-
table: 'tasks',
|
|
30
|
-
scopePatterns: ['user:{user_id}:project:{project_id}'],
|
|
31
|
-
async resolveScopes(ctx) {
|
|
32
|
-
return {
|
|
33
|
-
user_id: ctx.actorId,
|
|
34
|
-
project_id: Array.from({ length: projectScopeCount }, (_, index) => `p${index}`),
|
|
35
|
-
};
|
|
36
|
-
},
|
|
37
|
-
extractScopes(row) {
|
|
38
|
-
return {
|
|
39
|
-
user_id: String(row.user_id ?? ''),
|
|
40
|
-
project_id: String(row.project_id ?? ''),
|
|
41
|
-
};
|
|
42
|
-
},
|
|
43
|
-
async snapshot(ctx) {
|
|
44
|
-
const userIdValue = ctx.scopeValues.user_id;
|
|
45
|
-
const projectIdValue = ctx.scopeValues.project_id;
|
|
46
|
-
const userId = Array.isArray(userIdValue) ? userIdValue[0] : userIdValue;
|
|
47
|
-
const projectId = Array.isArray(projectIdValue)
|
|
48
|
-
? projectIdValue[0]
|
|
49
|
-
: projectIdValue;
|
|
50
|
-
if (!userId || userId !== ctx.actorId) {
|
|
51
|
-
return { rows: [], nextCursor: null };
|
|
52
|
-
}
|
|
53
|
-
if (!projectId) {
|
|
54
|
-
return { rows: [], nextCursor: null };
|
|
55
|
-
}
|
|
56
|
-
const pageSize = Math.max(1, Math.min(10_000, ctx.limit));
|
|
57
|
-
const cursor = ctx.cursor;
|
|
58
|
-
const cursorFilter = cursor && cursor.length > 0
|
|
59
|
-
? sql `and ${sql.ref('id')} > ${sql.val(cursor)}`
|
|
60
|
-
: sql ``;
|
|
61
|
-
const result = await sql `
|
|
62
|
-
select id, title, completed, user_id, project_id, server_version
|
|
63
|
-
from tasks
|
|
64
|
-
where user_id = ${sql.val(userId)}
|
|
65
|
-
and project_id = ${sql.val(projectId)}
|
|
66
|
-
${cursorFilter}
|
|
67
|
-
order by id asc
|
|
68
|
-
limit ${sql.val(pageSize + 1)}
|
|
69
|
-
`.execute(ctx.db);
|
|
70
|
-
const rows = result.rows;
|
|
71
|
-
const hasMore = rows.length > pageSize;
|
|
72
|
-
const pageRows = hasMore ? rows.slice(0, pageSize) : rows;
|
|
73
|
-
const nextCursor = hasMore
|
|
74
|
-
? (pageRows[pageRows.length - 1]?.id ?? null)
|
|
75
|
-
: null;
|
|
76
|
-
return {
|
|
77
|
-
rows: pageRows,
|
|
78
|
-
nextCursor: typeof nextCursor === 'string' && nextCursor.length > 0
|
|
79
|
-
? nextCursor
|
|
80
|
-
: null,
|
|
81
|
-
};
|
|
82
|
-
},
|
|
83
|
-
async applyOperation(ctx, op, opIndex) {
|
|
84
|
-
if (op.table !== 'tasks') {
|
|
85
|
-
return {
|
|
86
|
-
result: {
|
|
87
|
-
opIndex,
|
|
88
|
-
status: 'error',
|
|
89
|
-
error: `Unknown table: ${op.table}`,
|
|
90
|
-
code: 'sync.unknown_table',
|
|
91
|
-
retriable: false,
|
|
92
|
-
},
|
|
93
|
-
emittedChanges: [],
|
|
94
|
-
};
|
|
95
|
-
}
|
|
96
|
-
if (op.op === 'delete') {
|
|
97
|
-
const existingResult = await sql `
|
|
98
|
-
select id, project_id from tasks
|
|
99
|
-
where id = ${sql.val(op.row_id)} and user_id = ${sql.val(ctx.actorId)}
|
|
100
|
-
limit 1
|
|
101
|
-
`.execute(ctx.trx);
|
|
102
|
-
const existing = existingResult.rows[0];
|
|
103
|
-
if (!existing) {
|
|
104
|
-
return { result: { opIndex, status: 'applied' }, emittedChanges: [] };
|
|
105
|
-
}
|
|
106
|
-
await sql `
|
|
107
|
-
delete from tasks
|
|
108
|
-
where id = ${sql.val(op.row_id)} and user_id = ${sql.val(ctx.actorId)}
|
|
109
|
-
`.execute(ctx.trx);
|
|
110
|
-
const emitted = {
|
|
111
|
-
table: 'tasks',
|
|
112
|
-
row_id: op.row_id,
|
|
113
|
-
op: 'delete',
|
|
114
|
-
row_json: null,
|
|
115
|
-
row_version: null,
|
|
116
|
-
scopes: { user_id: ctx.actorId, project_id: existing.project_id },
|
|
117
|
-
};
|
|
118
|
-
return {
|
|
119
|
-
result: { opIndex, status: 'applied' },
|
|
120
|
-
emittedChanges: [emitted],
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
const payload = parseProjectScopedTaskPayload(op.payload);
|
|
124
|
-
const existingResult = await sql `
|
|
125
|
-
select id, title, completed, project_id, server_version
|
|
126
|
-
from tasks
|
|
127
|
-
where id = ${sql.val(op.row_id)} and user_id = ${sql.val(ctx.actorId)}
|
|
128
|
-
limit 1
|
|
129
|
-
`.execute(ctx.trx);
|
|
130
|
-
const existing = existingResult.rows[0];
|
|
131
|
-
if (existing &&
|
|
132
|
-
op.base_version != null &&
|
|
133
|
-
existing.server_version !== op.base_version) {
|
|
134
|
-
return {
|
|
135
|
-
result: {
|
|
136
|
-
opIndex,
|
|
137
|
-
status: 'conflict',
|
|
138
|
-
message: `Version conflict: server=${existing.server_version}, base=${op.base_version}`,
|
|
139
|
-
code: 'sync.version_conflict',
|
|
140
|
-
server_version: existing.server_version,
|
|
141
|
-
server_row: {
|
|
142
|
-
id: existing.id,
|
|
143
|
-
title: existing.title,
|
|
144
|
-
completed: existing.completed,
|
|
145
|
-
user_id: ctx.actorId,
|
|
146
|
-
project_id: existing.project_id,
|
|
147
|
-
server_version: existing.server_version,
|
|
148
|
-
},
|
|
149
|
-
},
|
|
150
|
-
emittedChanges: [],
|
|
151
|
-
};
|
|
152
|
-
}
|
|
153
|
-
const projectId = payload.project_id ?? existing?.project_id;
|
|
154
|
-
if (!projectId) {
|
|
155
|
-
return {
|
|
156
|
-
result: {
|
|
157
|
-
opIndex,
|
|
158
|
-
status: 'error',
|
|
159
|
-
error: 'Missing project id',
|
|
160
|
-
code: 'sync.invalid_request',
|
|
161
|
-
retriable: false,
|
|
162
|
-
},
|
|
163
|
-
emittedChanges: [],
|
|
164
|
-
};
|
|
165
|
-
}
|
|
166
|
-
if (existing) {
|
|
167
|
-
const nextVersion = existing.server_version + 1;
|
|
168
|
-
await sql `
|
|
169
|
-
update tasks set
|
|
170
|
-
title = ${sql.val(payload.title ?? existing.title)},
|
|
171
|
-
completed = ${sql.val(payload.completed ?? existing.completed)},
|
|
172
|
-
server_version = ${sql.val(nextVersion)}
|
|
173
|
-
where id = ${sql.val(op.row_id)} and user_id = ${sql.val(ctx.actorId)}
|
|
174
|
-
`.execute(ctx.trx);
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
await sql `
|
|
178
|
-
insert into tasks (id, title, completed, user_id, project_id, server_version)
|
|
179
|
-
values (
|
|
180
|
-
${sql.val(op.row_id)},
|
|
181
|
-
${sql.val(payload.title ?? '')},
|
|
182
|
-
${sql.val(payload.completed ?? 0)},
|
|
183
|
-
${sql.val(ctx.actorId)},
|
|
184
|
-
${sql.val(projectId)},
|
|
185
|
-
${sql.val(1)}
|
|
186
|
-
)
|
|
187
|
-
`.execute(ctx.trx);
|
|
188
|
-
}
|
|
189
|
-
const updatedResult = await sql `
|
|
190
|
-
select id, title, completed, user_id, project_id, server_version
|
|
191
|
-
from tasks
|
|
192
|
-
where id = ${sql.val(op.row_id)} and user_id = ${sql.val(ctx.actorId)}
|
|
193
|
-
limit 1
|
|
194
|
-
`.execute(ctx.trx);
|
|
195
|
-
const updated = updatedResult.rows[0];
|
|
196
|
-
if (!updated) {
|
|
197
|
-
throw new Error('TASKS_ROW_NOT_FOUND');
|
|
198
|
-
}
|
|
199
|
-
const emitted = {
|
|
200
|
-
table: 'tasks',
|
|
201
|
-
row_id: op.row_id,
|
|
202
|
-
op: 'upsert',
|
|
203
|
-
row_json: {
|
|
204
|
-
id: updated.id,
|
|
205
|
-
title: updated.title,
|
|
206
|
-
completed: updated.completed,
|
|
207
|
-
user_id: updated.user_id,
|
|
208
|
-
project_id: updated.project_id,
|
|
209
|
-
server_version: updated.server_version,
|
|
210
|
-
},
|
|
211
|
-
row_version: updated.server_version,
|
|
212
|
-
scopes: { user_id: ctx.actorId, project_id: updated.project_id },
|
|
213
|
-
};
|
|
214
|
-
return {
|
|
215
|
-
result: { opIndex, status: 'applied' },
|
|
216
|
-
emittedChanges: [emitted],
|
|
217
|
-
};
|
|
218
|
-
},
|
|
219
|
-
};
|
|
220
|
-
}
|
|
221
|
-
export function createProjectScopedTasksSubscription(options) {
|
|
222
|
-
return {
|
|
223
|
-
id: options.id ?? 'sub-tasks',
|
|
224
|
-
table: 'tasks',
|
|
225
|
-
scopes: {
|
|
226
|
-
user_id: options.userId,
|
|
227
|
-
project_id: options.projectId ?? 'p0',
|
|
228
|
-
},
|
|
229
|
-
cursor: options.cursor ?? 0,
|
|
230
|
-
bootstrapState: null,
|
|
231
|
-
crdtStateVectors: [],
|
|
232
|
-
};
|
|
233
|
-
}
|
|
234
|
-
export function createProjectScopedTaskUpsertOperation(options) {
|
|
235
|
-
return {
|
|
236
|
-
table: 'tasks',
|
|
237
|
-
row_id: options.taskId,
|
|
238
|
-
op: 'upsert',
|
|
239
|
-
payload: {
|
|
240
|
-
title: options.title,
|
|
241
|
-
completed: options.completed ?? 0,
|
|
242
|
-
project_id: options.projectId ?? 'p0',
|
|
243
|
-
},
|
|
244
|
-
base_version: options.baseVersion ?? null,
|
|
245
|
-
};
|
|
246
|
-
}
|
|
247
|
-
//# sourceMappingURL=project-scoped-tasks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"project-scoped-tasks.js","sourceRoot":"","sources":["../src/project-scoped-tasks.ts"],"names":[],"mappings":"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"}
|
package/dist/realtime-ws.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { type AsyncDisposableResource, type ResourceRunner } from './disposable';
|
|
2
|
-
export type RealtimeWsQueryValue = string | number | boolean | null | undefined;
|
|
3
|
-
export interface CreateRealtimeWsUrlOptions {
|
|
4
|
-
baseUrl: string;
|
|
5
|
-
clientId: string;
|
|
6
|
-
actorId: string;
|
|
7
|
-
actorQueryParam?: string;
|
|
8
|
-
path?: string;
|
|
9
|
-
query?: Record<string, RealtimeWsQueryValue>;
|
|
10
|
-
}
|
|
11
|
-
export interface WebSocketConstructor {
|
|
12
|
-
new (url: string, protocols?: string | string[]): WebSocket;
|
|
13
|
-
}
|
|
14
|
-
export interface OpenRealtimeWsOptions extends CreateRealtimeWsUrlOptions {
|
|
15
|
-
WebSocketCtor?: WebSocketConstructor;
|
|
16
|
-
protocols?: string | string[];
|
|
17
|
-
}
|
|
18
|
-
export interface OpenRealtimeWsResourceOptions extends OpenRealtimeWsOptions {
|
|
19
|
-
waitForOpen?: boolean;
|
|
20
|
-
openTimeoutMs?: number;
|
|
21
|
-
close?: CloseWsSafeOptions;
|
|
22
|
-
}
|
|
23
|
-
export declare function createRealtimeWsUrl(options: CreateRealtimeWsUrlOptions): string;
|
|
24
|
-
export declare function openRealtimeWs(options: OpenRealtimeWsOptions): WebSocket;
|
|
25
|
-
export interface WaitForWsOpenOptions {
|
|
26
|
-
timeoutMs?: number;
|
|
27
|
-
}
|
|
28
|
-
export declare function waitForWsOpen(ws: WebSocket, options?: WaitForWsOpenOptions): Promise<void>;
|
|
29
|
-
export interface WaitForWsMessageOptions {
|
|
30
|
-
timeoutMs?: number;
|
|
31
|
-
predicate?: (event: MessageEvent) => boolean;
|
|
32
|
-
}
|
|
33
|
-
export declare function waitForWsMessage(ws: WebSocket, options?: WaitForWsMessageOptions): Promise<MessageEvent>;
|
|
34
|
-
export declare function parseWsJsonMessage(event: MessageEvent): Record<string, unknown> | null;
|
|
35
|
-
export interface WaitForWsJsonMessageOptions {
|
|
36
|
-
timeoutMs?: number;
|
|
37
|
-
predicate?: (message: Record<string, unknown>) => boolean;
|
|
38
|
-
}
|
|
39
|
-
export declare function waitForWsJsonMessage(ws: WebSocket, options?: WaitForWsJsonMessageOptions): Promise<Record<string, unknown>>;
|
|
40
|
-
export interface CloseWsSafeOptions {
|
|
41
|
-
code?: number;
|
|
42
|
-
reason?: string;
|
|
43
|
-
timeoutMs?: number;
|
|
44
|
-
}
|
|
45
|
-
export declare function closeWsSafe(ws: WebSocket, options?: CloseWsSafeOptions): Promise<void>;
|
|
46
|
-
export declare function openRealtimeWsResource(options: OpenRealtimeWsResourceOptions): Promise<AsyncDisposableResource<WebSocket>>;
|
|
47
|
-
export declare function withRealtimeWs<TResult>(options: OpenRealtimeWsResourceOptions, run: ResourceRunner<WebSocket, TResult>): Promise<TResult>;
|
|
48
|
-
//# sourceMappingURL=realtime-ws.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-ws.d.ts","sourceRoot":"","sources":["../src/realtime-ws.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,uBAAuB,EAE5B,KAAK,cAAc,EAEpB,MAAM,cAAc,CAAC;AAEtB,MAAM,MAAM,oBAAoB,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,GAAG,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7D;AAED,MAAM,WAAW,qBAAsB,SAAQ,0BAA0B;IACvE,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,6BAA8B,SAAQ,qBAAqB;IAC1E,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AA0BD,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,0BAA0B,GAClC,MAAM,CAgBR;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,qBAAqB,GAAG,SAAS,CAOxE;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,aAAa,CAC3B,EAAE,EAAE,SAAS,EACb,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,OAAO,CAAC;CAC9C;AAED,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,SAAS,EACb,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,YAAY,CAAC,CA6CvB;AAoBD,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,YAAY,GAClB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAYhC;AAED,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC;CAC3D;AAED,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,SAAS,EACb,OAAO,GAAE,2BAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAoDlC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAKD,wBAAsB,WAAW,CAC/B,EAAE,EAAE,SAAS,EACb,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC,CAU7C;AAED,wBAAsB,cAAc,CAAC,OAAO,EAC1C,OAAO,EAAE,6BAA6B,EACtC,GAAG,EAAE,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,GACtC,OAAO,CAAC,OAAO,CAAC,CAElB"}
|
package/dist/realtime-ws.js
DELETED
|
@@ -1,203 +0,0 @@
|
|
|
1
|
-
import { isRecord } from '@syncular/core';
|
|
2
|
-
import { createAsyncDisposableResource, withAsyncDisposableFactory, } from './disposable.js';
|
|
3
|
-
function appendQueryParam(url, key, value) {
|
|
4
|
-
if (value === null || value === undefined) {
|
|
5
|
-
return;
|
|
6
|
-
}
|
|
7
|
-
url.searchParams.set(key, String(value));
|
|
8
|
-
}
|
|
9
|
-
function toWsProtocol(protocol) {
|
|
10
|
-
if (protocol === 'http:') {
|
|
11
|
-
return 'ws:';
|
|
12
|
-
}
|
|
13
|
-
if (protocol === 'https:') {
|
|
14
|
-
return 'wss:';
|
|
15
|
-
}
|
|
16
|
-
return protocol;
|
|
17
|
-
}
|
|
18
|
-
export function createRealtimeWsUrl(options) {
|
|
19
|
-
const url = new URL(options.baseUrl);
|
|
20
|
-
url.protocol = toWsProtocol(url.protocol);
|
|
21
|
-
const path = options.path ?? '/sync/realtime';
|
|
22
|
-
url.pathname = path.startsWith('/') ? path : `/${path}`;
|
|
23
|
-
url.search = '';
|
|
24
|
-
appendQueryParam(url, 'clientId', options.clientId);
|
|
25
|
-
appendQueryParam(url, options.actorQueryParam ?? 'userId', options.actorId);
|
|
26
|
-
for (const [key, value] of Object.entries(options.query ?? {})) {
|
|
27
|
-
appendQueryParam(url, key, value);
|
|
28
|
-
}
|
|
29
|
-
return url.toString();
|
|
30
|
-
}
|
|
31
|
-
export function openRealtimeWs(options) {
|
|
32
|
-
const WebSocketCtor = options.WebSocketCtor ?? globalThis.WebSocket;
|
|
33
|
-
if (!WebSocketCtor) {
|
|
34
|
-
throw new Error('WebSocket constructor is unavailable in this runtime');
|
|
35
|
-
}
|
|
36
|
-
return new WebSocketCtor(createRealtimeWsUrl(options), options.protocols);
|
|
37
|
-
}
|
|
38
|
-
export function waitForWsOpen(ws, options = {}) {
|
|
39
|
-
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
40
|
-
return new Promise((resolve, reject) => {
|
|
41
|
-
const cleanup = () => {
|
|
42
|
-
clearTimeout(timeout);
|
|
43
|
-
ws.removeEventListener('open', onOpen);
|
|
44
|
-
ws.removeEventListener('error', onError);
|
|
45
|
-
ws.removeEventListener('close', onClose);
|
|
46
|
-
};
|
|
47
|
-
const onOpen = () => {
|
|
48
|
-
cleanup();
|
|
49
|
-
resolve();
|
|
50
|
-
};
|
|
51
|
-
const onError = () => {
|
|
52
|
-
cleanup();
|
|
53
|
-
reject(new Error('WebSocket emitted an error before opening'));
|
|
54
|
-
};
|
|
55
|
-
const onClose = (event) => {
|
|
56
|
-
cleanup();
|
|
57
|
-
reject(new Error(`WebSocket closed before opening (code=${event.code} reason=${event.reason || 'none'})`));
|
|
58
|
-
};
|
|
59
|
-
const timeout = setTimeout(() => {
|
|
60
|
-
cleanup();
|
|
61
|
-
reject(new Error(`Timed out waiting for WebSocket open (${timeoutMs}ms)`));
|
|
62
|
-
}, timeoutMs);
|
|
63
|
-
ws.addEventListener('open', onOpen);
|
|
64
|
-
ws.addEventListener('error', onError);
|
|
65
|
-
ws.addEventListener('close', onClose);
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
export function waitForWsMessage(ws, options = {}) {
|
|
69
|
-
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
70
|
-
return new Promise((resolve, reject) => {
|
|
71
|
-
const cleanup = () => {
|
|
72
|
-
clearTimeout(timeout);
|
|
73
|
-
ws.removeEventListener('message', onMessage);
|
|
74
|
-
ws.removeEventListener('error', onError);
|
|
75
|
-
ws.removeEventListener('close', onClose);
|
|
76
|
-
};
|
|
77
|
-
const onMessage = (event) => {
|
|
78
|
-
if (options.predicate && !options.predicate(event)) {
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
cleanup();
|
|
82
|
-
resolve(event);
|
|
83
|
-
};
|
|
84
|
-
const onError = () => {
|
|
85
|
-
cleanup();
|
|
86
|
-
reject(new Error('WebSocket emitted an error before a message arrived'));
|
|
87
|
-
};
|
|
88
|
-
const onClose = (event) => {
|
|
89
|
-
cleanup();
|
|
90
|
-
reject(new Error(`WebSocket closed before receiving a matching message (code=${event.code} reason=${event.reason || 'none'})`));
|
|
91
|
-
};
|
|
92
|
-
const timeout = setTimeout(() => {
|
|
93
|
-
cleanup();
|
|
94
|
-
reject(new Error(`Timed out waiting for WebSocket message (${timeoutMs}ms)`));
|
|
95
|
-
}, timeoutMs);
|
|
96
|
-
ws.addEventListener('message', onMessage);
|
|
97
|
-
ws.addEventListener('error', onError);
|
|
98
|
-
ws.addEventListener('close', onClose);
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
function readTextPayload(data) {
|
|
102
|
-
if (typeof data === 'string') {
|
|
103
|
-
return data;
|
|
104
|
-
}
|
|
105
|
-
if (data instanceof ArrayBuffer) {
|
|
106
|
-
return new TextDecoder().decode(new Uint8Array(data));
|
|
107
|
-
}
|
|
108
|
-
if (ArrayBuffer.isView(data)) {
|
|
109
|
-
return new TextDecoder().decode(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
|
|
110
|
-
}
|
|
111
|
-
return null;
|
|
112
|
-
}
|
|
113
|
-
export function parseWsJsonMessage(event) {
|
|
114
|
-
const payload = readTextPayload(event.data);
|
|
115
|
-
if (!payload) {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
try {
|
|
119
|
-
const parsed = JSON.parse(payload);
|
|
120
|
-
return isRecord(parsed) ? parsed : null;
|
|
121
|
-
}
|
|
122
|
-
catch {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
export function waitForWsJsonMessage(ws, options = {}) {
|
|
127
|
-
const timeoutMs = options.timeoutMs ?? 10_000;
|
|
128
|
-
return new Promise((resolve, reject) => {
|
|
129
|
-
const cleanup = () => {
|
|
130
|
-
clearTimeout(timeout);
|
|
131
|
-
ws.removeEventListener('message', onMessage);
|
|
132
|
-
ws.removeEventListener('error', onError);
|
|
133
|
-
ws.removeEventListener('close', onClose);
|
|
134
|
-
};
|
|
135
|
-
const onMessage = (event) => {
|
|
136
|
-
const parsed = parseWsJsonMessage(event);
|
|
137
|
-
if (!parsed) {
|
|
138
|
-
return;
|
|
139
|
-
}
|
|
140
|
-
if (options.predicate && !options.predicate(parsed)) {
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
cleanup();
|
|
144
|
-
resolve(parsed);
|
|
145
|
-
};
|
|
146
|
-
const onError = () => {
|
|
147
|
-
cleanup();
|
|
148
|
-
reject(new Error('WebSocket emitted an error before JSON message'));
|
|
149
|
-
};
|
|
150
|
-
const onClose = (event) => {
|
|
151
|
-
cleanup();
|
|
152
|
-
reject(new Error(`WebSocket closed before receiving JSON message (code=${event.code} reason=${event.reason || 'none'})`));
|
|
153
|
-
};
|
|
154
|
-
const timeout = setTimeout(() => {
|
|
155
|
-
cleanup();
|
|
156
|
-
reject(new Error(`Timed out waiting for WebSocket JSON message (${timeoutMs}ms)`));
|
|
157
|
-
}, timeoutMs);
|
|
158
|
-
ws.addEventListener('message', onMessage);
|
|
159
|
-
ws.addEventListener('error', onError);
|
|
160
|
-
ws.addEventListener('close', onClose);
|
|
161
|
-
});
|
|
162
|
-
}
|
|
163
|
-
const WS_CLOSING = 2;
|
|
164
|
-
const WS_CLOSED = 3;
|
|
165
|
-
export async function closeWsSafe(ws, options = {}) {
|
|
166
|
-
if (ws.readyState === WS_CLOSED) {
|
|
167
|
-
return;
|
|
168
|
-
}
|
|
169
|
-
const timeoutMs = options.timeoutMs ?? 2_000;
|
|
170
|
-
await new Promise((resolve) => {
|
|
171
|
-
const cleanup = () => {
|
|
172
|
-
clearTimeout(timeout);
|
|
173
|
-
ws.removeEventListener('close', onClose);
|
|
174
|
-
resolve();
|
|
175
|
-
};
|
|
176
|
-
const onClose = () => {
|
|
177
|
-
cleanup();
|
|
178
|
-
};
|
|
179
|
-
const timeout = setTimeout(() => {
|
|
180
|
-
cleanup();
|
|
181
|
-
}, timeoutMs);
|
|
182
|
-
ws.addEventListener('close', onClose);
|
|
183
|
-
if (ws.readyState !== WS_CLOSING) {
|
|
184
|
-
try {
|
|
185
|
-
ws.close(options.code, options.reason);
|
|
186
|
-
}
|
|
187
|
-
catch {
|
|
188
|
-
cleanup();
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
}
|
|
193
|
-
export async function openRealtimeWsResource(options) {
|
|
194
|
-
const ws = openRealtimeWs(options);
|
|
195
|
-
if (options.waitForOpen) {
|
|
196
|
-
await waitForWsOpen(ws, { timeoutMs: options.openTimeoutMs });
|
|
197
|
-
}
|
|
198
|
-
return createAsyncDisposableResource(ws, () => closeWsSafe(ws, options.close));
|
|
199
|
-
}
|
|
200
|
-
export async function withRealtimeWs(options, run) {
|
|
201
|
-
return withAsyncDisposableFactory(() => openRealtimeWsResource(options), run);
|
|
202
|
-
}
|
|
203
|
-
//# sourceMappingURL=realtime-ws.js.map
|
package/dist/realtime-ws.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"realtime-ws.js","sourceRoot":"","sources":["../src/realtime-ws.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAEL,6BAA6B,EAE7B,0BAA0B,GAC3B,MAAM,cAAc,CAAC;AA4BtB,SAAS,gBAAgB,CACvB,GAAQ,EACR,GAAW,EACX,KAA2B;IAE3B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO;IACT,CAAC;IAED,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAmC;IAEnC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrC,GAAG,CAAC,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,gBAAgB,CAAC;IAC9C,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACxD,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC;IAEhB,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpD,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,eAAe,IAAI,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAE5E,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IACpC,CAAC;IAED,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAA8B;IAC3D,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,UAAU,CAAC,SAAS,CAAC;IACpE,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,IAAI,aAAa,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;AAC5E,CAAC;AAMD,MAAM,UAAU,aAAa,CAC3B,EAAa,EACb,OAAO,GAAyB,EAAE;IAElC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,EAAE,CAAC,mBAAmB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;YACvC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,OAAO,EAAE,CAAC;YACV,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC,CAAC;QACjE,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;YACpC,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,KAAK,CACP,yCAAyC,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG,CACxF,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,KAAK,CAAC,yCAAyC,SAAS,KAAK,CAAC,CACnE,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACpC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAOD,MAAM,UAAU,gBAAgB,CAC9B,EAAa,EACb,OAAO,GAA4B,EAAE;IAErC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,OAAO,IAAI,OAAO,CAAe,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACnD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7C,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;YACxC,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC;gBACnD,OAAO;YACT,CAAC;YAED,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;YACpC,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,KAAK,CACP,8DAA8D,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG,CAC7G,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,KAAK,CAAC,4CAA4C,SAAS,KAAK,CAAC,CACtE,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,IAA0B;IACjD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,IAAI,YAAY,WAAW,EAAE,CAAC;QAChC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7B,IAAI,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAC9D,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,KAAmB;IAEnB,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAOD,MAAM,UAAU,oBAAoB,CAClC,EAAa,EACb,OAAO,GAAgC,EAAE;IAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,MAAM,CAAC;IAE9C,OAAO,IAAI,OAAO,CAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9D,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,EAAE,CAAC,mBAAmB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC7C,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,CAAC,CAAC;QAEF,MAAM,SAAS,GAAG,CAAC,KAAmB,EAAE,EAAE;YACxC,MAAM,MAAM,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,OAAO;YACT,CAAC;YAED,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC;gBACpD,OAAO;YACT,CAAC;YAED,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC,CAAC;QACtE,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,CAAC,KAAiB,EAAE,EAAE;YACpC,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,KAAK,CACP,wDAAwD,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,MAAM,IAAI,MAAM,GAAG,CACvG,CACF,CAAC;QACJ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,MAAM,CACJ,IAAI,KAAK,CACP,iDAAiD,SAAS,KAAK,CAChE,CACF,CAAC;QACJ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,EAAE,CAAC,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC1C,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;AACL,CAAC;AAQD,MAAM,UAAU,GAAG,CAAC,CAAC;AACrB,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,EAAa,EACb,OAAO,GAAuB,EAAE;IAEhC,IAAI,EAAE,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO;IACT,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,KAAK,CAAC;IAE7C,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,OAAO,CAAC,CAAC;YACtB,EAAE,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACzC,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,EAAE,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAEtC,IAAI,EAAE,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;YACjC,IAAI,CAAC;gBACH,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAsC;IAEtC,MAAM,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;IAEnC,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,aAAa,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,OAAO,6BAA6B,CAAC,EAAE,EAAE,GAAG,EAAE,CAC5C,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,OAAsC,EACtC,GAAuC;IAEvC,OAAO,0BAA0B,CAAC,GAAG,EAAE,CAAC,sBAAsB,CAAC,OAAO,CAAC,EAAE,GAAG,CAAC,CAAC;AAChF,CAAC"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import type { ChildProcess } from 'node:child_process';
|
|
2
|
-
import { type AsyncDisposableResource, type ResourceRunner } from './disposable';
|
|
3
|
-
export interface WaitForJsonPortOptions {
|
|
4
|
-
timeoutMs?: number;
|
|
5
|
-
processName?: string;
|
|
6
|
-
}
|
|
7
|
-
export declare function waitForJsonPortFromStdout(process: ChildProcess, options?: WaitForJsonPortOptions): Promise<number>;
|
|
8
|
-
export interface StopChildProcessOptions {
|
|
9
|
-
gracePeriodMs?: number;
|
|
10
|
-
}
|
|
11
|
-
export declare function stopChildProcess(process: ChildProcess, options?: StopChildProcessOptions): Promise<void>;
|
|
12
|
-
export declare function createChildProcessResource(process: ChildProcess, options?: StopChildProcessOptions): AsyncDisposableResource<ChildProcess>;
|
|
13
|
-
export declare function withChildProcess<TResult>(process: ChildProcess, run: ResourceRunner<ChildProcess, TResult>, options?: StopChildProcessOptions): Promise<TResult>;
|
|
14
|
-
//# sourceMappingURL=runtime-process.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-process.d.ts","sourceRoot":"","sources":["../src/runtime-process.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EACL,KAAK,uBAAuB,EAE5B,KAAK,cAAc,EAEpB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,MAAM,CAAC,CAiFjB;AAED,MAAM,WAAW,uBAAuB;IACtC,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,IAAI,CAAC,CAgCf;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,YAAY,EACrB,OAAO,GAAE,uBAA4B,GACpC,uBAAuB,CAAC,YAAY,CAAC,CAIvC;AAED,wBAAsB,gBAAgB,CAAC,OAAO,EAC5C,OAAO,EAAE,YAAY,EACrB,GAAG,EAAE,cAAc,CAAC,YAAY,EAAE,OAAO,CAAC,EAC1C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,OAAO,CAAC,CAKlB"}
|
package/dist/runtime-process.js
DELETED
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import { createAsyncDisposableResource, withAsyncDisposableFactory, } from './disposable.js';
|
|
2
|
-
export async function waitForJsonPortFromStdout(process, options = {}) {
|
|
3
|
-
const timeoutMs = options.timeoutMs ?? 30_000;
|
|
4
|
-
const processName = options.processName ?? 'Child process';
|
|
5
|
-
return new Promise((resolve, reject) => {
|
|
6
|
-
const stdout = process.stdout;
|
|
7
|
-
const stderr = process.stderr;
|
|
8
|
-
if (!stdout || !stderr) {
|
|
9
|
-
reject(new Error(`${processName} has no stdout/stderr pipes`));
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
let stdoutBuffer = '';
|
|
13
|
-
let stderrBuffer = '';
|
|
14
|
-
const cleanup = () => {
|
|
15
|
-
clearTimeout(timeout);
|
|
16
|
-
stdout.off('data', onStdoutData);
|
|
17
|
-
stderr.off('data', onStderrData);
|
|
18
|
-
process.off('exit', onExit);
|
|
19
|
-
};
|
|
20
|
-
const resolvePort = (port) => {
|
|
21
|
-
cleanup();
|
|
22
|
-
resolve(port);
|
|
23
|
-
};
|
|
24
|
-
const rejectWith = (error) => {
|
|
25
|
-
cleanup();
|
|
26
|
-
reject(error);
|
|
27
|
-
};
|
|
28
|
-
const onStdoutData = (chunk) => {
|
|
29
|
-
stdoutBuffer += chunk.toString();
|
|
30
|
-
const lines = stdoutBuffer.split('\n');
|
|
31
|
-
stdoutBuffer = lines.pop() ?? '';
|
|
32
|
-
for (const line of lines) {
|
|
33
|
-
const trimmed = line.trim();
|
|
34
|
-
if (!trimmed) {
|
|
35
|
-
continue;
|
|
36
|
-
}
|
|
37
|
-
try {
|
|
38
|
-
const parsed = JSON.parse(trimmed);
|
|
39
|
-
if (parsed.port && parsed.port > 0) {
|
|
40
|
-
resolvePort(parsed.port);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
catch {
|
|
45
|
-
// keep reading until a valid JSON line is emitted
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
const onStderrData = (chunk) => {
|
|
50
|
-
stderrBuffer += chunk.toString();
|
|
51
|
-
};
|
|
52
|
-
const onExit = (code, signal) => {
|
|
53
|
-
rejectWith(new Error(`${processName} exited before reporting port (code=${String(code)} signal=${String(signal)})\nstderr: ${stderrBuffer}`));
|
|
54
|
-
};
|
|
55
|
-
const timeout = setTimeout(() => {
|
|
56
|
-
rejectWith(new Error(`${processName} startup timed out after ${timeoutMs}ms\nstderr: ${stderrBuffer}`));
|
|
57
|
-
}, timeoutMs);
|
|
58
|
-
stdout.on('data', onStdoutData);
|
|
59
|
-
stderr.on('data', onStderrData);
|
|
60
|
-
process.on('exit', onExit);
|
|
61
|
-
});
|
|
62
|
-
}
|
|
63
|
-
export async function stopChildProcess(process, options = {}) {
|
|
64
|
-
if (process.exitCode != null) {
|
|
65
|
-
return;
|
|
66
|
-
}
|
|
67
|
-
const gracePeriodMs = options.gracePeriodMs ?? 5000;
|
|
68
|
-
try {
|
|
69
|
-
process.kill('SIGTERM');
|
|
70
|
-
}
|
|
71
|
-
catch {
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
await new Promise((resolve) => {
|
|
75
|
-
const onExit = () => {
|
|
76
|
-
clearTimeout(timeout);
|
|
77
|
-
process.off('exit', onExit);
|
|
78
|
-
resolve();
|
|
79
|
-
};
|
|
80
|
-
const timeout = setTimeout(() => {
|
|
81
|
-
try {
|
|
82
|
-
process.kill('SIGKILL');
|
|
83
|
-
}
|
|
84
|
-
catch {
|
|
85
|
-
// ignore
|
|
86
|
-
}
|
|
87
|
-
process.off('exit', onExit);
|
|
88
|
-
resolve();
|
|
89
|
-
}, gracePeriodMs);
|
|
90
|
-
process.on('exit', onExit);
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
export function createChildProcessResource(process, options = {}) {
|
|
94
|
-
return createAsyncDisposableResource(process, () => stopChildProcess(process, options));
|
|
95
|
-
}
|
|
96
|
-
export async function withChildProcess(process, run, options = {}) {
|
|
97
|
-
return withAsyncDisposableFactory(async () => createChildProcessResource(process, options), run);
|
|
98
|
-
}
|
|
99
|
-
//# sourceMappingURL=runtime-process.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-process.js","sourceRoot":"","sources":["../src/runtime-process.ts"],"names":[],"mappings":"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"}
|