on-zero 0.4.25 → 0.4.27

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 (140) hide show
  1. package/dist/cjs/createUseQuery.cjs +28 -16
  2. package/dist/cjs/createUseQuery.native.js +42 -30
  3. package/dist/cjs/createUseQuery.native.js.map +1 -1
  4. package/dist/cjs/createZeroClient.cjs +13 -1
  5. package/dist/cjs/createZeroClient.native.js +13 -1
  6. package/dist/cjs/createZeroClient.native.js.map +1 -1
  7. package/dist/cjs/httpPull/auth.test.cjs +197 -0
  8. package/dist/cjs/httpPull/auth.test.native.js +279 -0
  9. package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
  10. package/dist/cjs/httpPull/churn.test.cjs +132 -0
  11. package/dist/cjs/httpPull/churn.test.native.js +155 -0
  12. package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
  13. package/dist/cjs/httpPull/fixtureSchema.cjs +76 -0
  14. package/dist/cjs/httpPull/fixtureSchema.native.js +82 -0
  15. package/dist/cjs/httpPull/fixtureSchema.native.js.map +1 -0
  16. package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
  17. package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
  18. package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
  19. package/dist/cjs/httpPull/integration.test.cjs +53 -0
  20. package/dist/cjs/httpPull/integration.test.native.js +60 -0
  21. package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
  22. package/dist/cjs/httpPull/rebase.test.cjs +360 -0
  23. package/dist/cjs/httpPull/rebase.test.native.js +420 -0
  24. package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
  25. package/dist/cjs/httpPull/relations.test.cjs +107 -0
  26. package/dist/cjs/httpPull/relations.test.native.js +119 -0
  27. package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
  28. package/dist/cjs/httpPull/testHarness.cjs +100 -0
  29. package/dist/cjs/httpPull/testHarness.native.js +112 -0
  30. package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
  31. package/dist/cjs/httpPull/transport.test.cjs +568 -0
  32. package/dist/cjs/httpPull/transport.test.native.js +655 -0
  33. package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
  34. package/dist/cjs/httpPullTransport.cjs +432 -0
  35. package/dist/cjs/httpPullTransport.native.js +695 -0
  36. package/dist/cjs/httpPullTransport.native.js.map +1 -0
  37. package/dist/cjs/index.cjs +1 -0
  38. package/dist/cjs/index.native.js +1 -0
  39. package/dist/cjs/index.native.js.map +1 -1
  40. package/dist/cjs/multiInstanceNested.test.cjs +26 -0
  41. package/dist/cjs/multiInstanceNested.test.native.js +34 -0
  42. package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
  43. package/dist/esm/createUseQuery.mjs +28 -16
  44. package/dist/esm/createUseQuery.mjs.map +1 -1
  45. package/dist/esm/createUseQuery.native.js +42 -30
  46. package/dist/esm/createUseQuery.native.js.map +1 -1
  47. package/dist/esm/createZeroClient.mjs +13 -1
  48. package/dist/esm/createZeroClient.mjs.map +1 -1
  49. package/dist/esm/createZeroClient.native.js +13 -1
  50. package/dist/esm/createZeroClient.native.js.map +1 -1
  51. package/dist/esm/httpPull/auth.test.mjs +198 -0
  52. package/dist/esm/httpPull/auth.test.mjs.map +1 -0
  53. package/dist/esm/httpPull/auth.test.native.js +277 -0
  54. package/dist/esm/httpPull/auth.test.native.js.map +1 -0
  55. package/dist/esm/httpPull/churn.test.mjs +133 -0
  56. package/dist/esm/httpPull/churn.test.mjs.map +1 -0
  57. package/dist/esm/httpPull/churn.test.native.js +153 -0
  58. package/dist/esm/httpPull/churn.test.native.js.map +1 -0
  59. package/dist/esm/httpPull/fixtureSchema.mjs +50 -0
  60. package/dist/esm/httpPull/fixtureSchema.mjs.map +1 -0
  61. package/dist/esm/httpPull/fixtureSchema.native.js +53 -0
  62. package/dist/esm/httpPull/fixtureSchema.native.js.map +1 -0
  63. package/dist/esm/httpPull/fixtureServer.mjs +315 -0
  64. package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
  65. package/dist/esm/httpPull/fixtureServer.native.js +506 -0
  66. package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
  67. package/dist/esm/httpPull/integration.test.mjs +54 -0
  68. package/dist/esm/httpPull/integration.test.mjs.map +1 -0
  69. package/dist/esm/httpPull/integration.test.native.js +58 -0
  70. package/dist/esm/httpPull/integration.test.native.js.map +1 -0
  71. package/dist/esm/httpPull/rebase.test.mjs +361 -0
  72. package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
  73. package/dist/esm/httpPull/rebase.test.native.js +418 -0
  74. package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
  75. package/dist/esm/httpPull/relations.test.mjs +108 -0
  76. package/dist/esm/httpPull/relations.test.mjs.map +1 -0
  77. package/dist/esm/httpPull/relations.test.native.js +117 -0
  78. package/dist/esm/httpPull/relations.test.native.js.map +1 -0
  79. package/dist/esm/httpPull/testHarness.mjs +72 -0
  80. package/dist/esm/httpPull/testHarness.mjs.map +1 -0
  81. package/dist/esm/httpPull/testHarness.native.js +81 -0
  82. package/dist/esm/httpPull/testHarness.native.js.map +1 -0
  83. package/dist/esm/httpPull/transport.test.mjs +569 -0
  84. package/dist/esm/httpPull/transport.test.mjs.map +1 -0
  85. package/dist/esm/httpPull/transport.test.native.js +653 -0
  86. package/dist/esm/httpPull/transport.test.native.js.map +1 -0
  87. package/dist/esm/httpPullTransport.mjs +406 -0
  88. package/dist/esm/httpPullTransport.mjs.map +1 -0
  89. package/dist/esm/httpPullTransport.native.js +666 -0
  90. package/dist/esm/httpPullTransport.native.js.map +1 -0
  91. package/dist/esm/index.js +1 -0
  92. package/dist/esm/index.js.map +1 -1
  93. package/dist/esm/index.mjs +1 -0
  94. package/dist/esm/index.mjs.map +1 -1
  95. package/dist/esm/index.native.js +1 -0
  96. package/dist/esm/index.native.js.map +1 -1
  97. package/dist/esm/multiInstanceNested.test.mjs +27 -1
  98. package/dist/esm/multiInstanceNested.test.mjs.map +1 -1
  99. package/dist/esm/multiInstanceNested.test.native.js +35 -1
  100. package/dist/esm/multiInstanceNested.test.native.js.map +1 -1
  101. package/package.json +2 -2
  102. package/src/createUseQuery.tsx +40 -22
  103. package/src/createZeroClient.tsx +19 -0
  104. package/src/httpPull/auth.test.ts +208 -0
  105. package/src/httpPull/churn.test.ts +147 -0
  106. package/src/httpPull/fixtureSchema.ts +82 -0
  107. package/src/httpPull/fixtureServer.ts +391 -0
  108. package/src/httpPull/integration.test.ts +57 -0
  109. package/src/httpPull/rebase.test.ts +368 -0
  110. package/src/httpPull/relations.test.ts +135 -0
  111. package/src/httpPull/testHarness.ts +95 -0
  112. package/src/httpPull/transport.test.ts +577 -0
  113. package/src/httpPullTransport.ts +559 -0
  114. package/src/index.ts +1 -0
  115. package/src/multiInstanceNested.test.tsx +25 -1
  116. package/types/createUseQuery.d.ts.map +1 -1
  117. package/types/createZeroClient.d.ts +3 -1
  118. package/types/createZeroClient.d.ts.map +1 -1
  119. package/types/httpPull/auth.test.d.ts +2 -0
  120. package/types/httpPull/auth.test.d.ts.map +1 -0
  121. package/types/httpPull/churn.test.d.ts +2 -0
  122. package/types/httpPull/churn.test.d.ts.map +1 -0
  123. package/types/httpPull/fixtureSchema.d.ts +111 -0
  124. package/types/httpPull/fixtureSchema.d.ts.map +1 -0
  125. package/types/httpPull/fixtureServer.d.ts +14 -0
  126. package/types/httpPull/fixtureServer.d.ts.map +1 -0
  127. package/types/httpPull/integration.test.d.ts +2 -0
  128. package/types/httpPull/integration.test.d.ts.map +1 -0
  129. package/types/httpPull/rebase.test.d.ts +2 -0
  130. package/types/httpPull/rebase.test.d.ts.map +1 -0
  131. package/types/httpPull/relations.test.d.ts +2 -0
  132. package/types/httpPull/relations.test.d.ts.map +1 -0
  133. package/types/httpPull/testHarness.d.ts +32 -0
  134. package/types/httpPull/testHarness.d.ts.map +1 -0
  135. package/types/httpPull/transport.test.d.ts +2 -0
  136. package/types/httpPull/transport.test.d.ts.map +1 -0
  137. package/types/httpPullTransport.d.ts +13 -0
  138. package/types/httpPullTransport.d.ts.map +1 -0
  139. package/types/index.d.ts +1 -0
  140. package/types/index.d.ts.map +1 -1
@@ -0,0 +1,506 @@
1
+ import { createServer } from "http";
2
+ function _instanceof(left, right) {
3
+ if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
4
+ return !!right[Symbol.hasInstance](left);
5
+ } else {
6
+ return left instanceof right;
7
+ }
8
+ }
9
+ var tableNames = ["user", "project", "member"];
10
+ async function startZeroHttpServer(opts) {
11
+ var tables = seedTables(opts === null || opts === void 0 ? void 0 : opts.seed);
12
+ var lmids = /* @__PURE__ */new Map();
13
+ var mutationResults = /* @__PURE__ */new Map();
14
+ var clientGroupUsers = /* @__PURE__ */new Map();
15
+ var cookie = 1;
16
+ var server = createServer(async function (req, res) {
17
+ try {
18
+ if (req.method !== "POST") {
19
+ sendJSON(res, 404, {
20
+ error: "not found"
21
+ });
22
+ return;
23
+ }
24
+ var path = new URL(req.url || "/", "http://127.0.0.1").pathname;
25
+ var userID = authenticate(req, tables);
26
+ if (!userID) {
27
+ sendJSON(res, 401, {
28
+ error: "unauthorized"
29
+ });
30
+ return;
31
+ }
32
+ if (path === "/pull") {
33
+ var body = await readJSON(req);
34
+ if (!bindClientGroup(clientGroupUsers, body.clientGroupID, userID)) {
35
+ sendJSON(res, 403, {
36
+ error: "client group belongs to a different user"
37
+ });
38
+ return;
39
+ }
40
+ if (body.cookie === cookie) {
41
+ sendJSON(res, 200, {
42
+ cookie,
43
+ unchanged: true
44
+ });
45
+ return;
46
+ }
47
+ if (typeof body.cookie === "number" && body.cookie > cookie) {
48
+ sendJSON(res, 409, {
49
+ error: `future cookie ${body.cookie} is ahead of server cookie ${cookie}`
50
+ });
51
+ return;
52
+ }
53
+ sendJSON(res, 200, {
54
+ cookie,
55
+ lastMutationIDChanges: lastMutationIDChanges(lmids, body.clientGroupID),
56
+ rowsPatch: [{
57
+ op: "clear"
58
+ }, ...visibleRowsPatch(tables, userID)]
59
+ });
60
+ return;
61
+ }
62
+ if (path === "/push") {
63
+ var body1 = await readJSON(req);
64
+ if (!bindClientGroup(clientGroupUsers, body1.clientGroupID, userID)) {
65
+ sendJSON(res, 403, {
66
+ error: "client group belongs to a different user"
67
+ });
68
+ return;
69
+ }
70
+ var mutations = Array.isArray(body1.mutations) ? body1.mutations : [];
71
+ var gap = findMutationGap(lmids, body1.clientGroupID, mutations);
72
+ if (gap) {
73
+ sendJSON(res, 500, {
74
+ error: gap
75
+ });
76
+ return;
77
+ }
78
+ var pushResults = [];
79
+ var processedNewMutation = false;
80
+ var _iteratorNormalCompletion = true,
81
+ _didIteratorError = false,
82
+ _iteratorError = void 0;
83
+ try {
84
+ for (var _iterator = mutations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
85
+ var mutation = _step.value;
86
+ var current = lmidFor(lmids, body1.clientGroupID, mutation.clientID);
87
+ if (mutation.id <= current) {
88
+ pushResults.push({
89
+ id: {
90
+ clientID: mutation.clientID,
91
+ id: mutation.id
92
+ },
93
+ result: resultForMutation(mutationResults, body1.clientGroupID, mutation.clientID, mutation.id) || {}
94
+ });
95
+ continue;
96
+ }
97
+ var result = applyMutation(tables, userID, mutation);
98
+ setLMID(lmids, body1.clientGroupID, mutation.clientID, mutation.id);
99
+ setMutationResult(mutationResults, body1.clientGroupID, mutation.clientID, mutation.id, result);
100
+ processedNewMutation = true;
101
+ pushResults.push({
102
+ id: {
103
+ clientID: mutation.clientID,
104
+ id: mutation.id
105
+ },
106
+ result
107
+ });
108
+ }
109
+ } catch (err) {
110
+ _didIteratorError = true;
111
+ _iteratorError = err;
112
+ } finally {
113
+ try {
114
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
115
+ _iterator.return();
116
+ }
117
+ } finally {
118
+ if (_didIteratorError) {
119
+ throw _iteratorError;
120
+ }
121
+ }
122
+ }
123
+ if (processedNewMutation) cookie += 1;
124
+ sendJSON(res, 200, {
125
+ pushResponse: {
126
+ mutations: pushResults
127
+ }
128
+ });
129
+ return;
130
+ }
131
+ sendJSON(res, 404, {
132
+ error: "not found"
133
+ });
134
+ } catch (err) {
135
+ sendJSON(res, 500, {
136
+ error: _instanceof(err, Error) ? err.message : String(err)
137
+ });
138
+ }
139
+ });
140
+ await new Promise(function (resolve, reject) {
141
+ server.once("error", reject);
142
+ server.listen(0, "127.0.0.1", function () {
143
+ server.off("error", reject);
144
+ resolve();
145
+ });
146
+ });
147
+ var address = server.address();
148
+ return {
149
+ url: `http://127.0.0.1:${address.port}`,
150
+ version: function () {
151
+ return cookie;
152
+ },
153
+ rows: function (table) {
154
+ return rowsForTable(tables, table);
155
+ },
156
+ close: function () {
157
+ return new Promise(function (resolve, reject) {
158
+ server.close(function (err) {
159
+ return err ? reject(err) : resolve();
160
+ });
161
+ });
162
+ }
163
+ };
164
+ }
165
+ function seedTables(seed) {
166
+ var tables = {
167
+ user: /* @__PURE__ */new Map(),
168
+ project: /* @__PURE__ */new Map(),
169
+ member: /* @__PURE__ */new Map()
170
+ };
171
+ var _iteratorNormalCompletion = true,
172
+ _didIteratorError = false,
173
+ _iteratorError = void 0;
174
+ try {
175
+ for (var _iterator = tableNames[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
176
+ var table = _step.value;
177
+ var _iteratorNormalCompletion1 = true,
178
+ _didIteratorError1 = false,
179
+ _iteratorError1 = void 0;
180
+ try {
181
+ for (var _iterator1 = ((seed === null || seed === void 0 ? void 0 : seed[table]) || [])[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
182
+ var row = _step1.value;
183
+ if (typeof row.id === "string") tables[table].set(row.id, cloneRow(row));
184
+ }
185
+ } catch (err) {
186
+ _didIteratorError1 = true;
187
+ _iteratorError1 = err;
188
+ } finally {
189
+ try {
190
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
191
+ _iterator1.return();
192
+ }
193
+ } finally {
194
+ if (_didIteratorError1) {
195
+ throw _iteratorError1;
196
+ }
197
+ }
198
+ }
199
+ }
200
+ } catch (err) {
201
+ _didIteratorError = true;
202
+ _iteratorError = err;
203
+ } finally {
204
+ try {
205
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
206
+ _iterator.return();
207
+ }
208
+ } finally {
209
+ if (_didIteratorError) {
210
+ throw _iteratorError;
211
+ }
212
+ }
213
+ }
214
+ return tables;
215
+ }
216
+ function authenticate(req, tables) {
217
+ var header = req.headers.authorization;
218
+ if (!(header === null || header === void 0 ? void 0 : header.startsWith("Bearer token-"))) return null;
219
+ var userID = header.slice("Bearer token-".length);
220
+ return tables.user.has(userID) ? userID : null;
221
+ }
222
+ function bindClientGroup(clientGroupUsers, clientGroupID, userID) {
223
+ var owner = clientGroupUsers.get(clientGroupID);
224
+ if (owner) return owner === userID;
225
+ clientGroupUsers.set(clientGroupID, userID);
226
+ return true;
227
+ }
228
+ function visibleRowsPatch(tables, userID) {
229
+ var visibleProjectIDs = visibleProjectIDSet(tables, userID);
230
+ var rows = [];
231
+ var user = tables.user.get(userID);
232
+ if (user) rows.push({
233
+ op: "put",
234
+ tableName: "user",
235
+ value: cloneRow(user)
236
+ });
237
+ var _iteratorNormalCompletion = true,
238
+ _didIteratorError = false,
239
+ _iteratorError = void 0;
240
+ try {
241
+ for (var _iterator = tables.project.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
242
+ var project = _step.value;
243
+ if (visibleProjectIDs.has(project.id)) {
244
+ rows.push({
245
+ op: "put",
246
+ tableName: "project",
247
+ value: cloneRow(project)
248
+ });
249
+ }
250
+ }
251
+ } catch (err) {
252
+ _didIteratorError = true;
253
+ _iteratorError = err;
254
+ } finally {
255
+ try {
256
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
257
+ _iterator.return();
258
+ }
259
+ } finally {
260
+ if (_didIteratorError) {
261
+ throw _iteratorError;
262
+ }
263
+ }
264
+ }
265
+ var _iteratorNormalCompletion1 = true,
266
+ _didIteratorError1 = false,
267
+ _iteratorError1 = void 0;
268
+ try {
269
+ for (var _iterator1 = tables.member.values()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
270
+ var member = _step1.value;
271
+ if (visibleProjectIDs.has(member.projectId)) {
272
+ rows.push({
273
+ op: "put",
274
+ tableName: "member",
275
+ value: cloneRow(member)
276
+ });
277
+ }
278
+ }
279
+ } catch (err) {
280
+ _didIteratorError1 = true;
281
+ _iteratorError1 = err;
282
+ } finally {
283
+ try {
284
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
285
+ _iterator1.return();
286
+ }
287
+ } finally {
288
+ if (_didIteratorError1) {
289
+ throw _iteratorError1;
290
+ }
291
+ }
292
+ }
293
+ return rows;
294
+ }
295
+ function visibleProjectIDSet(tables, userID) {
296
+ var projectIDs = /* @__PURE__ */new Set();
297
+ var _iteratorNormalCompletion = true,
298
+ _didIteratorError = false,
299
+ _iteratorError = void 0;
300
+ try {
301
+ for (var _iterator = tables.project.values()[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
302
+ var project = _step.value;
303
+ if (project.ownerId === userID) projectIDs.add(project.id);
304
+ }
305
+ } catch (err) {
306
+ _didIteratorError = true;
307
+ _iteratorError = err;
308
+ } finally {
309
+ try {
310
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
311
+ _iterator.return();
312
+ }
313
+ } finally {
314
+ if (_didIteratorError) {
315
+ throw _iteratorError;
316
+ }
317
+ }
318
+ }
319
+ var _iteratorNormalCompletion1 = true,
320
+ _didIteratorError1 = false,
321
+ _iteratorError1 = void 0;
322
+ try {
323
+ for (var _iterator1 = tables.member.values()[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true) {
324
+ var member = _step1.value;
325
+ if (member.userId === userID && tables.project.has(member.projectId)) {
326
+ projectIDs.add(member.projectId);
327
+ }
328
+ }
329
+ } catch (err) {
330
+ _didIteratorError1 = true;
331
+ _iteratorError1 = err;
332
+ } finally {
333
+ try {
334
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
335
+ _iterator1.return();
336
+ }
337
+ } finally {
338
+ if (_didIteratorError1) {
339
+ throw _iteratorError1;
340
+ }
341
+ }
342
+ }
343
+ return projectIDs;
344
+ }
345
+ function findMutationGap(lmids, clientGroupID, mutations) {
346
+ var nextLMIDs = /* @__PURE__ */new Map();
347
+ var _iteratorNormalCompletion = true,
348
+ _didIteratorError = false,
349
+ _iteratorError = void 0;
350
+ try {
351
+ for (var _iterator = mutations[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
352
+ var mutation = _step.value;
353
+ var _nextLMIDs_get;
354
+ var current = (_nextLMIDs_get = nextLMIDs.get(mutation.clientID)) !== null && _nextLMIDs_get !== void 0 ? _nextLMIDs_get : lmidFor(lmids, clientGroupID, mutation.clientID);
355
+ if (mutation.id <= current) continue;
356
+ if (mutation.id !== current + 1) {
357
+ return `mutation id gap for ${mutation.clientID}: got ${mutation.id}, expected ${current + 1}`;
358
+ }
359
+ nextLMIDs.set(mutation.clientID, mutation.id);
360
+ }
361
+ } catch (err) {
362
+ _didIteratorError = true;
363
+ _iteratorError = err;
364
+ } finally {
365
+ try {
366
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
367
+ _iterator.return();
368
+ }
369
+ } finally {
370
+ if (_didIteratorError) {
371
+ throw _iteratorError;
372
+ }
373
+ }
374
+ }
375
+ return null;
376
+ }
377
+ function applyMutation(tables, userID, mutation) {
378
+ if (mutation.type !== "custom") return appError("unsupported");
379
+ var args = mutation.args[0] || {};
380
+ if (mutation.name === "project|create") {
381
+ if (tables.project.has(args.id)) return appError("exists");
382
+ if (args.ownerId !== userID) return appError("forbidden");
383
+ tables.project.set(args.id, {
384
+ id: args.id,
385
+ ownerId: args.ownerId,
386
+ name: args.name
387
+ });
388
+ return {};
389
+ }
390
+ if (mutation.name === "project|rename") {
391
+ var project = tables.project.get(args.id);
392
+ if (!project) return appError("not-found");
393
+ if (project.ownerId !== userID) return appError("forbidden");
394
+ tables.project.set(args.id, {
395
+ ...project,
396
+ name: args.name
397
+ });
398
+ return {};
399
+ }
400
+ if (mutation.name === "member|add") {
401
+ var project1 = tables.project.get(args.projectId);
402
+ if (!project1) return appError("not-found");
403
+ if (project1.ownerId !== userID) return appError("forbidden");
404
+ if (tables.member.has(args.id)) return appError("exists");
405
+ tables.member.set(args.id, {
406
+ id: args.id,
407
+ projectId: args.projectId,
408
+ userId: args.userId
409
+ });
410
+ return {};
411
+ }
412
+ if (mutation.name === "member|remove") {
413
+ var member = tables.member.get(args.id);
414
+ if (!member) return appError("not-found");
415
+ var project2 = tables.project.get(member.projectId);
416
+ if (!project2) return appError("not-found");
417
+ if (project2.ownerId !== userID) return appError("forbidden");
418
+ tables.member.delete(args.id);
419
+ return {};
420
+ }
421
+ return appError("unsupported");
422
+ }
423
+ function appError(details) {
424
+ return {
425
+ error: "app",
426
+ details
427
+ };
428
+ }
429
+ function lastMutationIDChanges(lmids, clientGroupID) {
430
+ return Object.fromEntries(lmids.get(clientGroupID) || []);
431
+ }
432
+ function lmidFor(lmids, clientGroupID, clientID) {
433
+ var _lmids_get;
434
+ return ((_lmids_get = lmids.get(clientGroupID)) === null || _lmids_get === void 0 ? void 0 : _lmids_get.get(clientID)) || 0;
435
+ }
436
+ function setLMID(lmids, clientGroupID, clientID, id) {
437
+ var group = lmids.get(clientGroupID);
438
+ if (!group) {
439
+ group = /* @__PURE__ */new Map();
440
+ lmids.set(clientGroupID, group);
441
+ }
442
+ group.set(clientID, id);
443
+ }
444
+ function resultForMutation(results, clientGroupID, clientID, id) {
445
+ var _results_get_get, _results_get;
446
+ 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);
447
+ }
448
+ function setMutationResult(results, clientGroupID, clientID, id, result) {
449
+ var group = results.get(clientGroupID);
450
+ if (!group) {
451
+ group = /* @__PURE__ */new Map();
452
+ results.set(clientGroupID, group);
453
+ }
454
+ var client = group.get(clientID);
455
+ if (!client) {
456
+ client = /* @__PURE__ */new Map();
457
+ group.set(clientID, client);
458
+ }
459
+ client.set(id, result);
460
+ }
461
+ function rowsForTable(tables, table) {
462
+ if (!isTableName(table)) return [];
463
+ return [...tables[table].values()].map(cloneRow);
464
+ }
465
+ function isTableName(table) {
466
+ return tableNames.includes(table);
467
+ }
468
+ function cloneRow(row) {
469
+ return {
470
+ ...row
471
+ };
472
+ }
473
+ async function readJSON(req) {
474
+ var body = "";
475
+ var _iteratorNormalCompletion = true,
476
+ _didIteratorError = false,
477
+ _iteratorError = void 0;
478
+ try {
479
+ for (var _iterator = req[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
480
+ var chunk = _step.value;
481
+ body += chunk;
482
+ }
483
+ } catch (err) {
484
+ _didIteratorError = true;
485
+ _iteratorError = err;
486
+ } finally {
487
+ try {
488
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
489
+ _iterator.return();
490
+ }
491
+ } finally {
492
+ if (_didIteratorError) {
493
+ throw _iteratorError;
494
+ }
495
+ }
496
+ }
497
+ return body ? JSON.parse(body) : {};
498
+ }
499
+ function sendJSON(res, status, body) {
500
+ res.writeHead(status, {
501
+ "content-type": "application/json"
502
+ });
503
+ res.end(JSON.stringify(body));
504
+ }
505
+ export { startZeroHttpServer };
506
+ //# sourceMappingURL=fixtureServer.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createServer","_instanceof","left","right","Symbol","hasInstance","tableNames","startZeroHttpServer","opts","tables","seedTables","seed","lmids","Map","mutationResults","clientGroupUsers","cookie","server","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","value","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,54 @@
1
+ import { afterEach, expect, test } from "vitest";
2
+ import { eventually, startZeroHttpHarness, waitForComplete } from "./testHarness.mjs";
3
+ let harness;
4
+ afterEach(async () => {
5
+ await harness?.close();
6
+ harness = void 0;
7
+ });
8
+ test("e2e smoke: stock zero client syncs over http against the fixture server", async () => {
9
+ harness = await 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 waitForComplete(view);
30
+ 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 eventually(() => {
48
+ const names = view.data.map(project => project.name).sort();
49
+ expect(names).toEqual(["first", "second"]);
50
+ });
51
+ expect(harness.server.rows("project").map(row => row.id).sort()).toEqual(["p1", "p2"]);
52
+ view.destroy();
53
+ });
54
+ //# sourceMappingURL=integration.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["afterEach","expect","test","eventually","startZeroHttpHarness","waitForComplete","harness","close","seed","user","id","name","project","ownerId","member","projectId","userId","zero","createZero","view","query","related","materialize","initial","toEqual","members","mutation","mutate","create","client","server","names","data","map","sort","rows","row","destroy"],"sources":["../../../src/httpPull/integration.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,MAAA,EAAQC,IAAA,QAAY;AAExC,SACEC,UAAA,EACAC,oBAAA,EACAC,eAAA,QAEK;AAEP,IAAIC,OAAA;AAEJN,SAAA,CAAU,YAAY;EACpB,MAAMM,OAAA,EAASC,KAAA,CAAM;EACrBD,OAAA,GAAU;AACZ,CAAC;AAEDJ,IAAA,CAAK,2EAA2E,YAAY;EAC1FI,OAAA,GAAU,MAAMF,oBAAA,CAAqB;IACnCI,IAAA,EAAM;MACJC,IAAA,EAAM,CAAC;QAAEC,EAAA,EAAI;QAAMC,IAAA,EAAM;MAAM,CAAC;MAChCC,OAAA,EAAS,CAAC;QAAEF,EAAA,EAAI;QAAMG,OAAA,EAAS;QAAMF,IAAA,EAAM;MAAQ,CAAC;MACpDG,MAAA,EAAQ,CAAC;QAAEJ,EAAA,EAAI;QAAMK,SAAA,EAAW;QAAMC,MAAA,EAAQ;MAAK,CAAC;IACtD;EACF,CAAC;EACD,MAAMC,IAAA,GAAOX,OAAA,CAAQY,UAAA,CAAW,IAAI;EAEpC,MAAMC,IAAA,GAAOF,IAAA,CAAKG,KAAA,CAAMR,OAAA,CAAQS,OAAA,CAAQ,SAAS,EAAEC,WAAA,CAAY;EAC/D,MAAMC,OAAA,GAAU,MAAMlB,eAAA,CAAuBc,IAAI;EACjDlB,MAAA,CAAOsB,OAAO,EAAEC,OAAA,CAAQ,CACtB;IACEd,EAAA,EAAI;IACJG,OAAA,EAAS;IACTF,IAAA,EAAM;IACNc,OAAA,EAAS,CAAC;MAAEf,EAAA,EAAI;MAAMK,SAAA,EAAW;MAAMC,MAAA,EAAQ;IAAK,CAAC;EACvD,EACD;EAED,MAAMU,QAAA,GAAWT,IAAA,CAAKU,MAAA,CAAOf,OAAA,CAAQgB,MAAA,CAAO;IAC1ClB,EAAA,EAAI;IACJG,OAAA,EAAS;IACTF,IAAA,EAAM;EACR,CAAC;EACD,MAAMe,QAAA,CAASG,MAAA;EACf,MAAMH,QAAA,CAASI,MAAA;EAEf,MAAM3B,UAAA,CAAW,MAAM;IACrB,MAAM4B,KAAA,GAAQZ,IAAA,CAAKa,IAAA,CAAKC,GAAA,CAAKrB,OAAA,IAAiBA,OAAA,CAAQD,IAAI,EAAEuB,IAAA,CAAK;IACjEjC,MAAA,CAAO8B,KAAK,EAAEP,OAAA,CAAQ,CAAC,SAAS,QAAQ,CAAC;EAC3C,CAAC;EACDvB,MAAA,CACEK,OAAA,CAAQwB,MAAA,CACLK,IAAA,CAAK,SAAS,EACdF,GAAA,CAAKG,GAAA,IAAQA,GAAA,CAAI1B,EAAE,EACnBwB,IAAA,CAAK,CACV,EAAEV,OAAA,CAAQ,CAAC,MAAM,IAAI,CAAC;EACtBL,IAAA,CAAKkB,OAAA,CAAQ;AACf,CAAC","ignoreList":[]}
@@ -0,0 +1,58 @@
1
+ import { afterEach, expect, test } from "vitest";
2
+ import { eventually, startZeroHttpHarness, waitForComplete } from "./testHarness.native.js";
3
+ var harness;
4
+ afterEach(async function () {
5
+ await (harness === null || harness === void 0 ? void 0 : harness.close());
6
+ harness = void 0;
7
+ });
8
+ test("e2e smoke: stock zero client syncs over http against the fixture server", async function () {
9
+ harness = await 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
+ var zero = harness.createZero("u1");
28
+ var view = zero.query.project.related("members").materialize();
29
+ var initial = await waitForComplete(view);
30
+ 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
+ var 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 eventually(function () {
48
+ var names = view.data.map(function (project) {
49
+ return project.name;
50
+ }).sort();
51
+ expect(names).toEqual(["first", "second"]);
52
+ });
53
+ expect(harness.server.rows("project").map(function (row) {
54
+ return row.id;
55
+ }).sort()).toEqual(["p1", "p2"]);
56
+ view.destroy();
57
+ });
58
+ //# sourceMappingURL=integration.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["afterEach","expect","test","eventually","startZeroHttpHarness","waitForComplete","harness","close","seed","user","id","name","project","ownerId","member","projectId","userId","zero","createZero","view","query","related","materialize","initial","toEqual","members"],"sources":["../../../src/httpPull/integration.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,SAAA,EAAWC,MAAA,EAAQC,IAAA,QAAY;AAExC,SAAAC,UAAA,EAAAC,oBAAA,EAAAC,eAAA;AAAA,IACEC,OAAA;AAAAN,SACA;EACA,OAAAM,OAAA,aAAAA,OAAA,uBAAAA,OAAA,CAAAC,KAAA;EAAAD,OAEK;AAEP;AAEAJ,IAAA,0EAAsB;EACpBI,OAAM,SAASF,oBAAM;IACrBI,IAAA;MACDC,IAAA,GAEI;QACHC,EAAU,MAAM;QACRC,IAAA;MACJ,EACA;MACAC,OAAA,EAAS,CACX;QACDF,EAAA;QACKG,OAAO,MAAQ;QAEfF,IAAA,EAAO;MACP,EACN;MACEG,MAAA,GACE;QACAJ,EAAA,MAAS;QACTK,SAAM;QACNC,MAAU,EAAE;MACd;IAGF;EAA4C,EAC1C;EAAI,IACJC,IAAA,GAASX,OAAA,CAAAY,UAAA;EAAA,IACTC,IAAM,GAAAF,IAAA,CAAAG,KAAA,CAAAR,OAAA,CAAAS,OAAA,YAAAC,WAAA;EACR,IAACC,OAAA,SAAAlB,eAAA,CAAAc,IAAA;EACDlB,MAAM,CAAAsB,OAAA,CAAS,CAAAC,OAAA,EACf;IAEAd,EAAM;IACJG,OAAM,MAAQ;IACdF,IAAA,EAAO,OAAO;IACfc,OAAA,GACD;MACEf,EAAQ;MAIRK,SAAe,MAAK;MACjBC,MAAQ;IACd","ignoreList":[]}