on-zero 0.6.0 → 0.6.2

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 (42) hide show
  1. package/dist/cjs/createZeroClient.cjs +27 -1
  2. package/dist/cjs/createZeroClient.native.js +29 -3
  3. package/dist/cjs/createZeroClient.native.js.map +1 -1
  4. package/dist/cjs/createZeroClient.recovery.test.cjs +96 -0
  5. package/dist/cjs/createZeroClient.recovery.test.native.js +130 -0
  6. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -0
  7. package/dist/cjs/httpPull/transport.test.cjs +17 -0
  8. package/dist/cjs/httpPull/transport.test.native.js +21 -0
  9. package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
  10. package/dist/cjs/httpPullTransport.cjs +19 -3
  11. package/dist/cjs/httpPullTransport.native.js +19 -3
  12. package/dist/cjs/httpPullTransport.native.js.map +1 -1
  13. package/dist/esm/createZeroClient.mjs +27 -1
  14. package/dist/esm/createZeroClient.mjs.map +1 -1
  15. package/dist/esm/createZeroClient.native.js +29 -3
  16. package/dist/esm/createZeroClient.native.js.map +1 -1
  17. package/dist/esm/createZeroClient.recovery.test.mjs +97 -0
  18. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -0
  19. package/dist/esm/createZeroClient.recovery.test.native.js +128 -0
  20. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -0
  21. package/dist/esm/httpPull/transport.test.mjs +17 -0
  22. package/dist/esm/httpPull/transport.test.mjs.map +1 -1
  23. package/dist/esm/httpPull/transport.test.native.js +21 -0
  24. package/dist/esm/httpPull/transport.test.native.js.map +1 -1
  25. package/dist/esm/httpPullTransport.mjs +19 -3
  26. package/dist/esm/httpPullTransport.mjs.map +1 -1
  27. package/dist/esm/httpPullTransport.native.js +19 -3
  28. package/dist/esm/httpPullTransport.native.js.map +1 -1
  29. package/dist/esm/zeroRunner.mjs.map +1 -1
  30. package/dist/esm/zeroRunner.native.js.map +1 -1
  31. package/package.json +2 -2
  32. package/src/createZeroClient.recovery.test.tsx +104 -0
  33. package/src/createZeroClient.tsx +34 -1
  34. package/src/httpPull/transport.test.ts +19 -0
  35. package/src/httpPullTransport.ts +30 -2
  36. package/src/zeroRunner.ts +1 -1
  37. package/types/createZeroClient.d.ts.map +1 -1
  38. package/types/createZeroClient.recovery.test.d.ts +5 -0
  39. package/types/createZeroClient.recovery.test.d.ts.map +1 -0
  40. package/types/httpPullTransport.d.ts.map +1 -1
  41. package/types/zeroRunner.d.ts +1 -1
  42. package/types/zeroRunner.d.ts.map +1 -1
@@ -0,0 +1,104 @@
1
+ // @vitest-environment jsdom
2
+
3
+ import { createSchema, string, table } from '@rocicorp/zero'
4
+ import { act } from 'react'
5
+ import { createRoot, type Root } from 'react-dom/client'
6
+ import { afterEach, beforeEach, expect, test, vi } from 'vitest'
7
+
8
+ const fakeZero = vi.hoisted(() => {
9
+ class FakeZero {
10
+ readonly context = {}
11
+ readonly connection = {
12
+ state: {
13
+ current: { name: 'closed' },
14
+ subscribe: () => () => {},
15
+ },
16
+ connect: vi.fn(),
17
+ }
18
+ readonly delete = vi.fn(async () => ({ errors: [] }))
19
+ readonly close = vi.fn()
20
+ readonly run = vi.fn(async () => [])
21
+ readonly preload = vi.fn(() => ({
22
+ cleanup: () => {},
23
+ complete: Promise.resolve(),
24
+ }))
25
+
26
+ constructor() {
27
+ instances.push(this)
28
+ }
29
+ }
30
+
31
+ const instances: FakeZero[] = []
32
+ return { FakeZero, instances }
33
+ })
34
+
35
+ vi.mock('@rocicorp/zero', async (importOriginal) => {
36
+ const actual = await importOriginal<typeof import('@rocicorp/zero')>()
37
+ return {
38
+ ...actual,
39
+ Zero: fakeZero.FakeZero,
40
+ }
41
+ })
42
+
43
+ import { createZeroClient } from './createZeroClient'
44
+
45
+ declare global {
46
+ // eslint-disable-next-line no-var
47
+ var IS_REACT_ACT_ENVIRONMENT: boolean | undefined
48
+ }
49
+ globalThis.IS_REACT_ACT_ENVIRONMENT = true
50
+
51
+ const noteTable = table('note').columns({ id: string(), body: string() }).primaryKey('id')
52
+ const schema = createSchema({ tables: [noteTable] })
53
+
54
+ const client = createZeroClient({
55
+ schema,
56
+ models: {},
57
+ groupedQueries: {},
58
+ instanceName: 'recovery-cache-test',
59
+ })
60
+
61
+ let container: HTMLDivElement
62
+ let root: Root | null
63
+
64
+ beforeEach(() => {
65
+ fakeZero.instances.length = 0
66
+ container = document.createElement('div')
67
+ root = null
68
+ })
69
+
70
+ afterEach(() => {
71
+ if (root) act(() => root?.unmount())
72
+ })
73
+
74
+ async function mount() {
75
+ root = createRoot(container)
76
+ await act(async () => {
77
+ root?.render(
78
+ <client.ProvideZero cacheURL="http://127.0.0.1:7777/zero" userID="agentbus">
79
+ <span>ok</span>
80
+ </client.ProvideZero>,
81
+ )
82
+ await Promise.resolve()
83
+ })
84
+ }
85
+
86
+ test('zero.delete invalidates cached instance before a remount recovery', async () => {
87
+ await mount()
88
+ const first = fakeZero.instances[0]
89
+ expect(first).toBeDefined()
90
+
91
+ const deleteZero = client.zero.delete
92
+ await act(async () => {
93
+ await deleteZero()
94
+ })
95
+
96
+ expect(first?.delete).toHaveBeenCalledTimes(1)
97
+ expect(first?.close).toHaveBeenCalledTimes(1)
98
+
99
+ act(() => root?.unmount())
100
+ await mount()
101
+
102
+ expect(fakeZero.instances).toHaveLength(2)
103
+ expect(fakeZero.instances[1]).not.toBe(first)
104
+ })
@@ -264,6 +264,10 @@ export function createZeroClientInternal<
264
264
  `Zero instance not initialized. Ensure ZeroProvider is mounted before accessing 'zero'.`,
265
265
  )
266
266
  }
267
+ if (key === 'delete') {
268
+ const instanceToDelete = latestZeroInstance
269
+ return () => deleteZeroInstance(instanceToDelete)
270
+ }
267
271
  return getZeroProxyValue(latestZeroInstance, key)
268
272
  },
269
273
  })
@@ -373,6 +377,35 @@ export function createZeroClientInternal<
373
377
  // with different identities would thrash this slot.
374
378
  let cachedZero: { key: string; instance: ZeroInstance } | null = null
375
379
 
380
+ function invalidateZeroInstance(instanceToInvalidate: ZeroInstance | null): void {
381
+ if (!instanceToInvalidate) return
382
+
383
+ if (cachedZero?.instance === instanceToInvalidate) {
384
+ cachedZero = null
385
+ }
386
+ if (latestZeroInstance === instanceToInvalidate) {
387
+ latestZeroInstance = null
388
+ instance.runner = null
389
+ setRunner(null)
390
+ zeroInstanceVersion?.emit(zeroInstanceVersion.value + 1)
391
+ }
392
+ try {
393
+ instanceToInvalidate.close()
394
+ } catch {
395
+ // a deleted client is already unusable; close is best-effort cleanup.
396
+ }
397
+ }
398
+
399
+ async function deleteZeroInstance(
400
+ instanceToDelete: ZeroInstance | null,
401
+ ): Promise<unknown> {
402
+ try {
403
+ return await instanceToDelete?.delete()
404
+ } finally {
405
+ invalidateZeroInstance(instanceToDelete)
406
+ }
407
+ }
408
+
376
409
  // when ProvideZero is rendered without a real Zero instance (SSG, disable=true,
377
410
  // or transiently while the active path is still creating its first instance),
378
411
  // we want descendants' useZero() / useConnectionState() / on-zero useQuery to
@@ -553,7 +586,7 @@ export function createZeroClientInternal<
553
586
  // the handlers only fire post-mount).
554
587
  const instanceRef: { current: ZeroInstance | null } = { current: null }
555
588
  const recoveryDeps: ZeroRecoveryDeps = {
556
- deleteLocalState: () => instanceRef.current?.delete() ?? Promise.resolve(),
589
+ deleteLocalState: () => deleteZeroInstance(instanceRef.current),
557
590
  zeroEvents,
558
591
  beforeReload,
559
592
  }
@@ -382,6 +382,25 @@ describe('zero-http transport', () => {
382
382
  view.destroy()
383
383
  })
384
384
 
385
+ test('transient pull failures back off reconnect attempts', async () => {
386
+ const requests: RequestRecord[] = []
387
+ const fetch = vi.fn(async (input: RequestInfo | URL, init?: RequestInit) => {
388
+ const request = recordRequest(input, init)
389
+ requests.push(request)
390
+ expect(request.path).toBe('/pull')
391
+ throw new TypeError('Failed to fetch')
392
+ })
393
+ install(fetch)
394
+ createZero()
395
+
396
+ await eventually(() => expect(requests.length).toBe(1))
397
+ await sleep(150)
398
+ expect(requests.length).toBe(1)
399
+ await eventually(() => expect(requests.length).toBe(2), 1_500)
400
+ await sleep(150)
401
+ expect(requests.length).toBe(2)
402
+ })
403
+
385
404
  test('non-origin WebSockets pass through to the native implementation', () => {
386
405
  const previous = globalThis.WebSocket
387
406
  class NativeWebSocket {
@@ -45,9 +45,12 @@ type TransportState = {
45
45
  readonly sockets: Set<ZeroHttpSocket>
46
46
  readonly pullIntervalMs: number | undefined
47
47
  nextPokeID: number
48
+ transientFailureCount: number
48
49
  }
49
50
 
50
51
  const COOKIE_WIDTH = 20
52
+ const TRANSIENT_RECONNECT_BACKOFF_BASE_MS = 1_000
53
+ const TRANSIENT_RECONNECT_BACKOFF_MAX_MS = 30_000
51
54
 
52
55
  export type HttpPullTransport = {
53
56
  pull(): Promise<void>
@@ -83,6 +86,7 @@ export function installHttpPullTransport(
83
86
  sockets: new Set(),
84
87
  pullIntervalMs: opts.pullIntervalMs,
85
88
  nextPokeID: 0,
89
+ transientFailureCount: 0,
86
90
  }
87
91
 
88
92
  const Shim = class {
@@ -190,7 +194,7 @@ class ZeroHttpSocket {
190
194
  this.queueDesiredQueries(decoded.initConnectionMessage?.[1])
191
195
 
192
196
  this.state.sockets.add(this)
193
- this.openTimer = setTimeout(() => this.open(), 0)
197
+ this.openTimer = setTimeout(() => this.open(), reconnectDelayMs(this.state))
194
198
  }
195
199
 
196
200
  addEventListener(type: SocketEventType, listener: SocketListener | null) {
@@ -247,7 +251,7 @@ class ZeroHttpSocket {
247
251
  }
248
252
 
249
253
  pull(): Promise<void> {
250
- if (this.readyState === this.CLOSED) return Promise.resolve()
254
+ if (this.readyState !== this.OPEN) return Promise.resolve()
251
255
  if (this.pullInFlight) return this.pullInFlight
252
256
  this.pullInFlight = this.fetchPull(this.clientGroupID, this.cookie)
253
257
  .then((response) => {
@@ -361,6 +365,7 @@ class ZeroHttpSocket {
361
365
  if (!response.ok) {
362
366
  throw new ZeroHttpResponseError(path, response.status)
363
367
  }
368
+ resetTransientFailures(this.state)
364
369
  return response.json()
365
370
  }
366
371
 
@@ -399,6 +404,7 @@ class ZeroHttpSocket {
399
404
  if (this.readyState !== this.CLOSED) this.close(1000, error.message)
400
405
  return
401
406
  }
407
+ recordTransientFailure(this.state)
402
408
  this.emit('error', { error })
403
409
  this.close(1011, errorMessage(error))
404
410
  }
@@ -618,3 +624,25 @@ function isStaleClientCookieError(error: unknown): error is ZeroHttpResponseErro
618
624
  error.status === 409
619
625
  )
620
626
  }
627
+
628
+ function reconnectDelayMs(state: TransportState) {
629
+ if (state.transientFailureCount === 0) return 0
630
+ return Math.min(
631
+ TRANSIENT_RECONNECT_BACKOFF_BASE_MS * 2 ** (state.transientFailureCount - 1),
632
+ TRANSIENT_RECONNECT_BACKOFF_MAX_MS,
633
+ )
634
+ }
635
+
636
+ function recordTransientFailure(state: TransportState) {
637
+ const maxExponent = Math.log2(
638
+ TRANSIENT_RECONNECT_BACKOFF_MAX_MS / TRANSIENT_RECONNECT_BACKOFF_BASE_MS,
639
+ )
640
+ state.transientFailureCount = Math.min(
641
+ state.transientFailureCount + 1,
642
+ Math.ceil(maxExponent) + 1,
643
+ )
644
+ }
645
+
646
+ function resetTransientFailures(state: TransportState) {
647
+ state.transientFailureCount = 0
648
+ }
package/src/zeroRunner.ts CHANGED
@@ -16,7 +16,7 @@ export type ZeroRunner = <TReturn>(
16
16
 
17
17
  let runner: ZeroRunner | null = null
18
18
 
19
- export function setRunner(r: ZeroRunner) {
19
+ export function setRunner(r: ZeroRunner | null) {
20
20
  runner = r
21
21
  }
22
22
 
@@ -1 +1 @@
1
- {"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ declare global {
2
+ var IS_REACT_ACT_ENVIRONMENT: boolean | undefined;
3
+ }
4
+ export {};
5
+ //# sourceMappingURL=createZeroClient.recovery.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createZeroClient.recovery.test.d.ts","sourceRoot":"","sources":["../src/createZeroClient.recovery.test.tsx"],"names":[],"mappings":"AA4CA,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAA;CAClD"}
@@ -1 +1 @@
1
- {"version":3,"file":"httpPullTransport.d.ts","sourceRoot":"","sources":["../src/httpPullTransport.ts"],"names":[],"mappings":"AAmDA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,SAAS,IAAI,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CAoDnB;AAOD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CAOnB"}
1
+ {"version":3,"file":"httpPullTransport.d.ts","sourceRoot":"","sources":["../src/httpPullTransport.ts"],"names":[],"mappings":"AAsDA,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,SAAS,IAAI,IAAI,CAAA;CAClB,CAAA;AAED,MAAM,MAAM,wBAAwB,GAAG;IACrC,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,KAAK,CAAA;IAGpB,cAAc,CAAC,EAAE,MAAM,CAAA;CACxB,CAAA;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CAqDnB;AAOD,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,wBAAwB,GAC7B,iBAAiB,CAOnB"}
@@ -1,7 +1,7 @@
1
1
  import type { HumanReadable, Query, RunOptions, Schema as ZeroSchema } from '@rocicorp/zero';
2
2
  export type { RunOptions };
3
3
  export type ZeroRunner = <TReturn>(query: Query<any, ZeroSchema, TReturn>, options?: RunOptions) => Promise<HumanReadable<TReturn>>;
4
- export declare function setRunner(r: ZeroRunner): void;
4
+ export declare function setRunner(r: ZeroRunner | null): void;
5
5
  export declare function getRunner(instance?: {
6
6
  runner: ZeroRunner | null;
7
7
  }): ZeroRunner;
@@ -1 +1 @@
1
- {"version":3,"file":"zeroRunner.d.ts","sourceRoot":"","sources":["../src/zeroRunner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EACL,UAAU,EACV,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EAAE,UAAU,EAAE,CAAA;AAE1B,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,EACtC,OAAO,CAAC,EAAE,UAAU,KACjB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;AAIpC,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,QAEtC;AAED,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAAG,UAAU,CAM9E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAAG,UAAU,CAcrF"}
1
+ {"version":3,"file":"zeroRunner.d.ts","sourceRoot":"","sources":["../src/zeroRunner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,KAAK,EACL,UAAU,EACV,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAEvB,YAAY,EAAE,UAAU,EAAE,CAAA;AAE1B,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,EAC/B,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,CAAC,EACtC,OAAO,CAAC,EAAE,UAAU,KACjB,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAA;AAIpC,wBAAgB,SAAS,CAAC,CAAC,EAAE,UAAU,GAAG,IAAI,QAE7C;AAED,wBAAgB,SAAS,CAAC,QAAQ,CAAC,EAAE;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAAG,UAAU,CAM9E;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,CAAC,EAAE;IAAE,MAAM,EAAE,UAAU,GAAG,IAAI,CAAA;CAAE,GAAG,UAAU,CAcrF"}