on-zero 0.4.26 → 0.4.28

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.
Files changed (123) hide show
  1. package/dist/cjs/createZeroClient.cjs +14 -1
  2. package/dist/cjs/createZeroClient.native.js +15 -1
  3. package/dist/cjs/createZeroClient.native.js.map +1 -1
  4. package/dist/cjs/httpPull/auth.test.cjs +197 -0
  5. package/dist/cjs/httpPull/auth.test.native.js +279 -0
  6. package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
  7. package/dist/cjs/httpPull/churn.test.cjs +132 -0
  8. package/dist/cjs/httpPull/churn.test.native.js +155 -0
  9. package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
  10. package/dist/cjs/httpPull/fixtureSchema.cjs +76 -0
  11. package/dist/cjs/httpPull/fixtureSchema.native.js +82 -0
  12. package/dist/cjs/httpPull/fixtureSchema.native.js.map +1 -0
  13. package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
  14. package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
  15. package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
  16. package/dist/cjs/httpPull/integration.test.cjs +53 -0
  17. package/dist/cjs/httpPull/integration.test.native.js +60 -0
  18. package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
  19. package/dist/cjs/httpPull/rebase.test.cjs +360 -0
  20. package/dist/cjs/httpPull/rebase.test.native.js +420 -0
  21. package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
  22. package/dist/cjs/httpPull/relations.test.cjs +107 -0
  23. package/dist/cjs/httpPull/relations.test.native.js +119 -0
  24. package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
  25. package/dist/cjs/httpPull/testHarness.cjs +100 -0
  26. package/dist/cjs/httpPull/testHarness.native.js +112 -0
  27. package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
  28. package/dist/cjs/httpPull/transport.test.cjs +588 -0
  29. package/dist/cjs/httpPull/transport.test.native.js +677 -0
  30. package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
  31. package/dist/cjs/httpPullTransport.cjs +447 -0
  32. package/dist/cjs/httpPullTransport.native.js +710 -0
  33. package/dist/cjs/httpPullTransport.native.js.map +1 -0
  34. package/dist/cjs/index.cjs +1 -0
  35. package/dist/cjs/index.native.js +1 -0
  36. package/dist/cjs/index.native.js.map +1 -1
  37. package/dist/esm/createZeroClient.mjs +14 -1
  38. package/dist/esm/createZeroClient.mjs.map +1 -1
  39. package/dist/esm/createZeroClient.native.js +15 -1
  40. package/dist/esm/createZeroClient.native.js.map +1 -1
  41. package/dist/esm/httpPull/auth.test.mjs +198 -0
  42. package/dist/esm/httpPull/auth.test.mjs.map +1 -0
  43. package/dist/esm/httpPull/auth.test.native.js +277 -0
  44. package/dist/esm/httpPull/auth.test.native.js.map +1 -0
  45. package/dist/esm/httpPull/churn.test.mjs +133 -0
  46. package/dist/esm/httpPull/churn.test.mjs.map +1 -0
  47. package/dist/esm/httpPull/churn.test.native.js +153 -0
  48. package/dist/esm/httpPull/churn.test.native.js.map +1 -0
  49. package/dist/esm/httpPull/fixtureSchema.mjs +50 -0
  50. package/dist/esm/httpPull/fixtureSchema.mjs.map +1 -0
  51. package/dist/esm/httpPull/fixtureSchema.native.js +53 -0
  52. package/dist/esm/httpPull/fixtureSchema.native.js.map +1 -0
  53. package/dist/esm/httpPull/fixtureServer.mjs +315 -0
  54. package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
  55. package/dist/esm/httpPull/fixtureServer.native.js +506 -0
  56. package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
  57. package/dist/esm/httpPull/integration.test.mjs +54 -0
  58. package/dist/esm/httpPull/integration.test.mjs.map +1 -0
  59. package/dist/esm/httpPull/integration.test.native.js +58 -0
  60. package/dist/esm/httpPull/integration.test.native.js.map +1 -0
  61. package/dist/esm/httpPull/rebase.test.mjs +361 -0
  62. package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
  63. package/dist/esm/httpPull/rebase.test.native.js +418 -0
  64. package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
  65. package/dist/esm/httpPull/relations.test.mjs +108 -0
  66. package/dist/esm/httpPull/relations.test.mjs.map +1 -0
  67. package/dist/esm/httpPull/relations.test.native.js +117 -0
  68. package/dist/esm/httpPull/relations.test.native.js.map +1 -0
  69. package/dist/esm/httpPull/testHarness.mjs +72 -0
  70. package/dist/esm/httpPull/testHarness.mjs.map +1 -0
  71. package/dist/esm/httpPull/testHarness.native.js +81 -0
  72. package/dist/esm/httpPull/testHarness.native.js.map +1 -0
  73. package/dist/esm/httpPull/transport.test.mjs +589 -0
  74. package/dist/esm/httpPull/transport.test.mjs.map +1 -0
  75. package/dist/esm/httpPull/transport.test.native.js +675 -0
  76. package/dist/esm/httpPull/transport.test.native.js.map +1 -0
  77. package/dist/esm/httpPullTransport.mjs +421 -0
  78. package/dist/esm/httpPullTransport.mjs.map +1 -0
  79. package/dist/esm/httpPullTransport.native.js +681 -0
  80. package/dist/esm/httpPullTransport.native.js.map +1 -0
  81. package/dist/esm/index.js +1 -0
  82. package/dist/esm/index.js.map +1 -1
  83. package/dist/esm/index.mjs +1 -0
  84. package/dist/esm/index.mjs.map +1 -1
  85. package/dist/esm/index.native.js +1 -0
  86. package/dist/esm/index.native.js.map +1 -1
  87. package/package.json +2 -2
  88. package/src/createZeroClient.tsx +22 -0
  89. package/src/httpPull/auth.test.ts +208 -0
  90. package/src/httpPull/churn.test.ts +147 -0
  91. package/src/httpPull/fixtureSchema.ts +82 -0
  92. package/src/httpPull/fixtureServer.ts +391 -0
  93. package/src/httpPull/integration.test.ts +57 -0
  94. package/src/httpPull/rebase.test.ts +368 -0
  95. package/src/httpPull/relations.test.ts +135 -0
  96. package/src/httpPull/testHarness.ts +95 -0
  97. package/src/httpPull/transport.test.ts +603 -0
  98. package/src/httpPullTransport.ts +587 -0
  99. package/src/index.ts +1 -0
  100. package/types/createZeroClient.d.ts +3 -1
  101. package/types/createZeroClient.d.ts.map +1 -1
  102. package/types/httpPull/auth.test.d.ts +2 -0
  103. package/types/httpPull/auth.test.d.ts.map +1 -0
  104. package/types/httpPull/churn.test.d.ts +2 -0
  105. package/types/httpPull/churn.test.d.ts.map +1 -0
  106. package/types/httpPull/fixtureSchema.d.ts +111 -0
  107. package/types/httpPull/fixtureSchema.d.ts.map +1 -0
  108. package/types/httpPull/fixtureServer.d.ts +14 -0
  109. package/types/httpPull/fixtureServer.d.ts.map +1 -0
  110. package/types/httpPull/integration.test.d.ts +2 -0
  111. package/types/httpPull/integration.test.d.ts.map +1 -0
  112. package/types/httpPull/rebase.test.d.ts +2 -0
  113. package/types/httpPull/rebase.test.d.ts.map +1 -0
  114. package/types/httpPull/relations.test.d.ts +2 -0
  115. package/types/httpPull/relations.test.d.ts.map +1 -0
  116. package/types/httpPull/testHarness.d.ts +32 -0
  117. package/types/httpPull/testHarness.d.ts.map +1 -0
  118. package/types/httpPull/transport.test.d.ts +2 -0
  119. package/types/httpPull/transport.test.d.ts.map +1 -0
  120. package/types/httpPullTransport.d.ts +13 -0
  121. package/types/httpPullTransport.d.ts.map +1 -0
  122. package/types/index.d.ts +1 -0
  123. package/types/index.d.ts.map +1 -1
@@ -0,0 +1,534 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var fixtureServer_exports = {};
26
+ __export(fixtureServer_exports, {
27
+ startZeroHttpServer: () => startZeroHttpServer
28
+ });
29
+ module.exports = __toCommonJS(fixtureServer_exports);
30
+ var import_http = require("http");
31
+ function _instanceof(left, right) {
32
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
33
+ return !!right[Symbol.hasInstance](left);
34
+ } else {
35
+ return left instanceof right;
36
+ }
37
+ }
38
+ var tableNames = ["user", "project", "member"];
39
+ async function startZeroHttpServer(opts) {
40
+ var tables = seedTables(opts === null || opts === void 0 ? void 0 : opts.seed);
41
+ var lmids = /* @__PURE__ */new Map();
42
+ var mutationResults = /* @__PURE__ */new Map();
43
+ var clientGroupUsers = /* @__PURE__ */new Map();
44
+ var cookie = 1;
45
+ var server = (0, import_http.createServer)(async function (req, res) {
46
+ try {
47
+ if (req.method !== "POST") {
48
+ sendJSON(res, 404, {
49
+ error: "not found"
50
+ });
51
+ return;
52
+ }
53
+ var path = new URL(req.url || "/", "http://127.0.0.1").pathname;
54
+ var userID = authenticate(req, tables);
55
+ if (!userID) {
56
+ sendJSON(res, 401, {
57
+ error: "unauthorized"
58
+ });
59
+ return;
60
+ }
61
+ if (path === "/pull") {
62
+ var body = await readJSON(req);
63
+ if (!bindClientGroup(clientGroupUsers, body.clientGroupID, userID)) {
64
+ sendJSON(res, 403, {
65
+ error: "client group belongs to a different user"
66
+ });
67
+ return;
68
+ }
69
+ if (body.cookie === cookie) {
70
+ sendJSON(res, 200, {
71
+ cookie,
72
+ unchanged: true
73
+ });
74
+ return;
75
+ }
76
+ if (typeof body.cookie === "number" && body.cookie > cookie) {
77
+ sendJSON(res, 409, {
78
+ error: `future cookie ${body.cookie} is ahead of server cookie ${cookie}`
79
+ });
80
+ return;
81
+ }
82
+ sendJSON(res, 200, {
83
+ cookie,
84
+ lastMutationIDChanges: lastMutationIDChanges(lmids, body.clientGroupID),
85
+ rowsPatch: [{
86
+ op: "clear"
87
+ }, ...visibleRowsPatch(tables, userID)]
88
+ });
89
+ return;
90
+ }
91
+ if (path === "/push") {
92
+ var body1 = await readJSON(req);
93
+ if (!bindClientGroup(clientGroupUsers, body1.clientGroupID, userID)) {
94
+ sendJSON(res, 403, {
95
+ error: "client group belongs to a different user"
96
+ });
97
+ return;
98
+ }
99
+ var mutations = Array.isArray(body1.mutations) ? body1.mutations : [];
100
+ var gap = findMutationGap(lmids, body1.clientGroupID, mutations);
101
+ if (gap) {
102
+ sendJSON(res, 500, {
103
+ error: gap
104
+ });
105
+ return;
106
+ }
107
+ var pushResults = [];
108
+ var processedNewMutation = false;
109
+ var _iteratorNormalCompletion = true,
110
+ _didIteratorError = false,
111
+ _iteratorError = void 0;
112
+ try {
113
+ for (var _iterator = mutations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
114
+ var mutation = _step.value;
115
+ var current = lmidFor(lmids, body1.clientGroupID, mutation.clientID);
116
+ if (mutation.id <= current) {
117
+ pushResults.push({
118
+ id: {
119
+ clientID: mutation.clientID,
120
+ id: mutation.id
121
+ },
122
+ result: resultForMutation(mutationResults, body1.clientGroupID, mutation.clientID, mutation.id) || {}
123
+ });
124
+ continue;
125
+ }
126
+ var result = applyMutation(tables, userID, mutation);
127
+ setLMID(lmids, body1.clientGroupID, mutation.clientID, mutation.id);
128
+ setMutationResult(mutationResults, body1.clientGroupID, mutation.clientID, mutation.id, result);
129
+ processedNewMutation = true;
130
+ pushResults.push({
131
+ id: {
132
+ clientID: mutation.clientID,
133
+ id: mutation.id
134
+ },
135
+ result
136
+ });
137
+ }
138
+ } catch (err) {
139
+ _didIteratorError = true;
140
+ _iteratorError = err;
141
+ } finally {
142
+ try {
143
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
144
+ _iterator.return();
145
+ }
146
+ } finally {
147
+ if (_didIteratorError) {
148
+ throw _iteratorError;
149
+ }
150
+ }
151
+ }
152
+ if (processedNewMutation) cookie += 1;
153
+ sendJSON(res, 200, {
154
+ pushResponse: {
155
+ mutations: pushResults
156
+ }
157
+ });
158
+ return;
159
+ }
160
+ sendJSON(res, 404, {
161
+ error: "not found"
162
+ });
163
+ } catch (err) {
164
+ sendJSON(res, 500, {
165
+ error: _instanceof(err, Error) ? err.message : String(err)
166
+ });
167
+ }
168
+ });
169
+ await new Promise(function (resolve, reject) {
170
+ server.once("error", reject);
171
+ server.listen(0, "127.0.0.1", function () {
172
+ server.off("error", reject);
173
+ resolve();
174
+ });
175
+ });
176
+ var address = server.address();
177
+ return {
178
+ url: `http://127.0.0.1:${address.port}`,
179
+ version: function () {
180
+ return cookie;
181
+ },
182
+ rows: function (table) {
183
+ return rowsForTable(tables, table);
184
+ },
185
+ close: function () {
186
+ return new Promise(function (resolve, reject) {
187
+ server.close(function (err) {
188
+ return err ? reject(err) : resolve();
189
+ });
190
+ });
191
+ }
192
+ };
193
+ }
194
+ function seedTables(seed) {
195
+ var tables = {
196
+ user: /* @__PURE__ */new Map(),
197
+ project: /* @__PURE__ */new Map(),
198
+ member: /* @__PURE__ */new Map()
199
+ };
200
+ var _iteratorNormalCompletion = true,
201
+ _didIteratorError = false,
202
+ _iteratorError = void 0;
203
+ try {
204
+ for (var _iterator = tableNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
205
+ var table = _step.value;
206
+ var _iteratorNormalCompletion1 = true,
207
+ _didIteratorError1 = false,
208
+ _iteratorError1 = void 0;
209
+ try {
210
+ for (var _iterator1 = ((seed === null || seed === void 0 ? void 0 : seed[table]) || [])[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
211
+ var row = _step1.value;
212
+ if (typeof row.id === "string") tables[table].set(row.id, cloneRow(row));
213
+ }
214
+ } catch (err) {
215
+ _didIteratorError1 = true;
216
+ _iteratorError1 = err;
217
+ } finally {
218
+ try {
219
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
220
+ _iterator1.return();
221
+ }
222
+ } finally {
223
+ if (_didIteratorError1) {
224
+ throw _iteratorError1;
225
+ }
226
+ }
227
+ }
228
+ }
229
+ } catch (err) {
230
+ _didIteratorError = true;
231
+ _iteratorError = err;
232
+ } finally {
233
+ try {
234
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
235
+ _iterator.return();
236
+ }
237
+ } finally {
238
+ if (_didIteratorError) {
239
+ throw _iteratorError;
240
+ }
241
+ }
242
+ }
243
+ return tables;
244
+ }
245
+ function authenticate(req, tables) {
246
+ var header = req.headers.authorization;
247
+ if (!(header === null || header === void 0 ? void 0 : header.startsWith("Bearer token-"))) return null;
248
+ var userID = header.slice("Bearer token-".length);
249
+ return tables.user.has(userID) ? userID : null;
250
+ }
251
+ function bindClientGroup(clientGroupUsers, clientGroupID, userID) {
252
+ var owner = clientGroupUsers.get(clientGroupID);
253
+ if (owner) return owner === userID;
254
+ clientGroupUsers.set(clientGroupID, userID);
255
+ return true;
256
+ }
257
+ function visibleRowsPatch(tables, userID) {
258
+ var visibleProjectIDs = visibleProjectIDSet(tables, userID);
259
+ var rows = [];
260
+ var user = tables.user.get(userID);
261
+ if (user) rows.push({
262
+ op: "put",
263
+ tableName: "user",
264
+ value: cloneRow(user)
265
+ });
266
+ var _iteratorNormalCompletion = true,
267
+ _didIteratorError = false,
268
+ _iteratorError = void 0;
269
+ try {
270
+ for (var _iterator = tables.project.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
271
+ var project = _step.value;
272
+ if (visibleProjectIDs.has(project.id)) {
273
+ rows.push({
274
+ op: "put",
275
+ tableName: "project",
276
+ value: cloneRow(project)
277
+ });
278
+ }
279
+ }
280
+ } catch (err) {
281
+ _didIteratorError = true;
282
+ _iteratorError = err;
283
+ } finally {
284
+ try {
285
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
286
+ _iterator.return();
287
+ }
288
+ } finally {
289
+ if (_didIteratorError) {
290
+ throw _iteratorError;
291
+ }
292
+ }
293
+ }
294
+ var _iteratorNormalCompletion1 = true,
295
+ _didIteratorError1 = false,
296
+ _iteratorError1 = void 0;
297
+ try {
298
+ for (var _iterator1 = tables.member.values()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
299
+ var member = _step1.value;
300
+ if (visibleProjectIDs.has(member.projectId)) {
301
+ rows.push({
302
+ op: "put",
303
+ tableName: "member",
304
+ value: cloneRow(member)
305
+ });
306
+ }
307
+ }
308
+ } catch (err) {
309
+ _didIteratorError1 = true;
310
+ _iteratorError1 = err;
311
+ } finally {
312
+ try {
313
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
314
+ _iterator1.return();
315
+ }
316
+ } finally {
317
+ if (_didIteratorError1) {
318
+ throw _iteratorError1;
319
+ }
320
+ }
321
+ }
322
+ return rows;
323
+ }
324
+ function visibleProjectIDSet(tables, userID) {
325
+ var projectIDs = /* @__PURE__ */new Set();
326
+ var _iteratorNormalCompletion = true,
327
+ _didIteratorError = false,
328
+ _iteratorError = void 0;
329
+ try {
330
+ for (var _iterator = tables.project.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
331
+ var project = _step.value;
332
+ if (project.ownerId === userID) projectIDs.add(project.id);
333
+ }
334
+ } catch (err) {
335
+ _didIteratorError = true;
336
+ _iteratorError = err;
337
+ } finally {
338
+ try {
339
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
340
+ _iterator.return();
341
+ }
342
+ } finally {
343
+ if (_didIteratorError) {
344
+ throw _iteratorError;
345
+ }
346
+ }
347
+ }
348
+ var _iteratorNormalCompletion1 = true,
349
+ _didIteratorError1 = false,
350
+ _iteratorError1 = void 0;
351
+ try {
352
+ for (var _iterator1 = tables.member.values()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
353
+ var member = _step1.value;
354
+ if (member.userId === userID && tables.project.has(member.projectId)) {
355
+ projectIDs.add(member.projectId);
356
+ }
357
+ }
358
+ } catch (err) {
359
+ _didIteratorError1 = true;
360
+ _iteratorError1 = err;
361
+ } finally {
362
+ try {
363
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
364
+ _iterator1.return();
365
+ }
366
+ } finally {
367
+ if (_didIteratorError1) {
368
+ throw _iteratorError1;
369
+ }
370
+ }
371
+ }
372
+ return projectIDs;
373
+ }
374
+ function findMutationGap(lmids, clientGroupID, mutations) {
375
+ var nextLMIDs = /* @__PURE__ */new Map();
376
+ var _iteratorNormalCompletion = true,
377
+ _didIteratorError = false,
378
+ _iteratorError = void 0;
379
+ try {
380
+ for (var _iterator = mutations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
381
+ var mutation = _step.value;
382
+ var _nextLMIDs_get;
383
+ var current = (_nextLMIDs_get = nextLMIDs.get(mutation.clientID)) !== null && _nextLMIDs_get !== void 0 ? _nextLMIDs_get : lmidFor(lmids, clientGroupID, mutation.clientID);
384
+ if (mutation.id <= current) continue;
385
+ if (mutation.id !== current + 1) {
386
+ return `mutation id gap for ${mutation.clientID}: got ${mutation.id}, expected ${current + 1}`;
387
+ }
388
+ nextLMIDs.set(mutation.clientID, mutation.id);
389
+ }
390
+ } catch (err) {
391
+ _didIteratorError = true;
392
+ _iteratorError = err;
393
+ } finally {
394
+ try {
395
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
396
+ _iterator.return();
397
+ }
398
+ } finally {
399
+ if (_didIteratorError) {
400
+ throw _iteratorError;
401
+ }
402
+ }
403
+ }
404
+ return null;
405
+ }
406
+ function applyMutation(tables, userID, mutation) {
407
+ if (mutation.type !== "custom") return appError("unsupported");
408
+ var args = mutation.args[0] || {};
409
+ if (mutation.name === "project|create") {
410
+ if (tables.project.has(args.id)) return appError("exists");
411
+ if (args.ownerId !== userID) return appError("forbidden");
412
+ tables.project.set(args.id, {
413
+ id: args.id,
414
+ ownerId: args.ownerId,
415
+ name: args.name
416
+ });
417
+ return {};
418
+ }
419
+ if (mutation.name === "project|rename") {
420
+ var project = tables.project.get(args.id);
421
+ if (!project) return appError("not-found");
422
+ if (project.ownerId !== userID) return appError("forbidden");
423
+ tables.project.set(args.id, {
424
+ ...project,
425
+ name: args.name
426
+ });
427
+ return {};
428
+ }
429
+ if (mutation.name === "member|add") {
430
+ var project1 = tables.project.get(args.projectId);
431
+ if (!project1) return appError("not-found");
432
+ if (project1.ownerId !== userID) return appError("forbidden");
433
+ if (tables.member.has(args.id)) return appError("exists");
434
+ tables.member.set(args.id, {
435
+ id: args.id,
436
+ projectId: args.projectId,
437
+ userId: args.userId
438
+ });
439
+ return {};
440
+ }
441
+ if (mutation.name === "member|remove") {
442
+ var member = tables.member.get(args.id);
443
+ if (!member) return appError("not-found");
444
+ var project2 = tables.project.get(member.projectId);
445
+ if (!project2) return appError("not-found");
446
+ if (project2.ownerId !== userID) return appError("forbidden");
447
+ tables.member.delete(args.id);
448
+ return {};
449
+ }
450
+ return appError("unsupported");
451
+ }
452
+ function appError(details) {
453
+ return {
454
+ error: "app",
455
+ details
456
+ };
457
+ }
458
+ function lastMutationIDChanges(lmids, clientGroupID) {
459
+ return Object.fromEntries(lmids.get(clientGroupID) || []);
460
+ }
461
+ function lmidFor(lmids, clientGroupID, clientID) {
462
+ var _lmids_get;
463
+ return ((_lmids_get = lmids.get(clientGroupID)) === null || _lmids_get === void 0 ? void 0 : _lmids_get.get(clientID)) || 0;
464
+ }
465
+ function setLMID(lmids, clientGroupID, clientID, id) {
466
+ var group = lmids.get(clientGroupID);
467
+ if (!group) {
468
+ group = /* @__PURE__ */new Map();
469
+ lmids.set(clientGroupID, group);
470
+ }
471
+ group.set(clientID, id);
472
+ }
473
+ function resultForMutation(results, clientGroupID, clientID, id) {
474
+ var _results_get_get, _results_get;
475
+ return (_results_get = results.get(clientGroupID)) === null || _results_get === void 0 ? void 0 : (_results_get_get = _results_get.get(clientID)) === null || _results_get_get === void 0 ? void 0 : _results_get_get.get(id);
476
+ }
477
+ function setMutationResult(results, clientGroupID, clientID, id, result) {
478
+ var group = results.get(clientGroupID);
479
+ if (!group) {
480
+ group = /* @__PURE__ */new Map();
481
+ results.set(clientGroupID, group);
482
+ }
483
+ var client = group.get(clientID);
484
+ if (!client) {
485
+ client = /* @__PURE__ */new Map();
486
+ group.set(clientID, client);
487
+ }
488
+ client.set(id, result);
489
+ }
490
+ function rowsForTable(tables, table) {
491
+ if (!isTableName(table)) return [];
492
+ return [...tables[table].values()].map(cloneRow);
493
+ }
494
+ function isTableName(table) {
495
+ return tableNames.includes(table);
496
+ }
497
+ function cloneRow(row) {
498
+ return {
499
+ ...row
500
+ };
501
+ }
502
+ async function readJSON(req) {
503
+ var body = "";
504
+ var _iteratorNormalCompletion = true,
505
+ _didIteratorError = false,
506
+ _iteratorError = void 0;
507
+ try {
508
+ for (var _iterator = req[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
509
+ var chunk = _step.value;
510
+ body += chunk;
511
+ }
512
+ } catch (err) {
513
+ _didIteratorError = true;
514
+ _iteratorError = err;
515
+ } finally {
516
+ try {
517
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
518
+ _iterator.return();
519
+ }
520
+ } finally {
521
+ if (_didIteratorError) {
522
+ throw _iteratorError;
523
+ }
524
+ }
525
+ }
526
+ return body ? JSON.parse(body) : {};
527
+ }
528
+ function sendJSON(res, status, body) {
529
+ res.writeHead(status, {
530
+ "content-type": "application/json"
531
+ });
532
+ res.end(JSON.stringify(body));
533
+ }
534
+ //# sourceMappingURL=fixtureServer.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","fixtureServer_exports","__export","startZeroHttpServer","module","exports","import_http","require","_instanceof","left","right","Symbol","hasInstance","tableNames","opts","tables","seedTables","seed","lmids","Map","mutationResults","clientGroupUsers","cookie","server","createServer","req","res","method","sendJSON","error","path","URL","url","pathname","userID","authenticate","body","readJSON","bindClientGroup","clientGroupID","unchanged","lastMutationIDChanges","rowsPatch","op","visibleRowsPatch","body1","mutations","Array","isArray","gap","findMutationGap","pushResults","processedNewMutation","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","iterator","_step","next","done","mutation","current","lmidFor","clientID","id","push","result","resultForMutation","applyMutation","setLMID","setMutationResult","err","return","pushResponse","Error","message","String","Promise","resolve","reject","once","listen","off","address","port","version","rows","table","rowsForTable","close","user","project","member","_iteratorNormalCompletion1","_didIteratorError1","_iteratorError1","_iterator1","_step1","row","set","cloneRow","header","headers","authorization","startsWith","slice","length","has","owner","get","visibleProjectIDs","visibleProjectIDSet","tableName","values","projectId"],"sources":["../../../src/httpPull/fixtureServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,53 @@
1
+ var import_vitest = require("vitest");
2
+ var import_testHarness = require("./testHarness.cjs");
3
+ let harness;
4
+ (0, import_vitest.afterEach)(async () => {
5
+ await harness?.close();
6
+ harness = void 0;
7
+ });
8
+ (0, import_vitest.test)("e2e smoke: stock zero client syncs over http against the fixture server", async () => {
9
+ harness = await (0, import_testHarness.startZeroHttpHarness)({
10
+ seed: {
11
+ user: [{
12
+ id: "u1",
13
+ name: "ada"
14
+ }],
15
+ project: [{
16
+ id: "p1",
17
+ ownerId: "u1",
18
+ name: "first"
19
+ }],
20
+ member: [{
21
+ id: "m1",
22
+ projectId: "p1",
23
+ userId: "u1"
24
+ }]
25
+ }
26
+ });
27
+ const zero = harness.createZero("u1");
28
+ const view = zero.query.project.related("members").materialize();
29
+ const initial = await (0, import_testHarness.waitForComplete)(view);
30
+ (0, import_vitest.expect)(initial).toEqual([{
31
+ id: "p1",
32
+ ownerId: "u1",
33
+ name: "first",
34
+ members: [{
35
+ id: "m1",
36
+ projectId: "p1",
37
+ userId: "u1"
38
+ }]
39
+ }]);
40
+ const mutation = zero.mutate.project.create({
41
+ id: "p2",
42
+ ownerId: "u1",
43
+ name: "second"
44
+ });
45
+ await mutation.client;
46
+ await mutation.server;
47
+ await (0, import_testHarness.eventually)(() => {
48
+ const names = view.data.map(project => project.name).sort();
49
+ (0, import_vitest.expect)(names).toEqual(["first", "second"]);
50
+ });
51
+ (0, import_vitest.expect)(harness.server.rows("project").map(row => row.id).sort()).toEqual(["p1", "p2"]);
52
+ view.destroy();
53
+ });
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ var import_vitest = require("vitest");
4
+ var import_testHarness = require("./testHarness.native.js");
5
+ var harness;
6
+ (0, import_vitest.afterEach)(async function () {
7
+ await (harness === null || harness === void 0 ? void 0 : harness.close());
8
+ harness = void 0;
9
+ });
10
+ (0, import_vitest.test)("e2e smoke: stock zero client syncs over http against the fixture server", async function () {
11
+ harness = await (0, import_testHarness.startZeroHttpHarness)({
12
+ seed: {
13
+ user: [{
14
+ id: "u1",
15
+ name: "ada"
16
+ }],
17
+ project: [{
18
+ id: "p1",
19
+ ownerId: "u1",
20
+ name: "first"
21
+ }],
22
+ member: [{
23
+ id: "m1",
24
+ projectId: "p1",
25
+ userId: "u1"
26
+ }]
27
+ }
28
+ });
29
+ var zero = harness.createZero("u1");
30
+ var view = zero.query.project.related("members").materialize();
31
+ var initial = await (0, import_testHarness.waitForComplete)(view);
32
+ (0, import_vitest.expect)(initial).toEqual([{
33
+ id: "p1",
34
+ ownerId: "u1",
35
+ name: "first",
36
+ members: [{
37
+ id: "m1",
38
+ projectId: "p1",
39
+ userId: "u1"
40
+ }]
41
+ }]);
42
+ var mutation = zero.mutate.project.create({
43
+ id: "p2",
44
+ ownerId: "u1",
45
+ name: "second"
46
+ });
47
+ await mutation.client;
48
+ await mutation.server;
49
+ await (0, import_testHarness.eventually)(function () {
50
+ var names = view.data.map(function (project) {
51
+ return project.name;
52
+ }).sort();
53
+ (0, import_vitest.expect)(names).toEqual(["first", "second"]);
54
+ });
55
+ (0, import_vitest.expect)(harness.server.rows("project").map(function (row) {
56
+ return row.id;
57
+ }).sort()).toEqual(["p1", "p2"]);
58
+ view.destroy();
59
+ });
60
+ //# sourceMappingURL=integration.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["import_vitest","require","import_testHarness","harness","afterEach","close","test","startZeroHttpHarness","seed","user","id","name","project","ownerId","member","projectId","userId","zero","createZero","view","query","related","materialize","initial","waitForComplete","expect","toEqual","members"],"sources":["../../../src/httpPull/integration.test.ts"],"sourcesContent":[null],"mappings":"AAAA;;AAEA,IAAAA,aAAA,GAAAC,OAKO;AAEP,IAAIC,kBAAA,GAAAD,OAAA;AAAA,IAEJE,OAAA;AACE,IAAAH,aAAe,CAAAI,SAAM;EACrB,OAAAD,OAAU,aAAAA,OAAA,uBAAAA,OAAA,CAAAE,KAAA;EACXF,OAAA;AAAA;AAGC,IAAAH,aAAU,CAAAM,IAAM,2EAAqB;EAAAH,OACnC,GAAM,UAAAD,kBAAA,CAAAK,oBAAA;IAAAC,IACJ;MACAC,IAAA,GACA;QACFC,EAAA;QACDC,IAAA;MACK,EAEN;MACAC,OAAM,GACN;QACEF,EAAA;QACMG,OAAA;QACJF,IAAA,EAAS;MACT,EACA;MACFG,MAAA,GACD;QAEKJ,EAAA;QACAK,SAAA;QACJC,MAAS;MACT;IAEF;EACA;EAEA,IAAAC,IAAA,GAAMd,OAAA,CAAAe,UAAA;EACJ,IAAAC,IAAM,GAAAF,IAAA,CAAQG,KAAK,CAAAR,OAAK,CAAIS,OAAC,UAAiB,EAAAC,WAAc,EAAK;EACjE,IAAAC,OAAA,aAAArB,kBAAc,CAAQsB,eAAU,EAAAL,IAAS;EAC3C,CAAC,GAAAnB,aAAA,CAAAyB,MAAA,EAAAF,OAAA,EAAAG,OAAA,EACD;IACEhB,EAAA,MAAQ;IAIRG,OAAS,MAAM;IACjBF,IAAK,SAAQ;IACdgB,OAAA,G","ignoreList":[]}