orez 0.4.9 → 0.4.11

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,111 @@
1
+ import type { Transaction } from '@rocicorp/zero';
2
+ export declare const zeroHttpFixtureSchema: {
3
+ tables: {
4
+ readonly user: {
5
+ name: "user";
6
+ columns: {
7
+ readonly id: {
8
+ type: "string";
9
+ optional: false;
10
+ customType: string;
11
+ };
12
+ readonly name: {
13
+ type: "string";
14
+ optional: false;
15
+ customType: string;
16
+ };
17
+ };
18
+ primaryKey: readonly [string, ...string[]];
19
+ } & {
20
+ primaryKey: ["id"];
21
+ };
22
+ readonly project: {
23
+ name: "project";
24
+ columns: {
25
+ readonly id: {
26
+ type: "string";
27
+ optional: false;
28
+ customType: string;
29
+ };
30
+ readonly ownerId: {
31
+ type: "string";
32
+ optional: false;
33
+ customType: string;
34
+ };
35
+ readonly name: {
36
+ type: "string";
37
+ optional: false;
38
+ customType: string;
39
+ };
40
+ };
41
+ primaryKey: readonly [string, ...string[]];
42
+ } & {
43
+ primaryKey: ["id"];
44
+ };
45
+ readonly member: {
46
+ name: "member";
47
+ columns: {
48
+ readonly id: {
49
+ type: "string";
50
+ optional: false;
51
+ customType: string;
52
+ };
53
+ readonly projectId: {
54
+ type: "string";
55
+ optional: false;
56
+ customType: string;
57
+ };
58
+ readonly userId: {
59
+ type: "string";
60
+ optional: false;
61
+ customType: string;
62
+ };
63
+ };
64
+ primaryKey: readonly [string, ...string[]];
65
+ } & {
66
+ primaryKey: ["id"];
67
+ };
68
+ };
69
+ relationships: {
70
+ readonly project: {
71
+ members: [{
72
+ readonly sourceField: readonly ("id" | "name" | "ownerId")[];
73
+ readonly destField: readonly ("id" | "projectId" | "userId")[];
74
+ readonly destSchema: "member";
75
+ readonly cardinality: "many";
76
+ }];
77
+ };
78
+ };
79
+ enableLegacyQueries: true;
80
+ enableLegacyMutators: boolean | undefined;
81
+ };
82
+ type FixtureTransaction = Transaction<typeof zeroHttpFixtureSchema>;
83
+ export type ProjectCreateArgs = {
84
+ id: string;
85
+ ownerId: string;
86
+ name: string;
87
+ };
88
+ export type ProjectRenameArgs = {
89
+ id: string;
90
+ name: string;
91
+ };
92
+ export type MemberAddArgs = {
93
+ id: string;
94
+ projectId: string;
95
+ userId: string;
96
+ };
97
+ export type MemberRemoveArgs = {
98
+ id: string;
99
+ };
100
+ export declare const zeroHttpFixtureMutators: {
101
+ project: {
102
+ create: (tx: FixtureTransaction, args: ProjectCreateArgs) => Promise<void>;
103
+ rename: (tx: FixtureTransaction, args: ProjectRenameArgs) => Promise<void>;
104
+ };
105
+ member: {
106
+ add: (tx: FixtureTransaction, args: MemberAddArgs) => Promise<void>;
107
+ remove: (tx: FixtureTransaction, args: MemberRemoveArgs) => Promise<void>;
108
+ };
109
+ };
110
+ export {};
111
+ //# sourceMappingURL=fixture-schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-schema.d.ts","sourceRoot":"","sources":["../../src/zero-http/fixture-schema.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAyBjD,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAYhC,CAAA;AAEF,KAAK,kBAAkB,GAAG,WAAW,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEnE,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG;IAC7B,EAAE,EAAE,MAAM,CAAA;CACX,CAAA;AAED,eAAO,MAAM,uBAAuB;;qBAEb,kBAAkB,QAAQ,iBAAiB;qBAG3C,kBAAkB,QAAQ,iBAAiB;;;kBAK9C,kBAAkB,QAAQ,aAAa;qBAGpC,kBAAkB,QAAQ,gBAAgB;;CAIhE,CAAA"}
@@ -0,0 +1,53 @@
1
+ import { createSchema, relationships, string, table } from '@rocicorp/zero';
2
+ const user = table('user')
3
+ .columns({
4
+ id: string(),
5
+ name: string(),
6
+ })
7
+ .primaryKey('id');
8
+ const project = table('project')
9
+ .columns({
10
+ id: string(),
11
+ ownerId: string(),
12
+ name: string(),
13
+ })
14
+ .primaryKey('id');
15
+ const member = table('member')
16
+ .columns({
17
+ id: string(),
18
+ projectId: string(),
19
+ userId: string(),
20
+ })
21
+ .primaryKey('id');
22
+ export const zeroHttpFixtureSchema = createSchema({
23
+ tables: [user, project, member],
24
+ relationships: [
25
+ relationships(project, ({ many }) => ({
26
+ members: many({
27
+ sourceField: ['id'],
28
+ destField: ['projectId'],
29
+ destSchema: member,
30
+ }),
31
+ })),
32
+ ],
33
+ enableLegacyQueries: true,
34
+ });
35
+ export const zeroHttpFixtureMutators = {
36
+ project: {
37
+ create: async (tx, args) => {
38
+ await tx.mutate.project.insert(args);
39
+ },
40
+ rename: async (tx, args) => {
41
+ await tx.mutate.project.update(args);
42
+ },
43
+ },
44
+ member: {
45
+ add: async (tx, args) => {
46
+ await tx.mutate.member.insert(args);
47
+ },
48
+ remove: async (tx, args) => {
49
+ await tx.mutate.member.delete({ id: args.id });
50
+ },
51
+ },
52
+ };
53
+ //# sourceMappingURL=fixture-schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fixture-schema.js","sourceRoot":"","sources":["../../src/zero-http/fixture-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AAI3E,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;KACvB,OAAO,CAAC;IACP,EAAE,EAAE,MAAM,EAAE;IACZ,IAAI,EAAE,MAAM,EAAE;CACf,CAAC;KACD,UAAU,CAAC,IAAI,CAAC,CAAA;AAEnB,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;KAC7B,OAAO,CAAC;IACP,EAAE,EAAE,MAAM,EAAE;IACZ,OAAO,EAAE,MAAM,EAAE;IACjB,IAAI,EAAE,MAAM,EAAE;CACf,CAAC;KACD,UAAU,CAAC,IAAI,CAAC,CAAA;AAEnB,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC;KAC3B,OAAO,CAAC;IACP,EAAE,EAAE,MAAM,EAAE;IACZ,SAAS,EAAE,MAAM,EAAE;IACnB,MAAM,EAAE,MAAM,EAAE;CACjB,CAAC;KACD,UAAU,CAAC,IAAI,CAAC,CAAA;AAEnB,MAAM,CAAC,MAAM,qBAAqB,GAAG,YAAY,CAAC;IAChD,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE;QACb,aAAa,CAAC,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACpC,OAAO,EAAE,IAAI,CAAC;gBACZ,WAAW,EAAE,CAAC,IAAI,CAAC;gBACnB,SAAS,EAAE,CAAC,WAAW,CAAC;gBACxB,UAAU,EAAE,MAAM;aACnB,CAAC;SACH,CAAC,CAAC;KACJ;IACD,mBAAmB,EAAE,IAAI;CAC1B,CAAC,CAAA;AAyBF,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACrC,OAAO,EAAE;QACP,MAAM,EAAE,KAAK,EAAE,EAAsB,EAAE,IAAuB,EAAE,EAAE;YAChE,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,EAAsB,EAAE,IAAuB,EAAE,EAAE;YAChE,MAAM,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACtC,CAAC;KACF;IACD,MAAM,EAAE;QACN,GAAG,EAAE,KAAK,EAAE,EAAsB,EAAE,IAAmB,EAAE,EAAE;YACzD,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QACrC,CAAC;QACD,MAAM,EAAE,KAAK,EAAE,EAAsB,EAAE,IAAsB,EAAE,EAAE;YAC/D,MAAM,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;QAChD,CAAC;KACF;CACF,CAAA"}
@@ -0,0 +1,14 @@
1
+ export type Row = Record<string, string>;
2
+ export declare function startZeroHttpServer(opts?: {
3
+ seed?: {
4
+ user?: Row[];
5
+ project?: Row[];
6
+ member?: Row[];
7
+ };
8
+ }): Promise<{
9
+ url: string;
10
+ version(): number;
11
+ rows(table: string): Row[];
12
+ close(): Promise<void>;
13
+ }>;
14
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/zero-http/server.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;AA6BxC,wBAAsB,mBAAmB,CAAC,IAAI,CAAC,EAAE;IAC/C,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAA;CACzD,GAAG,OAAO,CAAC;IACV,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,IAAI,MAAM,CAAA;IACjB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,CAAA;IAC1B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB,CAAC,CA8HD"}
@@ -0,0 +1,284 @@
1
+ import { createServer } from 'node:http';
2
+ const tableNames = ['user', 'project', 'member'];
3
+ export async function startZeroHttpServer(opts) {
4
+ const tables = seedTables(opts?.seed);
5
+ const lmids = new Map();
6
+ const mutationResults = new Map();
7
+ const clientGroupUsers = new Map();
8
+ let cookie = 1;
9
+ const server = createServer(async (req, res) => {
10
+ try {
11
+ if (req.method !== 'POST') {
12
+ sendJSON(res, 404, { error: 'not found' });
13
+ return;
14
+ }
15
+ const path = new URL(req.url || '/', 'http://127.0.0.1').pathname;
16
+ const userID = authenticate(req, tables);
17
+ if (!userID) {
18
+ sendJSON(res, 401, { error: 'unauthorized' });
19
+ return;
20
+ }
21
+ if (path === '/pull') {
22
+ const body = (await readJSON(req));
23
+ if (!bindClientGroup(clientGroupUsers, body.clientGroupID, userID)) {
24
+ sendJSON(res, 403, { error: 'client group belongs to a different user' });
25
+ return;
26
+ }
27
+ if (body.cookie === cookie) {
28
+ sendJSON(res, 200, { cookie, unchanged: true });
29
+ return;
30
+ }
31
+ if (typeof body.cookie === 'number' && body.cookie > cookie) {
32
+ sendJSON(res, 409, {
33
+ error: `future cookie ${body.cookie} is ahead of server cookie ${cookie}`,
34
+ });
35
+ return;
36
+ }
37
+ sendJSON(res, 200, {
38
+ cookie,
39
+ lastMutationIDChanges: lastMutationIDChanges(lmids, body.clientGroupID),
40
+ rowsPatch: [{ op: 'clear' }, ...visibleRowsPatch(tables, userID)],
41
+ });
42
+ return;
43
+ }
44
+ if (path === '/push') {
45
+ const body = (await readJSON(req));
46
+ if (!bindClientGroup(clientGroupUsers, body.clientGroupID, userID)) {
47
+ sendJSON(res, 403, { error: 'client group belongs to a different user' });
48
+ return;
49
+ }
50
+ const mutations = Array.isArray(body.mutations) ? body.mutations : [];
51
+ const gap = findMutationGap(lmids, body.clientGroupID, mutations);
52
+ if (gap) {
53
+ sendJSON(res, 500, { error: gap });
54
+ return;
55
+ }
56
+ const pushResults = [];
57
+ let processedNewMutation = false;
58
+ for (const mutation of mutations) {
59
+ const current = lmidFor(lmids, body.clientGroupID, mutation.clientID);
60
+ if (mutation.id <= current) {
61
+ pushResults.push({
62
+ id: { clientID: mutation.clientID, id: mutation.id },
63
+ result: resultForMutation(mutationResults, body.clientGroupID, mutation.clientID, mutation.id) || {},
64
+ });
65
+ continue;
66
+ }
67
+ const result = applyMutation(tables, userID, mutation);
68
+ setLMID(lmids, body.clientGroupID, mutation.clientID, mutation.id);
69
+ setMutationResult(mutationResults, body.clientGroupID, mutation.clientID, mutation.id, result);
70
+ processedNewMutation = true;
71
+ pushResults.push({
72
+ id: { clientID: mutation.clientID, id: mutation.id },
73
+ result,
74
+ });
75
+ }
76
+ if (processedNewMutation)
77
+ cookie += 1;
78
+ sendJSON(res, 200, { pushResponse: { mutations: pushResults } });
79
+ return;
80
+ }
81
+ sendJSON(res, 404, { error: 'not found' });
82
+ }
83
+ catch (err) {
84
+ sendJSON(res, 500, { error: err instanceof Error ? err.message : String(err) });
85
+ }
86
+ });
87
+ await new Promise((resolve, reject) => {
88
+ server.once('error', reject);
89
+ server.listen(0, '127.0.0.1', () => {
90
+ server.off('error', reject);
91
+ resolve();
92
+ });
93
+ });
94
+ const address = server.address();
95
+ return {
96
+ url: `http://127.0.0.1:${address.port}`,
97
+ version: () => cookie,
98
+ rows: (table) => rowsForTable(tables, table),
99
+ close: () => new Promise((resolve, reject) => {
100
+ server.close((err) => (err ? reject(err) : resolve()));
101
+ }),
102
+ };
103
+ }
104
+ function seedTables(seed) {
105
+ const tables = {
106
+ user: new Map(),
107
+ project: new Map(),
108
+ member: new Map(),
109
+ };
110
+ for (const table of tableNames) {
111
+ for (const row of seed?.[table] || []) {
112
+ if (typeof row.id === 'string')
113
+ tables[table].set(row.id, cloneRow(row));
114
+ }
115
+ }
116
+ return tables;
117
+ }
118
+ function authenticate(req, tables) {
119
+ const header = req.headers.authorization;
120
+ if (!header?.startsWith('Bearer token-'))
121
+ return null;
122
+ const userID = header.slice('Bearer token-'.length);
123
+ return tables.user.has(userID) ? userID : null;
124
+ }
125
+ function bindClientGroup(clientGroupUsers, clientGroupID, userID) {
126
+ const owner = clientGroupUsers.get(clientGroupID);
127
+ if (owner)
128
+ return owner === userID;
129
+ clientGroupUsers.set(clientGroupID, userID);
130
+ return true;
131
+ }
132
+ function visibleRowsPatch(tables, userID) {
133
+ const visibleProjectIDs = visibleProjectIDSet(tables, userID);
134
+ const rows = [];
135
+ const user = tables.user.get(userID);
136
+ if (user)
137
+ rows.push({ op: 'put', tableName: 'user', value: cloneRow(user) });
138
+ for (const project of tables.project.values()) {
139
+ if (visibleProjectIDs.has(project.id)) {
140
+ rows.push({ op: 'put', tableName: 'project', value: cloneRow(project) });
141
+ }
142
+ }
143
+ for (const member of tables.member.values()) {
144
+ if (visibleProjectIDs.has(member.projectId)) {
145
+ rows.push({ op: 'put', tableName: 'member', value: cloneRow(member) });
146
+ }
147
+ }
148
+ return rows;
149
+ }
150
+ function visibleProjectIDSet(tables, userID) {
151
+ const projectIDs = new Set();
152
+ for (const project of tables.project.values()) {
153
+ if (project.ownerId === userID)
154
+ projectIDs.add(project.id);
155
+ }
156
+ for (const member of tables.member.values()) {
157
+ if (member.userId === userID && tables.project.has(member.projectId)) {
158
+ projectIDs.add(member.projectId);
159
+ }
160
+ }
161
+ return projectIDs;
162
+ }
163
+ function findMutationGap(lmids, clientGroupID, mutations) {
164
+ const nextLMIDs = new Map();
165
+ for (const mutation of mutations) {
166
+ const current = nextLMIDs.get(mutation.clientID) ?? lmidFor(lmids, clientGroupID, mutation.clientID);
167
+ if (mutation.id <= current)
168
+ continue;
169
+ if (mutation.id !== current + 1) {
170
+ return `mutation id gap for ${mutation.clientID}: got ${mutation.id}, expected ${current + 1}`;
171
+ }
172
+ nextLMIDs.set(mutation.clientID, mutation.id);
173
+ }
174
+ return null;
175
+ }
176
+ function applyMutation(tables, userID, mutation) {
177
+ if (mutation.type !== 'custom')
178
+ return appError('unsupported');
179
+ const args = mutation.args[0] || {};
180
+ if (mutation.name === 'project|create') {
181
+ if (tables.project.has(args.id))
182
+ return appError('exists');
183
+ if (args.ownerId !== userID)
184
+ return appError('forbidden');
185
+ tables.project.set(args.id, {
186
+ id: args.id,
187
+ ownerId: args.ownerId,
188
+ name: args.name,
189
+ });
190
+ return {};
191
+ }
192
+ if (mutation.name === 'project|rename') {
193
+ const project = tables.project.get(args.id);
194
+ if (!project)
195
+ return appError('not-found');
196
+ if (project.ownerId !== userID)
197
+ return appError('forbidden');
198
+ tables.project.set(args.id, { ...project, name: args.name });
199
+ return {};
200
+ }
201
+ if (mutation.name === 'member|add') {
202
+ const project = tables.project.get(args.projectId);
203
+ if (!project)
204
+ return appError('not-found');
205
+ if (project.ownerId !== userID)
206
+ return appError('forbidden');
207
+ if (tables.member.has(args.id))
208
+ return appError('exists');
209
+ tables.member.set(args.id, {
210
+ id: args.id,
211
+ projectId: args.projectId,
212
+ userId: args.userId,
213
+ });
214
+ return {};
215
+ }
216
+ if (mutation.name === 'member|remove') {
217
+ const member = tables.member.get(args.id);
218
+ if (!member)
219
+ return appError('not-found');
220
+ const project = tables.project.get(member.projectId);
221
+ if (!project)
222
+ return appError('not-found');
223
+ if (project.ownerId !== userID)
224
+ return appError('forbidden');
225
+ tables.member.delete(args.id);
226
+ return {};
227
+ }
228
+ return appError('unsupported');
229
+ }
230
+ function appError(details) {
231
+ return { error: 'app', details };
232
+ }
233
+ function lastMutationIDChanges(lmids, clientGroupID) {
234
+ return Object.fromEntries(lmids.get(clientGroupID) || []);
235
+ }
236
+ function lmidFor(lmids, clientGroupID, clientID) {
237
+ return lmids.get(clientGroupID)?.get(clientID) || 0;
238
+ }
239
+ function setLMID(lmids, clientGroupID, clientID, id) {
240
+ let group = lmids.get(clientGroupID);
241
+ if (!group) {
242
+ group = new Map();
243
+ lmids.set(clientGroupID, group);
244
+ }
245
+ group.set(clientID, id);
246
+ }
247
+ function resultForMutation(results, clientGroupID, clientID, id) {
248
+ return results.get(clientGroupID)?.get(clientID)?.get(id);
249
+ }
250
+ function setMutationResult(results, clientGroupID, clientID, id, result) {
251
+ let group = results.get(clientGroupID);
252
+ if (!group) {
253
+ group = new Map();
254
+ results.set(clientGroupID, group);
255
+ }
256
+ let client = group.get(clientID);
257
+ if (!client) {
258
+ client = new Map();
259
+ group.set(clientID, client);
260
+ }
261
+ client.set(id, result);
262
+ }
263
+ function rowsForTable(tables, table) {
264
+ if (!isTableName(table))
265
+ return [];
266
+ return [...tables[table].values()].map(cloneRow);
267
+ }
268
+ function isTableName(table) {
269
+ return tableNames.includes(table);
270
+ }
271
+ function cloneRow(row) {
272
+ return { ...row };
273
+ }
274
+ async function readJSON(req) {
275
+ let body = '';
276
+ for await (const chunk of req)
277
+ body += chunk;
278
+ return body ? JSON.parse(body) : {};
279
+ }
280
+ function sendJSON(res, status, body) {
281
+ res.writeHead(status, { 'content-type': 'application/json' });
282
+ res.end(JSON.stringify(body));
283
+ }
284
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/zero-http/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import { Zero } from '@rocicorp/zero';
2
+ import { zeroHttpFixtureMutators, zeroHttpFixtureSchema } from './fixture-schema.js';
3
+ import { type Row } from './server.js';
4
+ export type FixtureZero = Zero<typeof zeroHttpFixtureSchema, typeof zeroHttpFixtureMutators>;
5
+ export type ZeroHttpHarness = Awaited<ReturnType<typeof startZeroHttpHarness>>;
6
+ export declare function startZeroHttpHarness(opts?: {
7
+ seed?: {
8
+ user?: Row[];
9
+ project?: Row[];
10
+ member?: Row[];
11
+ };
12
+ interceptFetch?: (next: typeof fetch) => typeof fetch;
13
+ }): Promise<{
14
+ server: {
15
+ url: string;
16
+ version(): number;
17
+ rows(table: string): Row[];
18
+ close(): Promise<void>;
19
+ };
20
+ transport: {
21
+ pull(): Promise<void>;
22
+ readonly connections: number;
23
+ uninstall(): void;
24
+ };
25
+ createZero(userID: string, createOpts?: {
26
+ storageKey?: string;
27
+ pingTimeoutMs?: number;
28
+ }): FixtureZero;
29
+ close(): Promise<void>;
30
+ }>;
31
+ export declare function waitForComplete<T>(view: {
32
+ addListener(listener: (data: T, resultType: string) => void): () => void;
33
+ }): Promise<T>;
34
+ export declare function eventually(assertion: () => void | Promise<void>, timeout?: number): Promise<void>;
35
+ export declare function sleep(ms: number): Promise<unknown>;
36
+ //# sourceMappingURL=test-harness.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-harness.d.ts","sourceRoot":"","sources":["../../src/zero-http/test-harness.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAA;AAErC,OAAO,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AACpF,OAAO,EAAuB,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AAK3D,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,OAAO,qBAAqB,EAC5B,OAAO,uBAAuB,CAC/B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,oBAAoB,CAAC,CAAC,CAAA;AAE9E,wBAAsB,oBAAoB,CAAC,IAAI,CAAC,EAAE;IAChD,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;KAAE,CAAA;IACxD,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,KAAK,OAAO,KAAK,CAAA;CACtD;;;;;;;;;;;;uBAca,MAAM,eACD;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3D,WAAW;;GAqBjB;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,IAAI,EAAE;IACvC,WAAW,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI,CAAA;CACzE,GAAG,OAAO,CAAC,CAAC,CAAC,CAcb;AAED,wBAAsB,UAAU,CAAC,SAAS,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,SAAQ,iBAatF;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,oBAE/B"}
@@ -0,0 +1,72 @@
1
+ import { Zero } from '@rocicorp/zero';
2
+ import { zeroHttpFixtureMutators, zeroHttpFixtureSchema } from './fixture-schema.js';
3
+ import { startZeroHttpServer } from './server.js';
4
+ import { installZeroHttpTransport } from './transport.js';
5
+ let storageID = 0;
6
+ export async function startZeroHttpHarness(opts) {
7
+ const server = await startZeroHttpServer({ seed: opts?.seed });
8
+ const baseFetch = (input, init) => globalThis.fetch(input, init);
9
+ const transportFetch = opts?.interceptFetch ? opts.interceptFetch(baseFetch) : baseFetch;
10
+ const transport = installZeroHttpTransport({
11
+ origin: server.url,
12
+ fetch: transportFetch,
13
+ });
14
+ const clients = [];
15
+ return {
16
+ server,
17
+ transport,
18
+ createZero(userID, createOpts) {
19
+ const zero = new Zero({
20
+ server: server.url,
21
+ userID,
22
+ auth: `token-${userID}`,
23
+ schema: zeroHttpFixtureSchema,
24
+ kvStore: 'mem',
25
+ storageKey: createOpts?.storageKey ?? `zero-http-harness-${++storageID}`,
26
+ mutators: zeroHttpFixtureMutators,
27
+ pingTimeoutMs: createOpts?.pingTimeoutMs,
28
+ });
29
+ clients.push(zero);
30
+ return zero;
31
+ },
32
+ async close() {
33
+ await transport.pull().catch(() => { });
34
+ while (clients.length)
35
+ await clients.pop()?.close();
36
+ transport.uninstall();
37
+ await server.close();
38
+ },
39
+ };
40
+ }
41
+ export function waitForComplete(view) {
42
+ return new Promise((resolve, reject) => {
43
+ const timeout = setTimeout(() => reject(new Error('timed out waiting for complete query')), 5_000);
44
+ let cleanup = () => { };
45
+ cleanup = view.addListener((data, resultType) => {
46
+ if (resultType !== 'complete')
47
+ return;
48
+ clearTimeout(timeout);
49
+ cleanup();
50
+ resolve(JSON.parse(JSON.stringify(data)));
51
+ });
52
+ });
53
+ }
54
+ export async function eventually(assertion, timeout = 3_000) {
55
+ const started = Date.now();
56
+ let lastError;
57
+ while (Date.now() - started < timeout) {
58
+ try {
59
+ await assertion();
60
+ return;
61
+ }
62
+ catch (error) {
63
+ lastError = error;
64
+ await sleep(10);
65
+ }
66
+ }
67
+ throw lastError;
68
+ }
69
+ export function sleep(ms) {
70
+ return new Promise((resolve) => setTimeout(resolve, ms));
71
+ }
72
+ //# sourceMappingURL=test-harness.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"test-harness.js","sourceRoot":"","sources":["../../src/zero-http/test-harness.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare function installZeroHttpTransport(opts: {
2
+ origin: string;
3
+ fetch?: typeof fetch;
4
+ }): {
5
+ pull(): Promise<void>;
6
+ readonly connections: number;
7
+ uninstall(): void;
8
+ };
9
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/zero-http/transport.ts"],"names":[],"mappings":"AAyCA,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;CACrB,GAAG;IACF,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,SAAS,IAAI,IAAI,CAAA;CAClB,CAgDA"}
@@ -0,0 +1,425 @@
1
+ const COOKIE_WIDTH = 20;
2
+ export function installZeroHttpTransport(opts) {
3
+ const previousWebSocket = globalThis.WebSocket;
4
+ const fetchImpl = opts.fetch ?? globalThis.fetch;
5
+ if (!fetchImpl) {
6
+ throw new Error('installZeroHttpTransport requires a fetch implementation');
7
+ }
8
+ const state = {
9
+ origin: new URL(opts.origin),
10
+ originString: trimTrailingSlash(new URL(opts.origin).toString()),
11
+ fetch: fetchImpl,
12
+ nativeWebSocket: previousWebSocket,
13
+ sockets: new Set(),
14
+ nextPokeID: 0,
15
+ };
16
+ const Shim = class {
17
+ static CONNECTING = 0;
18
+ static OPEN = 1;
19
+ static CLOSING = 2;
20
+ static CLOSED = 3;
21
+ constructor(url, protocols) {
22
+ if (shouldIntercept(state.origin, url)) {
23
+ return new ZeroHttpSocket(state, url, protocols);
24
+ }
25
+ if (!state.nativeWebSocket) {
26
+ throw new Error(`No native WebSocket available for ${String(url)}`);
27
+ }
28
+ return new state.nativeWebSocket(url, protocols);
29
+ }
30
+ };
31
+ globalThis.WebSocket = Shim;
32
+ return {
33
+ pull: async () => {
34
+ await Promise.all([...state.sockets].map((socket) => socket.pull()));
35
+ },
36
+ get connections() {
37
+ return state.sockets.size;
38
+ },
39
+ uninstall: () => {
40
+ if (globalThis.WebSocket === Shim) {
41
+ globalThis.WebSocket = previousWebSocket;
42
+ }
43
+ },
44
+ };
45
+ }
46
+ class ZeroHttpSocket {
47
+ state;
48
+ CONNECTING = 0;
49
+ OPEN = 1;
50
+ CLOSING = 2;
51
+ CLOSED = 3;
52
+ url;
53
+ readyState = this.CONNECTING;
54
+ connectURL;
55
+ authToken;
56
+ listeners = {
57
+ open: new Set(),
58
+ message: new Set(),
59
+ close: new Set(),
60
+ error: new Set(),
61
+ };
62
+ clientID;
63
+ clientGroupID;
64
+ wsid;
65
+ cookie;
66
+ pendingGotQueriesPatch = [];
67
+ pullInFlight;
68
+ pullAfterCurrent = false;
69
+ pushChain = Promise.resolve();
70
+ nextLocalCookieID = 0;
71
+ openTimer;
72
+ constructor(state, url, protocols) {
73
+ this.state = state;
74
+ this.connectURL = toHttpURL(url);
75
+ this.url = String(url);
76
+ this.clientID = this.connectURL.searchParams.get('clientID') ?? '';
77
+ this.clientGroupID = this.connectURL.searchParams.get('clientGroupID') ?? '';
78
+ this.wsid = this.connectURL.searchParams.get('wsid') ?? `zero-http-${Date.now()}`;
79
+ const baseCookie = this.connectURL.searchParams.get('baseCookie');
80
+ this.cookie = baseCookie ? baseCookie : null;
81
+ const decoded = decodeSecProtocol(protocols);
82
+ this.authToken = decoded.authToken;
83
+ this.queueDesiredQueries(decoded.initConnectionMessage?.[1]);
84
+ this.state.sockets.add(this);
85
+ this.openTimer = setTimeout(() => this.open(), 0);
86
+ }
87
+ addEventListener(type, listener) {
88
+ if (listener)
89
+ this.listeners[type]?.add(listener);
90
+ }
91
+ removeEventListener(type, listener) {
92
+ if (listener)
93
+ this.listeners[type]?.delete(listener);
94
+ }
95
+ dispatchEvent(event) {
96
+ this.emit(event.type, event);
97
+ return true;
98
+ }
99
+ send(data) {
100
+ if (this.readyState !== this.OPEN) {
101
+ throw new Error('cannot send on a socket that is not open');
102
+ }
103
+ const message = JSON.parse(data);
104
+ switch (message[0]) {
105
+ case 'initConnection':
106
+ case 'changeDesiredQueries':
107
+ this.queueDesiredQueries(message[1]);
108
+ this.requestPullAfterCurrent();
109
+ return;
110
+ case 'updateAuth':
111
+ this.authToken = message[1].auth;
112
+ return;
113
+ case 'push':
114
+ this.enqueuePush(message[1]);
115
+ return;
116
+ case 'ping':
117
+ this.emitMessage(['pong', {}]);
118
+ return;
119
+ case 'pull':
120
+ this.run(this.answerMutationRecoveryPull(message[1]));
121
+ return;
122
+ case 'deleteClients':
123
+ case 'ackMutationResponses':
124
+ return;
125
+ default:
126
+ throw new Error(`unsupported zero-http upstream message ${message[0]}`);
127
+ }
128
+ }
129
+ close(code = 1000, reason = '') {
130
+ if (this.readyState === this.CLOSED)
131
+ return;
132
+ if (this.openTimer)
133
+ clearTimeout(this.openTimer);
134
+ this.readyState = this.CLOSED;
135
+ this.state.sockets.delete(this);
136
+ this.emit('close', { code, reason, wasClean: code <= 1001 });
137
+ }
138
+ pull() {
139
+ if (this.readyState === this.CLOSED)
140
+ return Promise.resolve();
141
+ if (this.pullInFlight)
142
+ return this.pullInFlight;
143
+ this.pullInFlight = this.fetchPull(this.clientGroupID, this.cookie)
144
+ .then((response) => {
145
+ if (response.unchanged) {
146
+ this.emitGotQueriesPatch(response.cookie);
147
+ return;
148
+ }
149
+ this.emitPoke(response);
150
+ })
151
+ .catch((error) => {
152
+ this.fail(error);
153
+ throw error;
154
+ })
155
+ .finally(async () => {
156
+ const pullAgain = this.pullAfterCurrent;
157
+ this.pullAfterCurrent = false;
158
+ this.pullInFlight = undefined;
159
+ if (pullAgain && this.readyState !== this.CLOSED)
160
+ await this.pull();
161
+ });
162
+ return this.pullInFlight;
163
+ }
164
+ open() {
165
+ if (this.readyState !== this.CONNECTING)
166
+ return;
167
+ this.readyState = this.OPEN;
168
+ this.emit('open', {});
169
+ this.emitMessage(['connected', { wsid: this.wsid, timestamp: Date.now() }]);
170
+ setTimeout(() => this.run(this.pull()), 0);
171
+ }
172
+ queueDesiredQueries(body) {
173
+ const desiredQueriesPatch = body
174
+ ?.desiredQueriesPatch;
175
+ if (!Array.isArray(desiredQueriesPatch))
176
+ return;
177
+ this.pendingGotQueriesPatch.push(...gotQueriesPatch(desiredQueriesPatch));
178
+ }
179
+ async push(body) {
180
+ const response = (await this.postJSON('/push', body));
181
+ this.emitMessage(['pushResponse', response.pushResponse]);
182
+ this.requestPullAfterCurrent();
183
+ }
184
+ enqueuePush(body) {
185
+ const nextPush = this.pushChain.then(async () => {
186
+ if (this.readyState === this.CLOSED)
187
+ return;
188
+ await this.push(body);
189
+ });
190
+ this.pushChain = nextPush.catch(() => { });
191
+ this.run(nextPush);
192
+ }
193
+ requestPullAfterCurrent() {
194
+ if (this.pullInFlight) {
195
+ this.pullAfterCurrent = true;
196
+ return;
197
+ }
198
+ this.run(this.pull());
199
+ }
200
+ async answerMutationRecoveryPull(body) {
201
+ const response = await this.fetchPull(body.clientGroupID, body.cookie);
202
+ const cookie = toWebSocketCookie(response.cookie);
203
+ this.emitMessage([
204
+ 'pull',
205
+ {
206
+ requestID: body.requestID,
207
+ cookie: cookie ?? this.cookie ?? '0',
208
+ lastMutationIDChanges: response.unchanged ? {} : response.lastMutationIDChanges,
209
+ },
210
+ ]);
211
+ }
212
+ async fetchPull(clientGroupID, cookie) {
213
+ return (await this.postJSON('/pull', {
214
+ clientID: this.clientID,
215
+ clientGroupID,
216
+ cookie: toHttpCookie(cookie),
217
+ }));
218
+ }
219
+ async postJSON(path, body) {
220
+ const response = await this.state.fetch(`${this.state.originString}${path}`, {
221
+ method: 'POST',
222
+ headers: {
223
+ authorization: this.authToken ? `Bearer ${this.authToken}` : '',
224
+ 'content-type': 'application/json',
225
+ },
226
+ body: JSON.stringify(body),
227
+ });
228
+ if (!response.ok) {
229
+ throw new ZeroHttpResponseError(path, response.status);
230
+ }
231
+ return response.json();
232
+ }
233
+ run(promise) {
234
+ void promise.catch((error) => this.fail(error));
235
+ }
236
+ fail(error) {
237
+ if (this.readyState === this.CLOSED)
238
+ return;
239
+ if (isAuthHTTPError(error)) {
240
+ this.emitMessage([
241
+ 'error',
242
+ {
243
+ kind: 'Unauthorized',
244
+ message: error.message,
245
+ origin: 'server',
246
+ },
247
+ ]);
248
+ if (this.readyState !== this.CLOSED)
249
+ this.close(1000, error.message);
250
+ return;
251
+ }
252
+ this.emit('error', { error });
253
+ this.close(1011, errorMessage(error));
254
+ }
255
+ emitPoke(response) {
256
+ const nextCookie = toWebSocketCookie(response.cookie);
257
+ if (isStaleCookie(this.cookie, response.cookie)) {
258
+ throw new Error(`zero-http pull returned stale cookie ${response.cookie} for ${this.cookie}`);
259
+ }
260
+ const pokeID = `zero-http-${++this.state.nextPokeID}`;
261
+ const gotQueries = this.pendingGotQueriesPatch;
262
+ this.pendingGotQueriesPatch = [];
263
+ this.emitMessage([
264
+ 'pokeStart',
265
+ {
266
+ pokeID,
267
+ baseCookie: this.cookie,
268
+ schemaVersions: {
269
+ minSupportedVersion: 1,
270
+ maxSupportedVersion: 1,
271
+ },
272
+ timestamp: Date.now(),
273
+ },
274
+ ]);
275
+ this.emitMessage([
276
+ 'pokePart',
277
+ {
278
+ pokeID,
279
+ lastMutationIDChanges: response.lastMutationIDChanges,
280
+ rowsPatch: response.rowsPatch,
281
+ },
282
+ ]);
283
+ if (gotQueries.length > 0) {
284
+ this.emitMessage([
285
+ 'pokePart',
286
+ {
287
+ pokeID,
288
+ gotQueriesPatch: gotQueries,
289
+ },
290
+ ]);
291
+ }
292
+ this.emitMessage(['pokeEnd', { pokeID, cookie: nextCookie }]);
293
+ this.cookie = nextCookie;
294
+ }
295
+ emitGotQueriesPatch(cookie) {
296
+ if (this.pendingGotQueriesPatch.length === 0)
297
+ return;
298
+ const serverCookie = cookie ?? toHttpCookie(this.cookie);
299
+ if (serverCookie === null)
300
+ return;
301
+ const nextCookie = toLocalWebSocketCookie(serverCookie, ++this.nextLocalCookieID);
302
+ const pokeID = `zero-http-${++this.state.nextPokeID}`;
303
+ const gotQueries = this.pendingGotQueriesPatch;
304
+ this.pendingGotQueriesPatch = [];
305
+ this.emitMessage([
306
+ 'pokeStart',
307
+ {
308
+ pokeID,
309
+ baseCookie: this.cookie,
310
+ schemaVersions: {
311
+ minSupportedVersion: 1,
312
+ maxSupportedVersion: 1,
313
+ },
314
+ timestamp: Date.now(),
315
+ },
316
+ ]);
317
+ this.emitMessage([
318
+ 'pokePart',
319
+ {
320
+ pokeID,
321
+ gotQueriesPatch: gotQueries,
322
+ },
323
+ ]);
324
+ this.emitMessage(['pokeEnd', { pokeID, cookie: nextCookie }]);
325
+ this.cookie = nextCookie;
326
+ }
327
+ emitMessage(message) {
328
+ if (this.readyState !== this.OPEN)
329
+ return;
330
+ this.emit('message', { data: JSON.stringify(message) });
331
+ }
332
+ emit(type, event) {
333
+ const handler = this[`on${type}`];
334
+ if (typeof handler === 'function')
335
+ handler.call(this, event);
336
+ for (const listener of this.listeners[type]) {
337
+ if (typeof listener === 'function')
338
+ listener(event);
339
+ else
340
+ listener.handleEvent(event);
341
+ }
342
+ }
343
+ }
344
+ function shouldIntercept(origin, url) {
345
+ const candidate = toHttpURL(url);
346
+ if (candidate.origin !== origin.origin)
347
+ return false;
348
+ return candidate.pathname === `${trimTrailingSlash(origin.pathname)}/sync/v51/connect`;
349
+ }
350
+ function toHttpURL(url) {
351
+ const parsed = new URL(url);
352
+ if (parsed.protocol === 'ws:')
353
+ parsed.protocol = 'http:';
354
+ if (parsed.protocol === 'wss:')
355
+ parsed.protocol = 'https:';
356
+ return parsed;
357
+ }
358
+ function trimTrailingSlash(value) {
359
+ return value.endsWith('/') ? value.slice(0, -1) : value;
360
+ }
361
+ function decodeSecProtocol(protocols) {
362
+ const protocol = Array.isArray(protocols) ? protocols[0] : protocols;
363
+ if (!protocol)
364
+ return {};
365
+ try {
366
+ const decoded = decodeURIComponent(protocol);
367
+ const json = new TextDecoder().decode(Uint8Array.from(globalThis.atob(decoded), (char) => char.charCodeAt(0)));
368
+ const parsed = JSON.parse(json);
369
+ return {
370
+ authToken: parsed.authToken,
371
+ initConnectionMessage: Array.isArray(parsed.initConnectionMessage)
372
+ ? parsed.initConnectionMessage
373
+ : undefined,
374
+ };
375
+ }
376
+ catch {
377
+ return {};
378
+ }
379
+ }
380
+ function gotQueriesPatch(patch) {
381
+ const got = [];
382
+ for (const op of patch) {
383
+ if (op.op === 'clear')
384
+ got.push({ op: 'clear' });
385
+ else if (op.hash)
386
+ got.push({ op: op.op, hash: op.hash });
387
+ }
388
+ return got;
389
+ }
390
+ function toHttpCookie(cookie) {
391
+ if (cookie === null || cookie === '')
392
+ return null;
393
+ const parsed = Number(cookie.slice(0, COOKIE_WIDTH));
394
+ if (!Number.isFinite(parsed)) {
395
+ throw new Error(`zero-http cookie is not numeric: ${cookie}`);
396
+ }
397
+ return parsed;
398
+ }
399
+ function toWebSocketCookie(cookie) {
400
+ return cookie === null ? null : String(cookie).padStart(COOKIE_WIDTH, '0');
401
+ }
402
+ function toLocalWebSocketCookie(cookie, localID) {
403
+ return `${String(cookie).padStart(COOKIE_WIDTH, '0')}#${String(localID).padStart(6, '0')}`;
404
+ }
405
+ function isStaleCookie(current, next) {
406
+ const currentNumber = toHttpCookie(current);
407
+ return currentNumber !== null && next <= currentNumber;
408
+ }
409
+ function errorMessage(error) {
410
+ return error instanceof Error ? error.message : String(error);
411
+ }
412
+ class ZeroHttpResponseError extends Error {
413
+ path;
414
+ status;
415
+ constructor(path, status) {
416
+ super(`zero-http ${path} failed with ${status}`);
417
+ this.path = path;
418
+ this.status = status;
419
+ }
420
+ }
421
+ function isAuthHTTPError(error) {
422
+ return (error instanceof ZeroHttpResponseError &&
423
+ (error.status === 401 || error.status === 403));
424
+ }
425
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/zero-http/transport.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orez",
3
- "version": "0.4.9",
3
+ "version": "0.4.11",
4
4
  "description": "PGlite-powered zero-sync development backend. No Docker required.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -87,7 +87,7 @@
87
87
  "@electric-sql/pglite": "0.4.1",
88
88
  "@electric-sql/pglite-tools": "^0.3.1",
89
89
  "@pgsql/traverse": "17.2.6",
90
- "bedrock-sqlite": "0.4.9",
90
+ "bedrock-sqlite": "0.4.11",
91
91
  "citty": "^0.2.0",
92
92
  "pg-gateway": "0.3.0-beta.4",
93
93
  "pgsql-parser": "^17.9.11",