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.
- package/dist/cjs/createUseQuery.cjs +28 -16
- package/dist/cjs/createUseQuery.native.js +42 -30
- package/dist/cjs/createUseQuery.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +13 -1
- package/dist/cjs/createZeroClient.native.js +13 -1
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/httpPull/auth.test.cjs +197 -0
- package/dist/cjs/httpPull/auth.test.native.js +279 -0
- package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
- package/dist/cjs/httpPull/churn.test.cjs +132 -0
- package/dist/cjs/httpPull/churn.test.native.js +155 -0
- package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
- package/dist/cjs/httpPull/fixtureSchema.cjs +76 -0
- package/dist/cjs/httpPull/fixtureSchema.native.js +82 -0
- package/dist/cjs/httpPull/fixtureSchema.native.js.map +1 -0
- package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
- package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
- package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
- package/dist/cjs/httpPull/integration.test.cjs +53 -0
- package/dist/cjs/httpPull/integration.test.native.js +60 -0
- package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
- package/dist/cjs/httpPull/rebase.test.cjs +360 -0
- package/dist/cjs/httpPull/rebase.test.native.js +420 -0
- package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
- package/dist/cjs/httpPull/relations.test.cjs +107 -0
- package/dist/cjs/httpPull/relations.test.native.js +119 -0
- package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
- package/dist/cjs/httpPull/testHarness.cjs +100 -0
- package/dist/cjs/httpPull/testHarness.native.js +112 -0
- package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
- package/dist/cjs/httpPull/transport.test.cjs +568 -0
- package/dist/cjs/httpPull/transport.test.native.js +655 -0
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
- package/dist/cjs/httpPullTransport.cjs +432 -0
- package/dist/cjs/httpPullTransport.native.js +695 -0
- package/dist/cjs/httpPullTransport.native.js.map +1 -0
- package/dist/cjs/index.cjs +1 -0
- package/dist/cjs/index.native.js +1 -0
- package/dist/cjs/index.native.js.map +1 -1
- package/dist/cjs/multiInstanceNested.test.cjs +26 -0
- package/dist/cjs/multiInstanceNested.test.native.js +34 -0
- package/dist/cjs/multiInstanceNested.test.native.js.map +1 -1
- package/dist/esm/createUseQuery.mjs +28 -16
- package/dist/esm/createUseQuery.mjs.map +1 -1
- package/dist/esm/createUseQuery.native.js +42 -30
- package/dist/esm/createUseQuery.native.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +13 -1
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +13 -1
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/httpPull/auth.test.mjs +198 -0
- package/dist/esm/httpPull/auth.test.mjs.map +1 -0
- package/dist/esm/httpPull/auth.test.native.js +277 -0
- package/dist/esm/httpPull/auth.test.native.js.map +1 -0
- package/dist/esm/httpPull/churn.test.mjs +133 -0
- package/dist/esm/httpPull/churn.test.mjs.map +1 -0
- package/dist/esm/httpPull/churn.test.native.js +153 -0
- package/dist/esm/httpPull/churn.test.native.js.map +1 -0
- package/dist/esm/httpPull/fixtureSchema.mjs +50 -0
- package/dist/esm/httpPull/fixtureSchema.mjs.map +1 -0
- package/dist/esm/httpPull/fixtureSchema.native.js +53 -0
- package/dist/esm/httpPull/fixtureSchema.native.js.map +1 -0
- package/dist/esm/httpPull/fixtureServer.mjs +315 -0
- package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
- package/dist/esm/httpPull/fixtureServer.native.js +506 -0
- package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
- package/dist/esm/httpPull/integration.test.mjs +54 -0
- package/dist/esm/httpPull/integration.test.mjs.map +1 -0
- package/dist/esm/httpPull/integration.test.native.js +58 -0
- package/dist/esm/httpPull/integration.test.native.js.map +1 -0
- package/dist/esm/httpPull/rebase.test.mjs +361 -0
- package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
- package/dist/esm/httpPull/rebase.test.native.js +418 -0
- package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
- package/dist/esm/httpPull/relations.test.mjs +108 -0
- package/dist/esm/httpPull/relations.test.mjs.map +1 -0
- package/dist/esm/httpPull/relations.test.native.js +117 -0
- package/dist/esm/httpPull/relations.test.native.js.map +1 -0
- package/dist/esm/httpPull/testHarness.mjs +72 -0
- package/dist/esm/httpPull/testHarness.mjs.map +1 -0
- package/dist/esm/httpPull/testHarness.native.js +81 -0
- package/dist/esm/httpPull/testHarness.native.js.map +1 -0
- package/dist/esm/httpPull/transport.test.mjs +569 -0
- package/dist/esm/httpPull/transport.test.mjs.map +1 -0
- package/dist/esm/httpPull/transport.test.native.js +653 -0
- package/dist/esm/httpPull/transport.test.native.js.map +1 -0
- package/dist/esm/httpPullTransport.mjs +406 -0
- package/dist/esm/httpPullTransport.mjs.map +1 -0
- package/dist/esm/httpPullTransport.native.js +666 -0
- package/dist/esm/httpPullTransport.native.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.mjs +1 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/index.native.js +1 -0
- package/dist/esm/index.native.js.map +1 -1
- package/dist/esm/multiInstanceNested.test.mjs +27 -1
- package/dist/esm/multiInstanceNested.test.mjs.map +1 -1
- package/dist/esm/multiInstanceNested.test.native.js +35 -1
- package/dist/esm/multiInstanceNested.test.native.js.map +1 -1
- package/package.json +2 -2
- package/src/createUseQuery.tsx +40 -22
- package/src/createZeroClient.tsx +19 -0
- package/src/httpPull/auth.test.ts +208 -0
- package/src/httpPull/churn.test.ts +147 -0
- package/src/httpPull/fixtureSchema.ts +82 -0
- package/src/httpPull/fixtureServer.ts +391 -0
- package/src/httpPull/integration.test.ts +57 -0
- package/src/httpPull/rebase.test.ts +368 -0
- package/src/httpPull/relations.test.ts +135 -0
- package/src/httpPull/testHarness.ts +95 -0
- package/src/httpPull/transport.test.ts +577 -0
- package/src/httpPullTransport.ts +559 -0
- package/src/index.ts +1 -0
- package/src/multiInstanceNested.test.tsx +25 -1
- package/types/createUseQuery.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +3 -1
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/httpPull/auth.test.d.ts +2 -0
- package/types/httpPull/auth.test.d.ts.map +1 -0
- package/types/httpPull/churn.test.d.ts +2 -0
- package/types/httpPull/churn.test.d.ts.map +1 -0
- package/types/httpPull/fixtureSchema.d.ts +111 -0
- package/types/httpPull/fixtureSchema.d.ts.map +1 -0
- package/types/httpPull/fixtureServer.d.ts +14 -0
- package/types/httpPull/fixtureServer.d.ts.map +1 -0
- package/types/httpPull/integration.test.d.ts +2 -0
- package/types/httpPull/integration.test.d.ts.map +1 -0
- package/types/httpPull/rebase.test.d.ts +2 -0
- package/types/httpPull/rebase.test.d.ts.map +1 -0
- package/types/httpPull/relations.test.d.ts +2 -0
- package/types/httpPull/relations.test.d.ts.map +1 -0
- package/types/httpPull/testHarness.d.ts +32 -0
- package/types/httpPull/testHarness.d.ts.map +1 -0
- package/types/httpPull/transport.test.d.ts +2 -0
- package/types/httpPull/transport.test.d.ts.map +1 -0
- package/types/httpPullTransport.d.ts +13 -0
- package/types/httpPullTransport.d.ts.map +1 -0
- package/types/index.d.ts +1 -0
- 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":[]}
|