on-zero 0.4.26 → 0.4.28
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/createZeroClient.cjs +14 -1
- package/dist/cjs/createZeroClient.native.js +15 -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 +588 -0
- package/dist/cjs/httpPull/transport.test.native.js +677 -0
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -0
- package/dist/cjs/httpPullTransport.cjs +447 -0
- package/dist/cjs/httpPullTransport.native.js +710 -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/esm/createZeroClient.mjs +14 -1
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +15 -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 +589 -0
- package/dist/esm/httpPull/transport.test.mjs.map +1 -0
- package/dist/esm/httpPull/transport.test.native.js +675 -0
- package/dist/esm/httpPull/transport.test.native.js.map +1 -0
- package/dist/esm/httpPullTransport.mjs +421 -0
- package/dist/esm/httpPullTransport.mjs.map +1 -0
- package/dist/esm/httpPullTransport.native.js +681 -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/package.json +2 -2
- package/src/createZeroClient.tsx +22 -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 +603 -0
- package/src/httpPullTransport.ts +587 -0
- package/src/index.ts +1 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"names":["_assert_this_initialized","self","ReferenceError","_call_super","_this","derived","args","_get_prototype_of","_possible_constructor_return","_is_native_reflect_construct","Reflect","construct","constructor","apply","_class_call_check","instance","Constructor","TypeError","_construct","Parent","Class","Parent2","args2","Class2","a","push","Function","bind","_set_prototype_of","prototype","arguments","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","_define_property","obj","value","o","setPrototypeOf","getPrototypeOf","o2","__proto__","_inherits","subClass","superClass","create","_instanceof","left","right","Symbol","hasInstance","_is_native_function","fn","toString","call","indexOf","_type_of","p","p2","_wrap_native_super","_cache","Map","wrapNativeSuper","has","get","set","Wrapper","result","Boolean","valueOf","_","COOKIE_WIDTH","installHttpPullTransport","opts","_class","previousWebSocket","globalThis","WebSocket","_opts_fetch","fetchImpl","fetch","Error","state","origin","URL","originString","trimTrailingSlash","nativeWebSocket","sockets","Set","pullIntervalMs","nextPokeID","Shim","_class2","url","protocols","shouldIntercept","ZeroHttpSocket","String","pull","Promise","all","map","socket","connections","size","uninstall","transportsByOrigin","ensureHttpPullTransport","existing","transport","ZeroHttpSocket2","_decoded_initConnectionMessage","CONNECTING","OPEN","CLOSING","CLOSED","readyState","listeners","open","message","close","error","pendingGotQueriesPatch","pullAfterCurrent","pushChain","resolve","nextLocalCookieID","connectURL","toHttpURL","_this_connectURL_searchParams_get","clientID","searchParams","_this_connectURL_searchParams_get1","clientGroupID","_this_connectURL_searchParams_get2","wsid","Date","now","baseCookie","cookie","decoded","decodeSecProtocol","authToken","queueDesiredQueries","initConnectionMessage","add","openTimer","setTimeout","addEventListener","type","listener","_this_listeners_type","removeEventListener","delete","dispatchEvent","event","emit","send","data","JSON","parse","requestPullAfterCurrent","auth","enqueuePush","emitMessage","run","answerMutationRecoveryPull","code","reason","clearTimeout","pullTimer","clearInterval","wasClean","pullInFlight","fetchPull","then","response","unchanged","emitGotQueriesPatch","emitPoke","catch","fail","finally","pullAgain","timestamp","setInterval","body","desiredQueriesPatch","Array","isArray","gotQueriesPatch","postJSON","pushResponse","nextPush","toWebSocketCookie"],"sources":["../../src/httpPullTransport.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
package/dist/esm/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { ensureAuth, getAuth } from "./helpers/getAuth.mjs";
|
|
|
9
9
|
import { setAuthData, setEnvironment } from "./state.mjs";
|
|
10
10
|
export * from "./combineZeroClients.mjs";
|
|
11
11
|
export * from "./createZeroClient.mjs";
|
|
12
|
+
export * from "./httpPullTransport.mjs";
|
|
12
13
|
export * from "./createUseQuery.mjs";
|
|
13
14
|
export * from "./resolveQuery.mjs";
|
|
14
15
|
export * from "./run.mjs";
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ensureAuth","getAuth","setAuthData","setEnvironment","setRunner","defineQuery","defineQueries","clearZeroClientData","showZeroClientErrorOnce","resetShownZeroClientError"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASA,UAAA,EAAYC,OAAA,QAAe;AACpC,SAASC,WAAA,EAAaC,cAAA,QAAsB;AAE5C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,SAAA,QAAkC;AAC3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,WAAA,EAAaC,aAAA,QAAqB;AAQ3C,SACEC,mBAAA,QAEK;AACP,SACEC,uBAAA,EACAC,yBAAA,QAGK","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ensureAuth","getAuth","setAuthData","setEnvironment","setRunner","defineQuery","defineQueries","clearZeroClientData","showZeroClientErrorOnce","resetShownZeroClientError"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASA,UAAA,EAAYC,OAAA,QAAe;AACpC,SAASC,WAAA,EAAaC,cAAA,QAAsB;AAE5C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,SAAA,QAAkC;AAC3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,WAAA,EAAaC,aAAA,QAAqB;AAQ3C,SACEC,mBAAA,QAEK;AACP,SACEC,uBAAA,EACAC,yBAAA,QAGK","ignoreList":[]}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -9,6 +9,7 @@ import { ensureAuth, getAuth } from "./helpers/getAuth.mjs";
|
|
|
9
9
|
import { setAuthData, setEnvironment } from "./state.mjs";
|
|
10
10
|
export * from "./combineZeroClients.mjs";
|
|
11
11
|
export * from "./createZeroClient.mjs";
|
|
12
|
+
export * from "./httpPullTransport.mjs";
|
|
12
13
|
export * from "./createUseQuery.mjs";
|
|
13
14
|
export * from "./resolveQuery.mjs";
|
|
14
15
|
export * from "./run.mjs";
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ensureAuth","getAuth","setAuthData","setEnvironment","setRunner","defineQuery","defineQueries","clearZeroClientData","showZeroClientErrorOnce","resetShownZeroClientError"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASA,UAAA,EAAYC,OAAA,QAAe;AACpC,SAASC,WAAA,EAAaC,cAAA,QAAsB;AAE5C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,SAAA,QAAkC;AAC3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,WAAA,EAAaC,aAAA,QAAqB;AAQ3C,SACEC,mBAAA,QAEK;AACP,SACEC,uBAAA,EACAC,yBAAA,QAGK","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ensureAuth","getAuth","setAuthData","setEnvironment","setRunner","defineQuery","defineQueries","clearZeroClientData","showZeroClientErrorOnce","resetShownZeroClientError"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASA,UAAA,EAAYC,OAAA,QAAe;AACpC,SAASC,WAAA,EAAaC,cAAA,QAAsB;AAE5C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,SAAA,QAAkC;AAC3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,WAAA,EAAaC,aAAA,QAAqB;AAQ3C,SACEC,mBAAA,QAEK;AACP,SACEC,uBAAA,EACAC,yBAAA,QAGK","ignoreList":[]}
|
package/dist/esm/index.native.js
CHANGED
|
@@ -9,6 +9,7 @@ import { ensureAuth, getAuth } from "./helpers/getAuth.native.js";
|
|
|
9
9
|
import { setAuthData, setEnvironment } from "./state.native.js";
|
|
10
10
|
export * from "./combineZeroClients.native.js";
|
|
11
11
|
export * from "./createZeroClient.native.js";
|
|
12
|
+
export * from "./httpPullTransport.native.js";
|
|
12
13
|
export * from "./createUseQuery.native.js";
|
|
13
14
|
export * from "./resolveQuery.native.js";
|
|
14
15
|
export * from "./run.native.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["ensureAuth","getAuth","setAuthData","setEnvironment","setRunner","defineQuery","defineQueries","clearZeroClientData","showZeroClientErrorOnce","resetShownZeroClientError"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASA,UAAA,EAAYC,OAAA,QAAe;AACpC,SAASC,WAAA,EAAaC,cAAA,QAAsB;AAE5C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,SAAA,QAAkC;AAC3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,WAAA,EAAaC,aAAA,QAAqB;AAQ3C,SAAAC,mBAAA;AAAA,SACEC,uBAAA,EAAAC,yBAAA;AAAA,SAGFF,mBAAA,EACED,aAAA,EACAD,WAAA,EAAAL,UAGK,E","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["ensureAuth","getAuth","setAuthData","setEnvironment","setRunner","defineQuery","defineQueries","clearZeroClientData","showZeroClientErrorOnce","resetShownZeroClientError"],"sources":["../../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASA,UAAA,EAAYC,OAAA,QAAe;AACpC,SAASC,WAAA,EAAaC,cAAA,QAAsB;AAE5C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,SAAA,QAAkC;AAC3C,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;AACd,SAASC,WAAA,EAAaC,aAAA,QAAqB;AAQ3C,SAAAC,mBAAA;AAAA,SACEC,uBAAA,EAAAC,yBAAA;AAAA,SAGFF,mBAAA,EACED,aAAA,EACAD,WAAA,EAAAL,UAGK,E","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "on-zero",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.28",
|
|
4
4
|
"description": "A typed layer over @rocicorp/zero with queries, mutations, and permissions",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"source": "src/index.ts",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
}
|
|
78
78
|
},
|
|
79
79
|
"dependencies": {
|
|
80
|
-
"@take-out/helpers": "0.4.
|
|
80
|
+
"@take-out/helpers": "0.4.28",
|
|
81
81
|
"chokidar": "^4.0.3",
|
|
82
82
|
"citty": "^0.1.6",
|
|
83
83
|
"valibot": "^1.1.0"
|
package/src/createZeroClient.tsx
CHANGED
|
@@ -13,6 +13,7 @@ import {
|
|
|
13
13
|
} from 'react'
|
|
14
14
|
|
|
15
15
|
import { createPermissions } from './createPermissions'
|
|
16
|
+
import { ensureHttpPullTransport } from './httpPullTransport'
|
|
16
17
|
import {
|
|
17
18
|
createUseQuery,
|
|
18
19
|
createUseQueryDirect,
|
|
@@ -331,11 +332,20 @@ export function createZeroClient<
|
|
|
331
332
|
children,
|
|
332
333
|
authData: authDataIn,
|
|
333
334
|
disable,
|
|
335
|
+
transport,
|
|
336
|
+
pullIntervalMs = 30_000,
|
|
334
337
|
...props
|
|
335
338
|
}: Omit<ZeroOptions<Schema, ZeroMutators>, 'schema' | 'mutators'> & {
|
|
336
339
|
children: ReactNode
|
|
337
340
|
authData?: AuthData | null
|
|
338
341
|
disable?: boolean
|
|
342
|
+
// 'http-pull' runs the stock zero client over stateless HTTP pull/push
|
|
343
|
+
// (no websocket, no resident server state) by intercepting the sync
|
|
344
|
+
// socket for this instance's server origin. see httpPullTransport.ts.
|
|
345
|
+
transport?: 'http-pull'
|
|
346
|
+
// http-pull only: every open connection also pulls on this interval so
|
|
347
|
+
// server-initiated changes arrive without a client-side trigger
|
|
348
|
+
pullIntervalMs?: number
|
|
339
349
|
}) => {
|
|
340
350
|
const authData = (authDataIn ?? null) as AuthData
|
|
341
351
|
|
|
@@ -374,6 +384,7 @@ export function createZeroClient<
|
|
|
374
384
|
.sort(([a], [b]) => (a < b ? -1 : 1)),
|
|
375
385
|
hasAuth,
|
|
376
386
|
generation,
|
|
387
|
+
transport,
|
|
377
388
|
])
|
|
378
389
|
|
|
379
390
|
// create/rotate in an effect — commit-safe: a discarded concurrent render
|
|
@@ -391,6 +402,17 @@ export function createZeroClient<
|
|
|
391
402
|
ZeroOptions<Schema, ZeroMutators>,
|
|
392
403
|
'schema' | 'mutators'
|
|
393
404
|
>
|
|
405
|
+
// install before construction so the instance's first connect goes
|
|
406
|
+
// through HTTP. per-origin idempotent — rotation reuses the install.
|
|
407
|
+
if (transport === 'http-pull') {
|
|
408
|
+
// same precedence as zero's own getServer (cacheURL is the current
|
|
409
|
+
// option name; server is its deprecated alias)
|
|
410
|
+
const serverURL = options.cacheURL ?? options.server
|
|
411
|
+
if (typeof serverURL !== 'string') {
|
|
412
|
+
throw new Error(`transport 'http-pull' requires a server URL`)
|
|
413
|
+
}
|
|
414
|
+
ensureHttpPullTransport({ origin: serverURL, pullIntervalMs })
|
|
415
|
+
}
|
|
394
416
|
cached = {
|
|
395
417
|
key: instanceKey,
|
|
396
418
|
instance: new ZeroClient<Schema, ZeroMutators>({
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
eventually,
|
|
5
|
+
sleep,
|
|
6
|
+
startZeroHttpHarness,
|
|
7
|
+
waitForComplete,
|
|
8
|
+
type ZeroHttpHarness,
|
|
9
|
+
} from './testHarness'
|
|
10
|
+
|
|
11
|
+
let harness: ZeroHttpHarness | undefined
|
|
12
|
+
|
|
13
|
+
type UserRow = { id: string; name: string }
|
|
14
|
+
type MemberRow = { id: string; projectId: string; userId: string }
|
|
15
|
+
type ProjectWithMembers = {
|
|
16
|
+
id: string
|
|
17
|
+
ownerId: string
|
|
18
|
+
name: string
|
|
19
|
+
members: MemberRow[]
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
afterEach(async () => {
|
|
23
|
+
await harness?.close()
|
|
24
|
+
harness = undefined
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
describe('zero-http auth parity', () => {
|
|
28
|
+
test('real clients only emit rows visible to their auth token', async () => {
|
|
29
|
+
harness = await startZeroHttpHarness({
|
|
30
|
+
seed: {
|
|
31
|
+
user: [
|
|
32
|
+
{ id: 'u1', name: 'ada' },
|
|
33
|
+
{ id: 'u2', name: 'ben' },
|
|
34
|
+
],
|
|
35
|
+
project: [
|
|
36
|
+
{ id: 'p-u1', ownerId: 'u1', name: 'u1 private' },
|
|
37
|
+
{ id: 'p-u2', ownerId: 'u2', name: 'u2 private' },
|
|
38
|
+
{ id: 'p-shared', ownerId: 'u2', name: 'shared' },
|
|
39
|
+
],
|
|
40
|
+
member: [
|
|
41
|
+
{ id: 'm-u1-owner', projectId: 'p-u1', userId: 'u1' },
|
|
42
|
+
{ id: 'm-u2-owner', projectId: 'p-u2', userId: 'u2' },
|
|
43
|
+
{ id: 'm-shared-u1', projectId: 'p-shared', userId: 'u1' },
|
|
44
|
+
{ id: 'm-shared-u2', projectId: 'p-shared', userId: 'u2' },
|
|
45
|
+
],
|
|
46
|
+
},
|
|
47
|
+
})
|
|
48
|
+
const u1 = harness.createZero('u1')
|
|
49
|
+
const u2 = harness.createZero('u2')
|
|
50
|
+
|
|
51
|
+
const u1Users = u1.query.user.materialize()
|
|
52
|
+
const u1Projects = u1.query.project.related('members').materialize()
|
|
53
|
+
const u2Users = u2.query.user.materialize()
|
|
54
|
+
const u2Projects = u2.query.project.related('members').materialize()
|
|
55
|
+
|
|
56
|
+
const u1UserEmissions: UserRow[][] = []
|
|
57
|
+
const u1ProjectEmissions: ProjectWithMembers[][] = []
|
|
58
|
+
const u2UserEmissions: UserRow[][] = []
|
|
59
|
+
const u2ProjectEmissions: ProjectWithMembers[][] = []
|
|
60
|
+
|
|
61
|
+
const stops = [
|
|
62
|
+
captureRows(u1Users, u1UserEmissions, normalizeUsers),
|
|
63
|
+
captureRows(u1Projects, u1ProjectEmissions, normalizeProjects),
|
|
64
|
+
captureRows(u2Users, u2UserEmissions, normalizeUsers),
|
|
65
|
+
captureRows(u2Projects, u2ProjectEmissions, normalizeProjects),
|
|
66
|
+
]
|
|
67
|
+
|
|
68
|
+
try {
|
|
69
|
+
const [u1UsersComplete, u1ProjectsComplete, u2UsersComplete, u2ProjectsComplete] =
|
|
70
|
+
await Promise.all([
|
|
71
|
+
waitForComplete<UserRow[]>(u1Users),
|
|
72
|
+
waitForComplete<ProjectWithMembers[]>(u1Projects),
|
|
73
|
+
waitForComplete<UserRow[]>(u2Users),
|
|
74
|
+
waitForComplete<ProjectWithMembers[]>(u2Projects),
|
|
75
|
+
])
|
|
76
|
+
|
|
77
|
+
expect(normalizeUsers(u1UsersComplete)).toEqual([{ id: 'u1', name: 'ada' }])
|
|
78
|
+
expect(normalizeProjects(u1ProjectsComplete)).toEqual([
|
|
79
|
+
{
|
|
80
|
+
id: 'p-shared',
|
|
81
|
+
ownerId: 'u2',
|
|
82
|
+
name: 'shared',
|
|
83
|
+
members: [
|
|
84
|
+
{ id: 'm-shared-u1', projectId: 'p-shared', userId: 'u1' },
|
|
85
|
+
{ id: 'm-shared-u2', projectId: 'p-shared', userId: 'u2' },
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'p-u1',
|
|
90
|
+
ownerId: 'u1',
|
|
91
|
+
name: 'u1 private',
|
|
92
|
+
members: [{ id: 'm-u1-owner', projectId: 'p-u1', userId: 'u1' }],
|
|
93
|
+
},
|
|
94
|
+
])
|
|
95
|
+
|
|
96
|
+
expect(normalizeUsers(u2UsersComplete)).toEqual([{ id: 'u2', name: 'ben' }])
|
|
97
|
+
expect(normalizeProjects(u2ProjectsComplete)).toEqual([
|
|
98
|
+
{
|
|
99
|
+
id: 'p-shared',
|
|
100
|
+
ownerId: 'u2',
|
|
101
|
+
name: 'shared',
|
|
102
|
+
members: [
|
|
103
|
+
{ id: 'm-shared-u1', projectId: 'p-shared', userId: 'u1' },
|
|
104
|
+
{ id: 'm-shared-u2', projectId: 'p-shared', userId: 'u2' },
|
|
105
|
+
],
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
id: 'p-u2',
|
|
109
|
+
ownerId: 'u2',
|
|
110
|
+
name: 'u2 private',
|
|
111
|
+
members: [{ id: 'm-u2-owner', projectId: 'p-u2', userId: 'u2' }],
|
|
112
|
+
},
|
|
113
|
+
])
|
|
114
|
+
|
|
115
|
+
assertNoUserEmission(u1UserEmissions, 'u2')
|
|
116
|
+
assertNoProjectEmission(u1ProjectEmissions, 'p-u2', 'm-u2-owner')
|
|
117
|
+
assertNoUserEmission(u2UserEmissions, 'u1')
|
|
118
|
+
assertNoProjectEmission(u2ProjectEmissions, 'p-u1', 'm-u1-owner')
|
|
119
|
+
|
|
120
|
+
await harness.transport.pull()
|
|
121
|
+
await sleep(50)
|
|
122
|
+
assertNoUserEmission(u1UserEmissions, 'u2')
|
|
123
|
+
assertNoProjectEmission(u1ProjectEmissions, 'p-u2', 'm-u2-owner')
|
|
124
|
+
assertNoUserEmission(u2UserEmissions, 'u1')
|
|
125
|
+
assertNoProjectEmission(u2ProjectEmissions, 'p-u1', 'm-u1-owner')
|
|
126
|
+
} finally {
|
|
127
|
+
for (const stop of stops) stop()
|
|
128
|
+
u1Users.destroy()
|
|
129
|
+
u1Projects.destroy()
|
|
130
|
+
u2Users.destroy()
|
|
131
|
+
u2Projects.destroy()
|
|
132
|
+
}
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
test('unknown token 401 reaches needs-auth without materializing data', async () => {
|
|
136
|
+
harness = await startZeroHttpHarness({
|
|
137
|
+
seed: {
|
|
138
|
+
user: [{ id: 'u1', name: 'ada' }],
|
|
139
|
+
project: [{ id: 'p-u1', ownerId: 'u1', name: 'u1 private' }],
|
|
140
|
+
member: [{ id: 'm-u1-owner', projectId: 'p-u1', userId: 'u1' }],
|
|
141
|
+
},
|
|
142
|
+
})
|
|
143
|
+
const unknown = harness.createZero('missing')
|
|
144
|
+
const projects = unknown.query.project.related('members').materialize()
|
|
145
|
+
const emissions: ProjectWithMembers[][] = []
|
|
146
|
+
const stop = captureRows(projects, emissions, normalizeProjects)
|
|
147
|
+
|
|
148
|
+
try {
|
|
149
|
+
await eventually(() =>
|
|
150
|
+
expect(unknown.connection.state.current.name).toBe('needs-auth'),
|
|
151
|
+
)
|
|
152
|
+
await sleep(50)
|
|
153
|
+
|
|
154
|
+
expect(projects.data).toEqual([])
|
|
155
|
+
expect(emissions.every((emission) => emission.length === 0)).toBe(true)
|
|
156
|
+
} finally {
|
|
157
|
+
stop()
|
|
158
|
+
projects.destroy()
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
})
|
|
162
|
+
|
|
163
|
+
// listener data is Immutable<T>; normalize maps to fresh mutable rows
|
|
164
|
+
function captureRows<T>(
|
|
165
|
+
view: { addListener(listener: (data: any, resultType: string) => void): () => void },
|
|
166
|
+
emissions: T[],
|
|
167
|
+
normalize: (data: T) => T,
|
|
168
|
+
) {
|
|
169
|
+
return view.addListener((data) => {
|
|
170
|
+
emissions.push(normalize(data))
|
|
171
|
+
})
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
function assertNoUserEmission(emissions: UserRow[][], privateUserID: string) {
|
|
175
|
+
for (const emission of emissions) {
|
|
176
|
+
expect(emission.map((row) => row.id)).not.toContain(privateUserID)
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function assertNoProjectEmission(
|
|
181
|
+
emissions: ProjectWithMembers[][],
|
|
182
|
+
privateProjectID: string,
|
|
183
|
+
privateMemberID: string,
|
|
184
|
+
) {
|
|
185
|
+
for (const emission of emissions) {
|
|
186
|
+
expect(emission.map((row) => row.id)).not.toContain(privateProjectID)
|
|
187
|
+
expect(
|
|
188
|
+
emission.flatMap((row) => row.members.map((member) => member.id)),
|
|
189
|
+
).not.toContain(privateMemberID)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function normalizeUsers(users: UserRow[]) {
|
|
194
|
+
return clone(users).sort((a, b) => a.id.localeCompare(b.id))
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function normalizeProjects(projects: ProjectWithMembers[]) {
|
|
198
|
+
return clone(projects)
|
|
199
|
+
.map((project) => ({
|
|
200
|
+
...project,
|
|
201
|
+
members: [...project.members].sort((a, b) => a.id.localeCompare(b.id)),
|
|
202
|
+
}))
|
|
203
|
+
.sort((a, b) => a.id.localeCompare(b.id))
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function clone<T>(value: T): T {
|
|
207
|
+
return JSON.parse(JSON.stringify(value)) as T
|
|
208
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { afterEach, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
eventually,
|
|
5
|
+
startZeroHttpHarness,
|
|
6
|
+
waitForComplete,
|
|
7
|
+
type ZeroHttpHarness,
|
|
8
|
+
} from './testHarness'
|
|
9
|
+
|
|
10
|
+
let harness: ZeroHttpHarness | undefined
|
|
11
|
+
|
|
12
|
+
afterEach(async () => {
|
|
13
|
+
await harness?.close()
|
|
14
|
+
harness = undefined
|
|
15
|
+
})
|
|
16
|
+
|
|
17
|
+
test('mutation burst converges while explicit pulls churn', async () => {
|
|
18
|
+
let clientGroupID = ''
|
|
19
|
+
const pullErrors: unknown[] = []
|
|
20
|
+
|
|
21
|
+
harness = await startZeroHttpHarness({
|
|
22
|
+
seed: {
|
|
23
|
+
user: [{ id: 'u1', name: 'ada' }],
|
|
24
|
+
project: [],
|
|
25
|
+
member: [],
|
|
26
|
+
},
|
|
27
|
+
interceptFetch: (next) => async (input, init) => {
|
|
28
|
+
const body = init?.body ? JSON.parse(String(init.body)) : undefined
|
|
29
|
+
if (body?.clientGroupID) clientGroupID = body.clientGroupID
|
|
30
|
+
return next(input, init)
|
|
31
|
+
},
|
|
32
|
+
})
|
|
33
|
+
const zero = harness.createZero('u1')
|
|
34
|
+
const view = zero.query.project.materialize()
|
|
35
|
+
await waitForComplete<any[]>(view)
|
|
36
|
+
|
|
37
|
+
const timer = setInterval(() => {
|
|
38
|
+
void harness?.transport.pull().catch((error) => pullErrors.push(error))
|
|
39
|
+
}, 2)
|
|
40
|
+
|
|
41
|
+
try {
|
|
42
|
+
const mutations = Array.from({ length: 15 }, (_, index) =>
|
|
43
|
+
zero.mutate.project.create({
|
|
44
|
+
id: `p${index + 1}`,
|
|
45
|
+
ownerId: 'u1',
|
|
46
|
+
name: `project ${index + 1}`,
|
|
47
|
+
}),
|
|
48
|
+
)
|
|
49
|
+
await Promise.all(mutations.map((mutation) => mutation.client))
|
|
50
|
+
await Promise.all(mutations.map((mutation) => mutation.server))
|
|
51
|
+
await harness.transport.pull()
|
|
52
|
+
|
|
53
|
+
await eventually(() => {
|
|
54
|
+
expect(projectIDs(view.data)).toEqual(
|
|
55
|
+
Array.from({ length: 15 }, (_, index) => `p${index + 1}`).sort(),
|
|
56
|
+
)
|
|
57
|
+
})
|
|
58
|
+
} finally {
|
|
59
|
+
clearInterval(timer)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
expect(pullErrors).toEqual([])
|
|
63
|
+
expect(zero.connection.state.current.name).toBe('connected')
|
|
64
|
+
expect(
|
|
65
|
+
harness.server
|
|
66
|
+
.rows('project')
|
|
67
|
+
.map((row) => row.id)
|
|
68
|
+
.sort(),
|
|
69
|
+
).toEqual(Array.from({ length: 15 }, (_, index) => `p${index + 1}`).sort())
|
|
70
|
+
|
|
71
|
+
const pull = await rawPull(harness, clientGroupID)
|
|
72
|
+
expect(Object.values(pull.lastMutationIDChanges)).toContain(15)
|
|
73
|
+
view.destroy()
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
test('two clients sharing a client group converge without cookie fights', async () => {
|
|
77
|
+
const clientGroups = new Set<string>()
|
|
78
|
+
const clientIDs = new Set<string>()
|
|
79
|
+
|
|
80
|
+
harness = await startZeroHttpHarness({
|
|
81
|
+
seed: {
|
|
82
|
+
user: [{ id: 'u1', name: 'ada' }],
|
|
83
|
+
project: [{ id: 'p1', ownerId: 'u1', name: 'first' }],
|
|
84
|
+
member: [],
|
|
85
|
+
},
|
|
86
|
+
interceptFetch: (next) => async (input, init) => {
|
|
87
|
+
const body = init?.body ? JSON.parse(String(init.body)) : undefined
|
|
88
|
+
if (body?.clientGroupID) clientGroups.add(body.clientGroupID)
|
|
89
|
+
if (body?.clientID) clientIDs.add(body.clientID)
|
|
90
|
+
return next(input, init)
|
|
91
|
+
},
|
|
92
|
+
})
|
|
93
|
+
|
|
94
|
+
const sharedStorageKey = 'zero-http-shared-client-group'
|
|
95
|
+
const zeroA = harness.createZero('u1', { storageKey: sharedStorageKey })
|
|
96
|
+
const zeroB = harness.createZero('u1', { storageKey: sharedStorageKey })
|
|
97
|
+
const viewA = zeroA.query.project.materialize()
|
|
98
|
+
const viewB = zeroB.query.project.materialize()
|
|
99
|
+
await waitForComplete<any[]>(viewA)
|
|
100
|
+
await waitForComplete<any[]>(viewB)
|
|
101
|
+
|
|
102
|
+
expect(harness.transport.connections).toBe(2)
|
|
103
|
+
expect(clientGroups.size).toBe(1)
|
|
104
|
+
expect(clientIDs.size).toBe(2)
|
|
105
|
+
|
|
106
|
+
const mutation = zeroA.mutate.project.create({
|
|
107
|
+
id: 'p2',
|
|
108
|
+
ownerId: 'u1',
|
|
109
|
+
name: 'second',
|
|
110
|
+
})
|
|
111
|
+
await mutation.client
|
|
112
|
+
await mutation.server
|
|
113
|
+
await harness.transport.pull()
|
|
114
|
+
|
|
115
|
+
await eventually(() => {
|
|
116
|
+
expect(projectIDs(viewA.data)).toEqual(['p1', 'p2'])
|
|
117
|
+
expect(projectIDs(viewB.data)).toEqual(['p1', 'p2'])
|
|
118
|
+
})
|
|
119
|
+
expect(zeroA.connection.state.current.name).toBe('connected')
|
|
120
|
+
expect(zeroB.connection.state.current.name).toBe('connected')
|
|
121
|
+
|
|
122
|
+
viewA.destroy()
|
|
123
|
+
viewB.destroy()
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
async function rawPull(harness: ZeroHttpHarness, clientGroupID: string) {
|
|
127
|
+
const response = await fetch(`${harness.server.url}/pull`, {
|
|
128
|
+
method: 'POST',
|
|
129
|
+
headers: {
|
|
130
|
+
authorization: 'Bearer token-u1',
|
|
131
|
+
'content-type': 'application/json',
|
|
132
|
+
},
|
|
133
|
+
body: JSON.stringify({
|
|
134
|
+
clientID: 'raw-pull',
|
|
135
|
+
clientGroupID,
|
|
136
|
+
cookie: null,
|
|
137
|
+
}),
|
|
138
|
+
})
|
|
139
|
+
expect(response.status).toBe(200)
|
|
140
|
+
return response.json() as Promise<{
|
|
141
|
+
lastMutationIDChanges: Record<string, number>
|
|
142
|
+
}>
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
function projectIDs(rows: any[]) {
|
|
146
|
+
return rows.map((row) => row.id).sort()
|
|
147
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createSchema, relationships, string, table } from '@rocicorp/zero'
|
|
2
|
+
|
|
3
|
+
import type { Transaction } from '@rocicorp/zero'
|
|
4
|
+
|
|
5
|
+
const user = table('user')
|
|
6
|
+
.columns({
|
|
7
|
+
id: string(),
|
|
8
|
+
name: string(),
|
|
9
|
+
})
|
|
10
|
+
.primaryKey('id')
|
|
11
|
+
|
|
12
|
+
const project = table('project')
|
|
13
|
+
.columns({
|
|
14
|
+
id: string(),
|
|
15
|
+
ownerId: string(),
|
|
16
|
+
name: string(),
|
|
17
|
+
})
|
|
18
|
+
.primaryKey('id')
|
|
19
|
+
|
|
20
|
+
const member = table('member')
|
|
21
|
+
.columns({
|
|
22
|
+
id: string(),
|
|
23
|
+
projectId: string(),
|
|
24
|
+
userId: string(),
|
|
25
|
+
})
|
|
26
|
+
.primaryKey('id')
|
|
27
|
+
|
|
28
|
+
export const zeroHttpFixtureSchema = createSchema({
|
|
29
|
+
tables: [user, project, member],
|
|
30
|
+
relationships: [
|
|
31
|
+
relationships(project, ({ many }) => ({
|
|
32
|
+
members: many({
|
|
33
|
+
sourceField: ['id'],
|
|
34
|
+
destField: ['projectId'],
|
|
35
|
+
destSchema: member,
|
|
36
|
+
}),
|
|
37
|
+
})),
|
|
38
|
+
],
|
|
39
|
+
enableLegacyQueries: true,
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
type FixtureTransaction = Transaction<typeof zeroHttpFixtureSchema>
|
|
43
|
+
|
|
44
|
+
export type ProjectCreateArgs = {
|
|
45
|
+
id: string
|
|
46
|
+
ownerId: string
|
|
47
|
+
name: string
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export type ProjectRenameArgs = {
|
|
51
|
+
id: string
|
|
52
|
+
name: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type MemberAddArgs = {
|
|
56
|
+
id: string
|
|
57
|
+
projectId: string
|
|
58
|
+
userId: string
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export type MemberRemoveArgs = {
|
|
62
|
+
id: string
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const zeroHttpFixtureMutators = {
|
|
66
|
+
project: {
|
|
67
|
+
create: async (tx: FixtureTransaction, args: ProjectCreateArgs) => {
|
|
68
|
+
await tx.mutate.project.insert(args)
|
|
69
|
+
},
|
|
70
|
+
rename: async (tx: FixtureTransaction, args: ProjectRenameArgs) => {
|
|
71
|
+
await tx.mutate.project.update(args)
|
|
72
|
+
},
|
|
73
|
+
},
|
|
74
|
+
member: {
|
|
75
|
+
add: async (tx: FixtureTransaction, args: MemberAddArgs) => {
|
|
76
|
+
await tx.mutate.member.insert(args)
|
|
77
|
+
},
|
|
78
|
+
remove: async (tx: FixtureTransaction, args: MemberRemoveArgs) => {
|
|
79
|
+
await tx.mutate.member.delete({ id: args.id })
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
}
|