on-zero 0.4.26 → 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 (123) hide show
  1. package/dist/cjs/createZeroClient.cjs +13 -1
  2. package/dist/cjs/createZeroClient.native.js +13 -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 +568 -0
  29. package/dist/cjs/httpPull/transport.test.native.js +655 -0
  30. package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
  31. package/dist/cjs/httpPullTransport.cjs +432 -0
  32. package/dist/cjs/httpPullTransport.native.js +695 -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 +13 -1
  38. package/dist/esm/createZeroClient.mjs.map +1 -1
  39. package/dist/esm/createZeroClient.native.js +13 -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 +569 -0
  74. package/dist/esm/httpPull/transport.test.mjs.map +1 -0
  75. package/dist/esm/httpPull/transport.test.native.js +653 -0
  76. package/dist/esm/httpPull/transport.test.native.js.map +1 -0
  77. package/dist/esm/httpPullTransport.mjs +406 -0
  78. package/dist/esm/httpPullTransport.mjs.map +1 -0
  79. package/dist/esm/httpPullTransport.native.js +666 -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 +19 -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 +577 -0
  98. package/src/httpPullTransport.ts +559 -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,655 @@
1
+ "use strict";
2
+
3
+ var import_zero = require("@rocicorp/zero");
4
+ var import_vitest = require("vitest");
5
+ var import_fixtureSchema = require("./fixtureSchema.native.js");
6
+ var import_httpPullTransport = require("../httpPullTransport.native.js");
7
+ function _class_call_check(instance, Constructor) {
8
+ if (!(instance instanceof Constructor)) {
9
+ throw new TypeError("Cannot call a class as a function");
10
+ }
11
+ }
12
+ function _define_property(obj, key, value) {
13
+ if (key in obj) {
14
+ Object.defineProperty(obj, key, {
15
+ value,
16
+ enumerable: true,
17
+ configurable: true,
18
+ writable: true
19
+ });
20
+ } else {
21
+ obj[key] = value;
22
+ }
23
+ return obj;
24
+ }
25
+ var ORIGIN = "https://zero-http.local";
26
+ var zeros = [];
27
+ var transports = [];
28
+ var storageID = 0;
29
+ (0, import_vitest.afterEach)(async function () {
30
+ var _zeros_pop, _transports_pop;
31
+ while (zeros.length) await ((_zeros_pop = zeros.pop()) === null || _zeros_pop === void 0 ? void 0 : _zeros_pop.close());
32
+ while (transports.length) (_transports_pop = transports.pop()) === null || _transports_pop === void 0 ? void 0 : _transports_pop.uninstall();
33
+ import_vitest.vi.useRealTimers();
34
+ });
35
+ (0, import_vitest.describe)("zero-http transport", function () {
36
+ (0, import_vitest.test)("connect + complete hydrates a stock Zero materialized query", async function () {
37
+ var requests = [];
38
+ var cookie = 0;
39
+ var fetch = import_vitest.vi.fn(async function (input, init) {
40
+ var request = recordRequest(input, init);
41
+ requests.push(request);
42
+ (0, import_vitest.expect)(request.path).toBe("/pull");
43
+ (0, import_vitest.expect)(request.headers.authorization).toBe("Bearer token-u1");
44
+ return jsonResponse({
45
+ cookie: ++cookie,
46
+ lastMutationIDChanges: {},
47
+ rowsPatch: [{
48
+ op: "clear"
49
+ }, {
50
+ op: "put",
51
+ tableName: "user",
52
+ value: {
53
+ id: "u1",
54
+ name: "ada"
55
+ }
56
+ }, {
57
+ op: "put",
58
+ tableName: "project",
59
+ value: {
60
+ id: "p1",
61
+ ownerId: "u1",
62
+ name: "control"
63
+ }
64
+ }, {
65
+ op: "put",
66
+ tableName: "member",
67
+ value: {
68
+ id: "m1",
69
+ projectId: "p1",
70
+ userId: "u1"
71
+ }
72
+ }]
73
+ });
74
+ });
75
+ var transport = install(fetch);
76
+ var zero = createZero();
77
+ var view = zero.query.project.related("members").materialize();
78
+ var data = await waitForComplete(view);
79
+ view.destroy();
80
+ (0, import_vitest.expect)(transport.connections).toBe(1);
81
+ (0, import_vitest.expect)(data).toEqual([{
82
+ id: "p1",
83
+ ownerId: "u1",
84
+ name: "control",
85
+ members: [{
86
+ id: "m1",
87
+ projectId: "p1",
88
+ userId: "u1"
89
+ }]
90
+ }]);
91
+ (0, import_vitest.expect)(requests[0].body.cookie).toBeNull();
92
+ (0, import_vitest.expect)(requests[0].body.clientID).toEqual(import_vitest.expect.any(String));
93
+ (0, import_vitest.expect)(requests[0].body.clientGroupID).toEqual(import_vitest.expect.any(String));
94
+ });
95
+ (0, import_vitest.test)("push frames POST to /push, resolve server promises, and schedule a follow-up pull", async function () {
96
+ var requests = [];
97
+ var fetch = import_vitest.vi.fn(async function (input, init) {
98
+ var request = recordRequest(input, init);
99
+ requests.push(request);
100
+ if (request.path === "/pull") {
101
+ return jsonResponse({
102
+ cookie: request.body.cookie,
103
+ unchanged: true
104
+ });
105
+ }
106
+ (0, import_vitest.expect)(request.path).toBe("/push");
107
+ var mutation2 = request.body.mutations[0];
108
+ return jsonResponse({
109
+ pushResponse: {
110
+ mutations: [{
111
+ id: {
112
+ clientID: mutation2.clientID,
113
+ id: mutation2.id
114
+ },
115
+ result: {}
116
+ }]
117
+ }
118
+ });
119
+ });
120
+ install(fetch);
121
+ var zero = createZero();
122
+ await eventually(function () {
123
+ return (0, import_vitest.expect)(requests.filter(function (request) {
124
+ return request.path === "/pull";
125
+ }).length).toBe(1);
126
+ });
127
+ var pullsBeforePush = requests.filter(function (request) {
128
+ return request.path === "/pull";
129
+ }).length;
130
+ var mutation = zero.mutate.project.create({
131
+ id: "p1",
132
+ ownerId: "u1",
133
+ name: "created"
134
+ });
135
+ await mutation.client;
136
+ await mutation.server;
137
+ var push = requests.find(function (request) {
138
+ return request.path === "/push";
139
+ });
140
+ (0, import_vitest.expect)(push === null || push === void 0 ? void 0 : push.headers.authorization).toBe("Bearer token-u1");
141
+ (0, import_vitest.expect)(push === null || push === void 0 ? void 0 : push.body).toMatchObject({
142
+ clientGroupID: import_vitest.expect.any(String),
143
+ pushVersion: 1,
144
+ requestID: import_vitest.expect.any(String),
145
+ mutations: [{
146
+ type: "custom",
147
+ name: "project|create",
148
+ id: 1,
149
+ clientID: import_vitest.expect.any(String),
150
+ args: [{
151
+ id: "p1",
152
+ ownerId: "u1",
153
+ name: "created"
154
+ }]
155
+ }]
156
+ });
157
+ await eventually(function () {
158
+ return (0, import_vitest.expect)(requests.filter(function (request) {
159
+ return request.path === "/pull";
160
+ }).length).toBe(pullsBeforePush + 1);
161
+ });
162
+ });
163
+ (0, import_vitest.test)("updateAuth frame updates bearer headers for later requests", async function () {
164
+ var _requests_at;
165
+ var requests = [];
166
+ var fetch = import_vitest.vi.fn(async function (input, init) {
167
+ var request = recordRequest(input, init);
168
+ requests.push(request);
169
+ (0, import_vitest.expect)(request.path).toBe("/pull");
170
+ return jsonResponse({
171
+ cookie: request.body.cookie,
172
+ unchanged: true
173
+ });
174
+ });
175
+ var transport = install(fetch);
176
+ var {
177
+ socket
178
+ } = openRawSocketWithMessages({
179
+ authToken: "token-old"
180
+ });
181
+ await eventually(function () {
182
+ return (0, import_vitest.expect)(requests.length).toBe(1);
183
+ });
184
+ (0, import_vitest.expect)(requests[0].headers.authorization).toBe("Bearer token-old");
185
+ socket.send(JSON.stringify(["updateAuth", {
186
+ auth: "token-new"
187
+ }]));
188
+ await transport.pull();
189
+ (0, import_vitest.expect)((_requests_at = requests.at(-1)) === null || _requests_at === void 0 ? void 0 : _requests_at.headers.authorization).toBe("Bearer token-new");
190
+ });
191
+ (0, import_vitest.test)("push frames are serialized per socket", async function () {
192
+ var firstPushStarted = defer();
193
+ var releaseFirstPush = defer();
194
+ var pushIDs = [];
195
+ var fetch = import_vitest.vi.fn(async function (input, init) {
196
+ var request = recordRequest(input, init);
197
+ if (request.path === "/pull") {
198
+ return jsonResponse({
199
+ cookie: request.body.cookie,
200
+ unchanged: true
201
+ });
202
+ }
203
+ (0, import_vitest.expect)(request.path).toBe("/push");
204
+ var mutationID = request.body.mutations[0].id;
205
+ pushIDs.push(mutationID);
206
+ if (mutationID === 1) {
207
+ firstPushStarted.resolve();
208
+ await releaseFirstPush.promise;
209
+ }
210
+ return jsonResponse({
211
+ pushResponse: {
212
+ mutations: request.body.mutations.map(function (mutation) {
213
+ return {
214
+ id: {
215
+ clientID: mutation.clientID,
216
+ id: mutation.id
217
+ },
218
+ result: {}
219
+ };
220
+ })
221
+ }
222
+ });
223
+ });
224
+ install(fetch);
225
+ var {
226
+ messages,
227
+ socket
228
+ } = openRawSocketWithMessages();
229
+ await eventually(function () {
230
+ return (0, import_vitest.expect)(messages.some(function (message) {
231
+ return message[0] === "connected";
232
+ })).toBe(true);
233
+ });
234
+ socket.send(JSON.stringify(["push", pushBody(1)]));
235
+ await firstPushStarted.promise;
236
+ socket.send(JSON.stringify(["push", pushBody(2)]));
237
+ await sleep(25);
238
+ (0, import_vitest.expect)(pushIDs).toEqual([1]);
239
+ releaseFirstPush.resolve();
240
+ await eventually(function () {
241
+ return (0, import_vitest.expect)(pushIDs).toEqual([1, 2]);
242
+ });
243
+ await eventually(function () {
244
+ return (0, import_vitest.expect)(messages.filter(function (message) {
245
+ return message[0] === "pushResponse";
246
+ })).toHaveLength(2);
247
+ });
248
+ (0, import_vitest.expect)(messages.filter(function (message) {
249
+ return message[0] === "pushResponse";
250
+ }).map(function (message) {
251
+ return message[1].mutations[0].id.id;
252
+ })).toEqual([1, 2]);
253
+ });
254
+ (0, import_vitest.test)("cookie discipline skips unchanged pokes, chains changed pokes, and coalesces concurrent pulls", async function () {
255
+ var requests = [];
256
+ var responses = [{
257
+ cookie: 1,
258
+ lastMutationIDChanges: {},
259
+ rowsPatch: [{
260
+ op: "clear"
261
+ }]
262
+ }, {
263
+ cookie: 1,
264
+ unchanged: true
265
+ }, {
266
+ cookie: 2,
267
+ lastMutationIDChanges: {},
268
+ rowsPatch: [{
269
+ op: "clear"
270
+ }, {
271
+ op: "put",
272
+ tableName: "project",
273
+ value: {
274
+ id: "p2",
275
+ ownerId: "u1",
276
+ name: "second"
277
+ }
278
+ }]
279
+ }, {
280
+ cookie: 3,
281
+ lastMutationIDChanges: {},
282
+ rowsPatch: [{
283
+ op: "clear"
284
+ }, {
285
+ op: "put",
286
+ tableName: "project",
287
+ value: {
288
+ id: "p3",
289
+ ownerId: "u1",
290
+ name: "third"
291
+ }
292
+ }]
293
+ }];
294
+ var deferred = defer();
295
+ responses.push(deferred.promise);
296
+ var inFlight = 0;
297
+ var maxInFlight = 0;
298
+ var fetch = import_vitest.vi.fn(async function (input, init) {
299
+ inFlight++;
300
+ maxInFlight = Math.max(maxInFlight, inFlight);
301
+ try {
302
+ var request = recordRequest(input, init);
303
+ requests.push(request);
304
+ var response = responses.shift();
305
+ if (!response) throw new Error("missing canned response");
306
+ return jsonResponse(await response);
307
+ } finally {
308
+ inFlight--;
309
+ }
310
+ });
311
+ var transport = install(fetch);
312
+ var messages = openRawSocket();
313
+ await eventually(function () {
314
+ return (0, import_vitest.expect)(messages.some(function (message) {
315
+ return message[0] === "pokeEnd";
316
+ })).toBe(true);
317
+ });
318
+ (0, import_vitest.expect)(requests[0].body.cookie).toBeNull();
319
+ (0, import_vitest.expect)(findMessage(messages, "pokeStart")[1].baseCookie).toBeNull();
320
+ (0, import_vitest.expect)(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000001");
321
+ messages.length = 0;
322
+ await transport.pull();
323
+ (0, import_vitest.expect)(messages.filter(function (message) {
324
+ return message[0].startsWith("poke");
325
+ })).toEqual([]);
326
+ (0, import_vitest.expect)(requests[1].body.cookie).toBe(1);
327
+ await transport.pull();
328
+ (0, import_vitest.expect)(findMessage(messages, "pokeStart")[1].baseCookie).toBe("00000000000000000001");
329
+ (0, import_vitest.expect)(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000002");
330
+ (0, import_vitest.expect)(requests[2].body.cookie).toBe(1);
331
+ messages.length = 0;
332
+ await transport.pull();
333
+ (0, import_vitest.expect)(findMessage(messages, "pokeStart")[1].baseCookie).toBe("00000000000000000002");
334
+ (0, import_vitest.expect)(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000003");
335
+ (0, import_vitest.expect)(requests[3].body.cookie).toBe(2);
336
+ messages.length = 0;
337
+ var concurrentA = transport.pull();
338
+ var concurrentB = transport.pull();
339
+ await eventually(function () {
340
+ return (0, import_vitest.expect)(requests.length).toBe(5);
341
+ });
342
+ deferred.resolve({
343
+ cookie: 4,
344
+ lastMutationIDChanges: {},
345
+ rowsPatch: [{
346
+ op: "clear"
347
+ }]
348
+ });
349
+ await Promise.all([concurrentA, concurrentB]);
350
+ (0, import_vitest.expect)(requests.length).toBe(5);
351
+ (0, import_vitest.expect)(maxInFlight).toBe(1);
352
+ (0, import_vitest.expect)(findMessage(messages, "pokeStart")[1].baseCookie).toBe("00000000000000000003");
353
+ (0, import_vitest.expect)(findMessage(messages, "pokeEnd")[1].cookie).toBe("00000000000000000004");
354
+ });
355
+ (0, import_vitest.test)("unchanged pull flushes late query registration to complete", async function () {
356
+ var _requests_at;
357
+ var requests = [];
358
+ var fetch = import_vitest.vi.fn(async function (input, init) {
359
+ var request = recordRequest(input, init);
360
+ requests.push(request);
361
+ (0, import_vitest.expect)(request.path).toBe("/pull");
362
+ if (request.body.cookie === null) {
363
+ return jsonResponse({
364
+ cookie: 1,
365
+ lastMutationIDChanges: {},
366
+ rowsPatch: [{
367
+ op: "clear"
368
+ }, {
369
+ op: "put",
370
+ tableName: "user",
371
+ value: {
372
+ id: "u1",
373
+ name: "ada"
374
+ }
375
+ }, {
376
+ op: "put",
377
+ tableName: "project",
378
+ value: {
379
+ id: "p1",
380
+ ownerId: "u1",
381
+ name: "first"
382
+ }
383
+ }]
384
+ });
385
+ }
386
+ return jsonResponse({
387
+ cookie: request.body.cookie,
388
+ unchanged: true
389
+ });
390
+ });
391
+ install(fetch);
392
+ var zero = createZero();
393
+ var projectView = zero.query.project.materialize();
394
+ await waitForComplete(projectView);
395
+ var userView = zero.query.user.materialize();
396
+ var users = await waitForComplete(userView);
397
+ (0, import_vitest.expect)(users).toEqual([{
398
+ id: "u1",
399
+ name: "ada"
400
+ }]);
401
+ (0, import_vitest.expect)((_requests_at = requests.at(-1)) === null || _requests_at === void 0 ? void 0 : _requests_at.body.cookie).toBe(1);
402
+ projectView.destroy();
403
+ userView.destroy();
404
+ });
405
+ (0, import_vitest.test)("ping is answered locally and the stock Zero connection survives idle ping", async function () {
406
+ var fetch = import_vitest.vi.fn(async function (input, init) {
407
+ var request = recordRequest(input, init);
408
+ (0, import_vitest.expect)(request.path).toBe("/pull");
409
+ return jsonResponse({
410
+ cookie: request.body.cookie,
411
+ unchanged: true
412
+ });
413
+ });
414
+ var transport = install(fetch);
415
+ var zero = createZero({
416
+ pingTimeoutMs: 10
417
+ });
418
+ await eventually(function () {
419
+ return (0, import_vitest.expect)(zero.connection.state.current.name).toBe("connected");
420
+ });
421
+ await sleep(40);
422
+ (0, import_vitest.expect)(zero.connection.state.current.name).toBe("connected");
423
+ (0, import_vitest.expect)(transport.connections).toBe(1);
424
+ });
425
+ (0, import_vitest.test)("401 pull failure closes the fake socket without materializing data", async function () {
426
+ var requests = [];
427
+ var fetch = import_vitest.vi.fn(async function (input, init) {
428
+ var request = recordRequest(input, init);
429
+ requests.push(request);
430
+ (0, import_vitest.expect)(request.path).toBe("/pull");
431
+ return jsonResponse({
432
+ error: "unauthorized"
433
+ }, {
434
+ status: 401
435
+ });
436
+ });
437
+ var transport = install(fetch);
438
+ var zero = createZero();
439
+ var view = zero.query.project.materialize();
440
+ var emissions = [];
441
+ var cleanup = view.addListener(function (data, resultType) {
442
+ emissions.push({
443
+ data: JSON.parse(JSON.stringify(data)),
444
+ resultType
445
+ });
446
+ });
447
+ await eventually(function () {
448
+ return (0, import_vitest.expect)(requests.length).toBeGreaterThan(0);
449
+ });
450
+ await eventually(function () {
451
+ return (0, import_vitest.expect)(zero.connection.state.current.name).toBe("needs-auth");
452
+ });
453
+ await sleep(25);
454
+ (0, import_vitest.expect)(transport.connections).toBe(0);
455
+ (0, import_vitest.expect)(emissions.flatMap(function (emission) {
456
+ return emission.data;
457
+ })).toEqual([]);
458
+ (0, import_vitest.expect)(view.data).toEqual([]);
459
+ cleanup();
460
+ view.destroy();
461
+ });
462
+ (0, import_vitest.test)("non-origin WebSockets pass through to the native implementation", function () {
463
+ var previous = globalThis.WebSocket;
464
+ var NativeWebSocket = function NativeWebSocket2(url, protocols) {
465
+ "use strict";
466
+
467
+ _class_call_check(this, NativeWebSocket2);
468
+ _define_property(this, "url", void 0);
469
+ _define_property(this, "protocols", void 0);
470
+ this.url = url;
471
+ this.protocols = protocols;
472
+ };
473
+ _define_property(NativeWebSocket, "CONNECTING", 0);
474
+ _define_property(NativeWebSocket, "OPEN", 1);
475
+ _define_property(NativeWebSocket, "CLOSING", 2);
476
+ _define_property(NativeWebSocket, "CLOSED", 3);
477
+ globalThis.WebSocket = NativeWebSocket;
478
+ var transport = (0, import_httpPullTransport.installHttpPullTransport)({
479
+ origin: ORIGIN,
480
+ fetch: import_vitest.vi.fn()
481
+ });
482
+ var socket = new WebSocket("wss://elsewhere.local/socket", "native");
483
+ (0, import_vitest.expect)(socket).toBeInstanceOf(NativeWebSocket);
484
+ (0, import_vitest.expect)(socket.url).toBe("wss://elsewhere.local/socket");
485
+ transport.uninstall();
486
+ (0, import_vitest.expect)(globalThis.WebSocket).toBe(NativeWebSocket);
487
+ globalThis.WebSocket = previous;
488
+ });
489
+ (0, import_vitest.test)("ensureHttpPullTransport installs once per origin", function () {
490
+ var origin = "http://127.0.0.1:65501";
491
+ var first = (0, import_httpPullTransport.ensureHttpPullTransport)({
492
+ origin,
493
+ fetch: import_vitest.vi.fn()
494
+ });
495
+ var second = (0, import_httpPullTransport.ensureHttpPullTransport)({
496
+ origin,
497
+ fetch: import_vitest.vi.fn()
498
+ });
499
+ (0, import_vitest.expect)(second).toBe(first);
500
+ first.uninstall();
501
+ });
502
+ });
503
+ function install(fetch) {
504
+ var transport = (0, import_httpPullTransport.installHttpPullTransport)({
505
+ origin: ORIGIN,
506
+ fetch
507
+ });
508
+ transports.push(transport);
509
+ return transport;
510
+ }
511
+ function createZero() {
512
+ var options = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
513
+ var zero = new import_zero.Zero({
514
+ server: ORIGIN,
515
+ userID: "u1",
516
+ auth: "token-u1",
517
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
518
+ kvStore: "mem",
519
+ storageKey: `zero-http-test-${++storageID}`,
520
+ mutators: import_fixtureSchema.zeroHttpFixtureMutators,
521
+ pingTimeoutMs: options.pingTimeoutMs
522
+ });
523
+ zeros.push(zero);
524
+ return zero;
525
+ }
526
+ function recordRequest(input, init) {
527
+ var url = new URL(String(input));
528
+ var _init_headers;
529
+ var headers = Object.fromEntries(Object.entries((_init_headers = init === null || init === void 0 ? void 0 : init.headers) !== null && _init_headers !== void 0 ? _init_headers : {}).map(function (param) {
530
+ var [key, value] = param;
531
+ return [key.toLowerCase(), value];
532
+ }));
533
+ return {
534
+ url: url.toString(),
535
+ path: url.pathname,
536
+ headers,
537
+ body: (init === null || init === void 0 ? void 0 : init.body) ? JSON.parse(String(init.body)) : void 0
538
+ };
539
+ }
540
+ function jsonResponse(body, init) {
541
+ var _init_status;
542
+ return new Response(JSON.stringify(body), {
543
+ status: (_init_status = init === null || init === void 0 ? void 0 : init.status) !== null && _init_status !== void 0 ? _init_status : 200,
544
+ statusText: init === null || init === void 0 ? void 0 : init.statusText,
545
+ headers: {
546
+ "content-type": "application/json",
547
+ ...(init === null || init === void 0 ? void 0 : init.headers)
548
+ }
549
+ });
550
+ }
551
+ async function waitForComplete(view) {
552
+ return new Promise(function (resolve, reject) {
553
+ var timeout = setTimeout(function () {
554
+ return reject(new Error("timed out waiting for complete query"));
555
+ }, 5e3);
556
+ var cleanup = function () {};
557
+ cleanup = view.addListener(function (data, resultType) {
558
+ if (resultType !== "complete") return;
559
+ clearTimeout(timeout);
560
+ cleanup();
561
+ resolve(JSON.parse(JSON.stringify(data)));
562
+ });
563
+ });
564
+ }
565
+ async function eventually(assertion) {
566
+ var timeout = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : 1e3;
567
+ var started = Date.now();
568
+ var lastError;
569
+ while (Date.now() - started < timeout) {
570
+ try {
571
+ await assertion();
572
+ return;
573
+ } catch (error) {
574
+ lastError = error;
575
+ await sleep(10);
576
+ }
577
+ }
578
+ throw lastError;
579
+ }
580
+ function sleep(ms) {
581
+ return new Promise(function (resolve) {
582
+ return setTimeout(resolve, ms);
583
+ });
584
+ }
585
+ function openRawSocket() {
586
+ return openRawSocketWithMessages().messages;
587
+ }
588
+ function openRawSocketWithMessages(opts) {
589
+ var url = new URL(`${ORIGIN}/sync/v51/connect`);
590
+ url.protocol = "wss:";
591
+ url.searchParams.set("clientID", "c1");
592
+ url.searchParams.set("clientGroupID", "cg1");
593
+ url.searchParams.set("userID", "u1");
594
+ url.searchParams.set("baseCookie", "");
595
+ url.searchParams.set("lmid", "0");
596
+ url.searchParams.set("wsid", "ws-test");
597
+ var messages = [];
598
+ var _opts_desiredQueriesPatch, _opts_authToken;
599
+ var socket = new WebSocket(url, encodeSecProtocol(["initConnection", {
600
+ desiredQueriesPatch: (_opts_desiredQueriesPatch = opts === null || opts === void 0 ? void 0 : opts.desiredQueriesPatch) !== null && _opts_desiredQueriesPatch !== void 0 ? _opts_desiredQueriesPatch : []
601
+ }], (_opts_authToken = opts === null || opts === void 0 ? void 0 : opts.authToken) !== null && _opts_authToken !== void 0 ? _opts_authToken : "token-u1"));
602
+ socket.addEventListener("message", function (event) {
603
+ messages.push(JSON.parse(String(event.data)));
604
+ });
605
+ return {
606
+ messages,
607
+ socket
608
+ };
609
+ }
610
+ function pushBody(id) {
611
+ return {
612
+ clientGroupID: "cg1",
613
+ pushVersion: 1,
614
+ requestID: `push-${id}`,
615
+ timestamp: Date.now(),
616
+ mutations: [{
617
+ type: "custom",
618
+ name: "project|create",
619
+ id,
620
+ clientID: "c1",
621
+ args: [{
622
+ id: `p${id}`,
623
+ ownerId: "u1",
624
+ name: `project ${id}`
625
+ }]
626
+ }]
627
+ };
628
+ }
629
+ function findMessage(messages, type) {
630
+ var message = messages.find(function (item) {
631
+ return item[0] === type;
632
+ });
633
+ (0, import_vitest.expect)(message).toBeDefined();
634
+ return message;
635
+ }
636
+ function encodeSecProtocol(initConnectionMessage, authToken) {
637
+ return encodeURIComponent(Buffer.from(JSON.stringify({
638
+ initConnectionMessage,
639
+ authToken
640
+ })).toString("base64"));
641
+ }
642
+ function defer() {
643
+ var resolve;
644
+ var reject;
645
+ var promise = new Promise(function (res, rej) {
646
+ resolve = res;
647
+ reject = rej;
648
+ });
649
+ return {
650
+ promise,
651
+ resolve,
652
+ reject
653
+ };
654
+ }
655
+ //# sourceMappingURL=transport.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["import_zero","require","import_vitest","import_fixtureSchema","import_httpPullTransport","_class_call_check","instance","Constructor","TypeError","_define_property","obj","key","value","Object","defineProperty","enumerable","configurable","writable","ORIGIN","zeros","transports","storageID","afterEach","_zeros_pop","_transports_pop","length","pop","close","uninstall","vi","useRealTimers","describe","test","requests","cookie","fetch","fn","input","init","request","recordRequest","push","expect","path","toBe","headers","authorization","jsonResponse","lastMutationIDChanges","rowsPatch","op","tableName","id","name","ownerId","projectId","userId","transport","install","zero","createZero","view","query","project","related","materialize","data","waitForComplete","destroy","connections","toEqual","members","body","toBeNull","clientID","any","String","clientGroupID","unchanged","mutation2","mutations","pushResponse","result","eventually","filter","pullsBeforePush","mutation","mutate","create","client","server","find","toMatchObject","pushVersion","requestID","type","args","_requests_at","socket","openRawSocketWithMessages","authToken","send","JSON","stringify","auth","pull","at","firstPushStarted","defer","releaseFirstPush","pushIDs","mutationID","resolve","promise","map","messages","some","message","pushBody","sleep","toHaveLength","responses","deferred","inFlight","maxInFlight","Math","max","response","shift","Error","openRawSocket","findMessage","baseCookie","startsWith","concurrentA","concurrentB","Promise","all","projectView","userView","user","users","pingTimeoutMs","connection","state","current","error","status","emissions","cleanup","addListener","resultType","parse","toBeGreaterThan"],"sources":["../../../src/httpPull/transport.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}