on-zero 0.5.1 → 0.6.0
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 +2 -1
- package/dist/cjs/createUseQuery.native.js +2 -1
- package/dist/cjs/createUseQuery.native.js.map +1 -1
- package/dist/cjs/createUseQueryDirect.cjs +1 -1
- package/dist/cjs/createUseQueryDirect.native.js +1 -1
- package/dist/cjs/createUseQueryDirect.native.js.map +1 -1
- package/dist/cjs/createZeroClient.cjs +18 -14
- package/dist/cjs/createZeroClient.native.js +27 -22
- package/dist/cjs/createZeroClient.native.js.map +1 -1
- package/dist/cjs/createZeroServer.cjs +33 -0
- package/dist/cjs/createZeroServer.native.js +40 -0
- package/dist/cjs/createZeroServer.native.js.map +1 -1
- package/dist/cjs/createZeroServer.test.cjs +162 -0
- package/dist/cjs/createZeroServer.test.native.js +217 -0
- package/dist/cjs/createZeroServer.test.native.js.map +1 -0
- package/dist/cjs/httpPull/transport.test.cjs +1 -3
- package/dist/cjs/httpPull/transport.test.native.js +2 -4
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
- package/dist/cjs/mutations.cjs +2 -2
- package/dist/cjs/mutations.native.js +2 -2
- package/dist/cjs/mutations.native.js.map +1 -1
- package/dist/cjs/provideZero.hydration.test.cjs +5 -0
- package/dist/cjs/provideZero.hydration.test.native.js +5 -0
- package/dist/cjs/provideZero.hydration.test.native.js.map +1 -1
- package/dist/cjs/testSetup.cjs +15 -0
- package/dist/cjs/testSetup.native.js +15 -0
- package/dist/cjs/testSetup.native.js.map +1 -1
- package/dist/cjs/useQuery.empty.test.cjs +5 -0
- package/dist/cjs/useQuery.empty.test.native.js +5 -0
- package/dist/cjs/useQuery.empty.test.native.js.map +1 -1
- package/dist/esm/createUseQuery.mjs +2 -1
- package/dist/esm/createUseQuery.mjs.map +1 -1
- package/dist/esm/createUseQuery.native.js +2 -1
- package/dist/esm/createUseQuery.native.js.map +1 -1
- package/dist/esm/createUseQueryDirect.mjs +2 -2
- package/dist/esm/createUseQueryDirect.mjs.map +1 -1
- package/dist/esm/createUseQueryDirect.native.js +2 -2
- package/dist/esm/createUseQueryDirect.native.js.map +1 -1
- package/dist/esm/createZeroClient.mjs +19 -15
- package/dist/esm/createZeroClient.mjs.map +1 -1
- package/dist/esm/createZeroClient.native.js +28 -23
- package/dist/esm/createZeroClient.native.js.map +1 -1
- package/dist/esm/createZeroServer.mjs +33 -0
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +40 -0
- package/dist/esm/createZeroServer.native.js.map +1 -1
- package/dist/esm/createZeroServer.test.mjs +163 -0
- package/dist/esm/createZeroServer.test.mjs.map +1 -0
- package/dist/esm/createZeroServer.test.native.js +215 -0
- package/dist/esm/createZeroServer.test.native.js.map +1 -0
- package/dist/esm/httpPull/transport.test.mjs +1 -3
- package/dist/esm/httpPull/transport.test.mjs.map +1 -1
- package/dist/esm/httpPull/transport.test.native.js +2 -4
- package/dist/esm/httpPull/transport.test.native.js.map +1 -1
- package/dist/esm/mutations.mjs +2 -2
- package/dist/esm/mutations.mjs.map +1 -1
- package/dist/esm/mutations.native.js +2 -2
- package/dist/esm/mutations.native.js.map +1 -1
- package/dist/esm/provideZero.hydration.test.mjs +5 -0
- package/dist/esm/provideZero.hydration.test.mjs.map +1 -1
- package/dist/esm/provideZero.hydration.test.native.js +5 -0
- package/dist/esm/provideZero.hydration.test.native.js.map +1 -1
- package/dist/esm/testSetup.mjs +15 -0
- package/dist/esm/testSetup.mjs.map +1 -1
- package/dist/esm/testSetup.native.js +15 -0
- package/dist/esm/testSetup.native.js.map +1 -1
- package/dist/esm/useQuery.empty.test.mjs +5 -0
- package/dist/esm/useQuery.empty.test.mjs.map +1 -1
- package/dist/esm/useQuery.empty.test.native.js +5 -0
- package/dist/esm/useQuery.empty.test.native.js.map +1 -1
- package/package.json +2 -2
- package/src/createUseQuery.tsx +5 -2
- package/src/createUseQueryDirect.tsx +2 -2
- package/src/createZeroClient.tsx +35 -50
- package/src/createZeroServer.test.ts +183 -0
- package/src/createZeroServer.ts +78 -0
- package/src/httpPull/transport.test.ts +1 -3
- package/src/mutations.ts +2 -2
- package/src/provideZero.hydration.test.tsx +10 -8
- package/src/testSetup.ts +19 -0
- package/src/useQuery.empty.test.tsx +6 -0
- package/types/createUseQuery.d.ts.map +1 -1
- package/types/createUseQueryDirect.d.ts.map +1 -1
- package/types/createZeroClient.d.ts +2 -2
- package/types/createZeroClient.d.ts.map +1 -1
- package/types/createZeroServer.d.ts +2 -2
- package/types/createZeroServer.d.ts.map +1 -1
- package/types/createZeroServer.test.d.ts +2 -0
- package/types/createZeroServer.test.d.ts.map +1 -0
- package/types/testSetup.d.ts +1 -0
- package/types/useQuery.empty.test.d.ts.map +1 -1
- package/dist/cjs/constants.cjs +0 -31
- package/dist/cjs/constants.native.js +0 -33
- package/dist/cjs/constants.native.js.map +0 -1
- package/dist/esm/constants.mjs +0 -5
- package/dist/esm/constants.mjs.map +0 -1
- package/dist/esm/constants.native.js +0 -4
- package/dist/esm/constants.native.js.map +0 -1
- package/src/constants.native.ts +0 -2
- package/src/constants.ts +0 -9
- package/types/constants.d.ts +0 -3
- package/types/constants.d.ts.map +0 -1
- package/types/constants.native.d.ts +0 -3
- package/types/constants.native.d.ts.map +0 -1
package/src/createZeroClient.tsx
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
ZeroContext,
|
|
6
6
|
ZeroProvider,
|
|
7
7
|
} from '@rocicorp/zero/react'
|
|
8
|
-
import { createEmitter, type Emitter } from '@take-out/helpers'
|
|
8
|
+
import { createEmitter, IS_SERVER_RUNTIME, type Emitter } from '@take-out/helpers'
|
|
9
9
|
import {
|
|
10
10
|
createContext,
|
|
11
11
|
memo,
|
|
@@ -303,7 +303,7 @@ export function createZeroClientInternal<
|
|
|
303
303
|
// here (factory-time) instead of per-call keeps hook order stable so
|
|
304
304
|
// rules-of-hooks stays happy.
|
|
305
305
|
const createUsePermission = (useQueryImpl: UseQueryHook<Schema>) => {
|
|
306
|
-
if (
|
|
306
|
+
if (IS_SERVER_RUNTIME) {
|
|
307
307
|
return (() => null) as (
|
|
308
308
|
table: TableName | (string & {}),
|
|
309
309
|
objOrId: string | Partial<Row<any>> | undefined,
|
|
@@ -401,7 +401,10 @@ export function createZeroClientInternal<
|
|
|
401
401
|
connection: { state: DISABLED_ZERO_STUB_CONNECTION_STATE },
|
|
402
402
|
} as unknown as ZeroInstance
|
|
403
403
|
|
|
404
|
-
type ProvideZeroProps = Omit<
|
|
404
|
+
type ProvideZeroProps = Omit<
|
|
405
|
+
ZeroOptions<Schema, ZeroMutators>,
|
|
406
|
+
'schema' | 'mutators'
|
|
407
|
+
> & {
|
|
405
408
|
children: ReactNode
|
|
406
409
|
authData?: AuthData | null
|
|
407
410
|
// when true, ProvideZero renders a stable shell with stub Zero — no real
|
|
@@ -425,32 +428,33 @@ export function createZeroClientInternal<
|
|
|
425
428
|
beforeReload?: () => Promise<void>
|
|
426
429
|
}
|
|
427
430
|
|
|
428
|
-
//
|
|
429
|
-
//
|
|
430
|
-
//
|
|
431
|
-
//
|
|
432
|
-
//
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
431
|
+
// providezero keeps the same provider/fiber layout on ssr and client so
|
|
432
|
+
// useId() stays stable across hydration. the server implementation has no
|
|
433
|
+
// hooks because the ssg runtime can load on-zero through a non-deduped react
|
|
434
|
+
// copy whose dispatcher is null; the client implementation always calls its
|
|
435
|
+
// hooks, regardless of `disable`.
|
|
436
|
+
const ProvideZeroServer = ({ children, authData: authDataIn }: ProvideZeroProps) => {
|
|
437
|
+
return (
|
|
438
|
+
<AuthDataContext.Provider value={(authDataIn ?? {}) as AuthData}>
|
|
439
|
+
<DisabledContext.Provider value="empty">
|
|
440
|
+
<ZeroContext.Provider value={DISABLED_ZERO_STUB as any}>
|
|
441
|
+
{/* match the active path's 3-child layout exactly so descendant
|
|
442
|
+
useId() lands at the same fiber index in both branches. the
|
|
443
|
+
two leading nulls reserve the SetZeroInstance + ConnectionMonitor
|
|
444
|
+
slots; the active path puts those components there only once
|
|
445
|
+
an instance exists. without these placeholder slots, children
|
|
446
|
+
would sit at child index 0 here but index 2 in the active
|
|
447
|
+
path, shifting every descendant useId. */}
|
|
448
|
+
{null}
|
|
449
|
+
{null}
|
|
450
|
+
{children}
|
|
451
|
+
</ZeroContext.Provider>
|
|
452
|
+
</DisabledContext.Provider>
|
|
453
|
+
</AuthDataContext.Provider>
|
|
454
|
+
)
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
const ProvideZeroClient = ({
|
|
454
458
|
children,
|
|
455
459
|
authData: authDataIn,
|
|
456
460
|
transport,
|
|
@@ -459,27 +463,6 @@ export function createZeroClientInternal<
|
|
|
459
463
|
disable,
|
|
460
464
|
...props
|
|
461
465
|
}: ProvideZeroProps) => {
|
|
462
|
-
if (typeof window === 'undefined') {
|
|
463
|
-
return (
|
|
464
|
-
<AuthDataContext.Provider value={(authDataIn ?? {}) as AuthData}>
|
|
465
|
-
<DisabledContext.Provider value="empty">
|
|
466
|
-
<ZeroContext.Provider value={DISABLED_ZERO_STUB as any}>
|
|
467
|
-
{/* match the active path's 3-child layout EXACTLY so descendant
|
|
468
|
-
useId() lands at the same fiber index in both branches. the
|
|
469
|
-
two leading nulls reserve the SetZeroInstance + ConnectionMonitor
|
|
470
|
-
slots; the active path puts those components there only once
|
|
471
|
-
an instance exists. without these placeholder slots, children
|
|
472
|
-
would sit at child index 0 here but index 2 in the active
|
|
473
|
-
path, shifting every descendant useId. */}
|
|
474
|
-
{null}
|
|
475
|
-
{null}
|
|
476
|
-
{children}
|
|
477
|
-
</ZeroContext.Provider>
|
|
478
|
-
</DisabledContext.Provider>
|
|
479
|
-
</AuthDataContext.Provider>
|
|
480
|
-
)
|
|
481
|
-
}
|
|
482
|
-
|
|
483
466
|
// resolve the auth token first: a real logout (token gone) must clear
|
|
484
467
|
// authData so client mutators don't keep running as the old user, while a
|
|
485
468
|
// transient authData blip with the token still present (session refresh, tab
|
|
@@ -645,6 +628,8 @@ export function createZeroClientInternal<
|
|
|
645
628
|
)
|
|
646
629
|
}
|
|
647
630
|
|
|
631
|
+
const ProvideZero = IS_SERVER_RUNTIME ? ProvideZeroServer : ProvideZeroClient
|
|
632
|
+
|
|
648
633
|
const SetZeroInstance = () => {
|
|
649
634
|
const zeroInstance = useZero<Schema, ZeroMutators>()
|
|
650
635
|
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { createZeroServer } from './createZeroServer'
|
|
4
|
+
import { zeroHttpFixtureSchema } from './httpPull/fixtureSchema'
|
|
5
|
+
|
|
6
|
+
class FakePgClient {
|
|
7
|
+
lastMutationID = 0
|
|
8
|
+
pendingLastMutationID: number | undefined
|
|
9
|
+
mutationResultInserts: unknown[][] = []
|
|
10
|
+
|
|
11
|
+
async query(sql: string, params: unknown[] = []) {
|
|
12
|
+
if (sql === 'BEGIN') {
|
|
13
|
+
this.pendingLastMutationID = undefined
|
|
14
|
+
return { rows: [] }
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
if (sql === 'COMMIT') {
|
|
18
|
+
if (this.pendingLastMutationID !== undefined) {
|
|
19
|
+
this.lastMutationID = this.pendingLastMutationID
|
|
20
|
+
}
|
|
21
|
+
this.pendingLastMutationID = undefined
|
|
22
|
+
return { rows: [] }
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
if (sql === 'ROLLBACK') {
|
|
26
|
+
this.pendingLastMutationID = undefined
|
|
27
|
+
return { rows: [] }
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
if (sql.includes('.clients') && sql.includes('RETURNING "lastMutationID"')) {
|
|
31
|
+
const nextMutationID = this.lastMutationID + 1
|
|
32
|
+
this.pendingLastMutationID = nextMutationID
|
|
33
|
+
return { rows: [{ lastMutationID: nextMutationID }] }
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (sql.includes('information_schema.columns')) {
|
|
37
|
+
return {
|
|
38
|
+
rows: [
|
|
39
|
+
...schemaRows('user', ['id', 'name']),
|
|
40
|
+
...schemaRows('project', ['id', 'ownerId', 'name']),
|
|
41
|
+
...schemaRows('member', ['id', 'projectId', 'userId']),
|
|
42
|
+
],
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (sql.includes('INSERT INTO "zero_0"."mutations"')) {
|
|
47
|
+
this.mutationResultInserts.push(params)
|
|
48
|
+
return { rows: [] }
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
throw new Error(`unexpected fake pg query: ${sql}`)
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function schemaRows(table: string, columns: string[]) {
|
|
56
|
+
return columns.map((column) => ({
|
|
57
|
+
schema: 'public',
|
|
58
|
+
table,
|
|
59
|
+
column,
|
|
60
|
+
dataType: 'text',
|
|
61
|
+
length: null,
|
|
62
|
+
precision: null,
|
|
63
|
+
scale: null,
|
|
64
|
+
typtype: 'b',
|
|
65
|
+
typename: 'text',
|
|
66
|
+
elemTyptype: null,
|
|
67
|
+
elemTypname: null,
|
|
68
|
+
}))
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function pushRequest(mutationIDs: number | number[]) {
|
|
72
|
+
const ids = Array.isArray(mutationIDs) ? mutationIDs : [mutationIDs]
|
|
73
|
+
return new Request('http://localhost/push?schema=zero_0&appID=zero', {
|
|
74
|
+
method: 'POST',
|
|
75
|
+
headers: { 'content-type': 'application/json' },
|
|
76
|
+
body: JSON.stringify({
|
|
77
|
+
clientGroupID: 'cg1',
|
|
78
|
+
mutations: ids.map((mutationID) => ({
|
|
79
|
+
type: 'custom',
|
|
80
|
+
id: mutationID,
|
|
81
|
+
clientID: 'client-a',
|
|
82
|
+
name: 'project.touch',
|
|
83
|
+
args: [{}],
|
|
84
|
+
timestamp: 1,
|
|
85
|
+
})),
|
|
86
|
+
pushVersion: 1,
|
|
87
|
+
timestamp: 1,
|
|
88
|
+
requestID: `req-${ids.join('-')}`,
|
|
89
|
+
}),
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
describe('createZeroServer mutation recovery', () => {
|
|
94
|
+
test('persists alreadyProcessed duplicate results for zero-cache recovery rows', async () => {
|
|
95
|
+
const pg = new FakePgClient()
|
|
96
|
+
const zeroServer = createZeroServer({
|
|
97
|
+
schema: zeroHttpFixtureSchema,
|
|
98
|
+
models: {
|
|
99
|
+
project: {
|
|
100
|
+
mutate: {
|
|
101
|
+
touch: async () => {},
|
|
102
|
+
},
|
|
103
|
+
},
|
|
104
|
+
},
|
|
105
|
+
createServerActions: () => ({}),
|
|
106
|
+
pool: pg as any,
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
const first = await zeroServer.handleMutationRequest({
|
|
110
|
+
authData: null,
|
|
111
|
+
request: pushRequest(1),
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
expect((first.response as any).mutations[0].result).toEqual({})
|
|
115
|
+
expect(pg.lastMutationID).toBe(1)
|
|
116
|
+
expect(pg.mutationResultInserts).toEqual([])
|
|
117
|
+
|
|
118
|
+
const duplicate = await zeroServer.handleMutationRequest({
|
|
119
|
+
authData: null,
|
|
120
|
+
request: pushRequest(1),
|
|
121
|
+
})
|
|
122
|
+
|
|
123
|
+
const duplicateResult = (duplicate.response as any).mutations[0].result
|
|
124
|
+
expect(duplicateResult.error).toBe('alreadyProcessed')
|
|
125
|
+
expect(pg.lastMutationID).toBe(1)
|
|
126
|
+
expect(pg.mutationResultInserts).toEqual([
|
|
127
|
+
[
|
|
128
|
+
'cg1',
|
|
129
|
+
'client-a',
|
|
130
|
+
1,
|
|
131
|
+
JSON.stringify({
|
|
132
|
+
error: 'alreadyProcessed',
|
|
133
|
+
details: duplicateResult.details,
|
|
134
|
+
}),
|
|
135
|
+
],
|
|
136
|
+
])
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
test('persists only alreadyProcessed results in a mixed recovery push', async () => {
|
|
140
|
+
const pg = new FakePgClient()
|
|
141
|
+
const zeroServer = createZeroServer({
|
|
142
|
+
schema: zeroHttpFixtureSchema,
|
|
143
|
+
models: {
|
|
144
|
+
project: {
|
|
145
|
+
mutate: {
|
|
146
|
+
touch: async () => {},
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
createServerActions: () => ({}),
|
|
151
|
+
pool: pg as any,
|
|
152
|
+
})
|
|
153
|
+
|
|
154
|
+
await zeroServer.handleMutationRequest({
|
|
155
|
+
authData: null,
|
|
156
|
+
request: pushRequest(1),
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
const mixed = await zeroServer.handleMutationRequest({
|
|
160
|
+
authData: null,
|
|
161
|
+
request: pushRequest([1, 2]),
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
const results = (mixed.response as any).mutations.map((mutation: any) => ({
|
|
165
|
+
id: mutation.id.id,
|
|
166
|
+
result: mutation.result,
|
|
167
|
+
}))
|
|
168
|
+
expect(results[0].result.error).toBe('alreadyProcessed')
|
|
169
|
+
expect(results[1]).toEqual({ id: 2, result: {} })
|
|
170
|
+
expect(pg.lastMutationID).toBe(2)
|
|
171
|
+
expect(pg.mutationResultInserts).toEqual([
|
|
172
|
+
[
|
|
173
|
+
'cg1',
|
|
174
|
+
'client-a',
|
|
175
|
+
1,
|
|
176
|
+
JSON.stringify({
|
|
177
|
+
error: 'alreadyProcessed',
|
|
178
|
+
details: results[0].result.details,
|
|
179
|
+
}),
|
|
180
|
+
],
|
|
181
|
+
])
|
|
182
|
+
})
|
|
183
|
+
})
|
package/src/createZeroServer.ts
CHANGED
|
@@ -44,6 +44,21 @@ type MutateOptions = {
|
|
|
44
44
|
awaitEffects?: boolean
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
type AlreadyProcessedMutation = {
|
|
48
|
+
id: {
|
|
49
|
+
clientID: string
|
|
50
|
+
id: number
|
|
51
|
+
}
|
|
52
|
+
result: {
|
|
53
|
+
error: 'alreadyProcessed'
|
|
54
|
+
details?: unknown
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
type PushRequestBody = {
|
|
59
|
+
clientGroupID?: unknown
|
|
60
|
+
}
|
|
61
|
+
|
|
47
62
|
type ServerMutate<Models extends GenericModels> = {
|
|
48
63
|
[Key in keyof Models]: {
|
|
49
64
|
[K in keyof Models[Key]['mutate']]: Models[Key]['mutate'][K] extends (
|
|
@@ -179,6 +194,7 @@ export function createZeroServer<
|
|
|
179
194
|
}) => {
|
|
180
195
|
// since mutations do DB work in transaction, avoid any async tasks during
|
|
181
196
|
const asyncTasks: AsyncAction[] = []
|
|
197
|
+
const recoveryRequest = request.clone()
|
|
182
198
|
|
|
183
199
|
const mutators = createMutators({
|
|
184
200
|
asyncTasks,
|
|
@@ -193,6 +209,7 @@ export function createZeroServer<
|
|
|
193
209
|
|
|
194
210
|
// @ts-expect-error type is ok but config in monorepo
|
|
195
211
|
const response = await processor.process(mutators, request)
|
|
212
|
+
await persistAlreadyProcessedMutationResults(pool, recoveryRequest, response)
|
|
196
213
|
|
|
197
214
|
// now finish
|
|
198
215
|
if (!skipAsyncTasks && asyncTasks.length) {
|
|
@@ -416,3 +433,64 @@ export function createZeroServer<
|
|
|
416
433
|
query,
|
|
417
434
|
}
|
|
418
435
|
}
|
|
436
|
+
|
|
437
|
+
function alreadyProcessedMutations(response: unknown): AlreadyProcessedMutation[] {
|
|
438
|
+
if (!response || typeof response !== 'object') return []
|
|
439
|
+
const mutations = (response as { mutations?: unknown }).mutations
|
|
440
|
+
if (!Array.isArray(mutations)) return []
|
|
441
|
+
|
|
442
|
+
return mutations.filter((mutation): mutation is AlreadyProcessedMutation => {
|
|
443
|
+
if (!mutation || typeof mutation !== 'object') return false
|
|
444
|
+
const id = (mutation as { id?: unknown }).id
|
|
445
|
+
const result = (mutation as { result?: unknown }).result
|
|
446
|
+
return (
|
|
447
|
+
!!id &&
|
|
448
|
+
typeof id === 'object' &&
|
|
449
|
+
typeof (id as { clientID?: unknown }).clientID === 'string' &&
|
|
450
|
+
typeof (id as { id?: unknown }).id === 'number' &&
|
|
451
|
+
!!result &&
|
|
452
|
+
typeof result === 'object' &&
|
|
453
|
+
(result as { error?: unknown }).error === 'alreadyProcessed'
|
|
454
|
+
)
|
|
455
|
+
})
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
async function persistAlreadyProcessedMutationResults(
|
|
459
|
+
pool: NodePgTransaction,
|
|
460
|
+
request: Request,
|
|
461
|
+
response: unknown,
|
|
462
|
+
) {
|
|
463
|
+
const mutations = alreadyProcessedMutations(response)
|
|
464
|
+
if (mutations.length === 0) return
|
|
465
|
+
|
|
466
|
+
const schema = new URL(request.url).searchParams.get('schema')
|
|
467
|
+
if (!schema) return
|
|
468
|
+
|
|
469
|
+
const body = (await request.json()) as PushRequestBody
|
|
470
|
+
if (typeof body.clientGroupID !== 'string') return
|
|
471
|
+
|
|
472
|
+
const table = `${quotePgIdentifier(schema)}."mutations"`
|
|
473
|
+
const values = mutations
|
|
474
|
+
.map((_, index) => {
|
|
475
|
+
const offset = index * 4
|
|
476
|
+
return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`
|
|
477
|
+
})
|
|
478
|
+
.join(', ')
|
|
479
|
+
const params = mutations.flatMap((mutation) => [
|
|
480
|
+
body.clientGroupID,
|
|
481
|
+
mutation.id.clientID,
|
|
482
|
+
mutation.id.id,
|
|
483
|
+
JSON.stringify(mutation.result),
|
|
484
|
+
])
|
|
485
|
+
|
|
486
|
+
await pool.query(
|
|
487
|
+
`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
|
|
488
|
+
VALUES ${values}
|
|
489
|
+
ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`,
|
|
490
|
+
params,
|
|
491
|
+
)
|
|
492
|
+
}
|
|
493
|
+
|
|
494
|
+
function quotePgIdentifier(value: string) {
|
|
495
|
+
return `"${value.replaceAll('"', '""')}"`
|
|
496
|
+
}
|
|
@@ -480,9 +480,7 @@ describe('zero-http transport', () => {
|
|
|
480
480
|
install(fetch)
|
|
481
481
|
const onClientStateNotFound = vi.fn()
|
|
482
482
|
createZero({ onClientStateNotFound })
|
|
483
|
-
await
|
|
484
|
-
timeout: 5_000,
|
|
485
|
-
})
|
|
483
|
+
await eventually(() => expect(onClientStateNotFound).toHaveBeenCalled(), 5_000)
|
|
486
484
|
})
|
|
487
485
|
})
|
|
488
486
|
|
package/src/mutations.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { IS_SERVER_RUNTIME } from '@take-out/helpers'
|
|
2
2
|
import { getDidRunPermissionCheck } from './helpers/didRunPermissionCheck'
|
|
3
3
|
import { setMutationsPermissions } from './modelRegistry'
|
|
4
4
|
|
|
@@ -170,7 +170,7 @@ export function mutations<
|
|
|
170
170
|
}
|
|
171
171
|
|
|
172
172
|
// only validate on the server
|
|
173
|
-
if (
|
|
173
|
+
if (IS_SERVER_RUNTIME) {
|
|
174
174
|
await ctx.can(permissions, obj)
|
|
175
175
|
}
|
|
176
176
|
}
|
|
@@ -17,13 +17,16 @@
|
|
|
17
17
|
// stability is what keeps useId stable.
|
|
18
18
|
|
|
19
19
|
import { createSchema, string, table } from '@rocicorp/zero'
|
|
20
|
+
import { IS_SERVER, IS_SERVER_RUNTIME } from '@take-out/helpers'
|
|
20
21
|
import { useId, type ReactNode } from 'react'
|
|
21
22
|
import { renderToString } from 'react-dom/server'
|
|
22
23
|
import { expect, test } from 'vitest'
|
|
23
24
|
|
|
24
25
|
import { createZeroClient } from './createZeroClient'
|
|
25
26
|
|
|
26
|
-
const todoTable = table('todo')
|
|
27
|
+
const todoTable = table('todo')
|
|
28
|
+
.columns({ id: string(), title: string() })
|
|
29
|
+
.primaryKey('id')
|
|
27
30
|
const schema = createSchema({ tables: [todoTable] })
|
|
28
31
|
|
|
29
32
|
const client = createZeroClient({
|
|
@@ -38,13 +41,7 @@ function IdProbe({ name }: { name: string }) {
|
|
|
38
41
|
return <span data-name={name} data-probe-id={id} />
|
|
39
42
|
}
|
|
40
43
|
|
|
41
|
-
function Tree({
|
|
42
|
-
children,
|
|
43
|
-
disable,
|
|
44
|
-
}: {
|
|
45
|
-
children?: ReactNode
|
|
46
|
-
disable?: boolean
|
|
47
|
-
}) {
|
|
44
|
+
function Tree({ children, disable }: { children?: ReactNode; disable?: boolean }) {
|
|
48
45
|
return (
|
|
49
46
|
<client.ProvideZero authData={{}} userID="anon" disable={disable}>
|
|
50
47
|
<IdProbe name="a" />
|
|
@@ -69,6 +66,11 @@ function readIds(html: string): Record<string, string> {
|
|
|
69
66
|
return out
|
|
70
67
|
}
|
|
71
68
|
|
|
69
|
+
test('test environment loads on-zero client runtime', () => {
|
|
70
|
+
expect(IS_SERVER_RUNTIME).toBe(false)
|
|
71
|
+
expect(IS_SERVER).toBe(false)
|
|
72
|
+
})
|
|
73
|
+
|
|
72
74
|
test('useId is stable across active vs disabled ProvideZero renders', () => {
|
|
73
75
|
const active = readIds(renderToString(<Tree />))
|
|
74
76
|
const disabled = readIds(renderToString(<Tree disable />))
|
package/src/testSetup.ts
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
import { afterAll, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
const isJsdomRuntime = typeof window !== 'undefined' && typeof document !== 'undefined'
|
|
4
|
+
const previousViteEnvironment = process.env.VITE_ENVIRONMENT
|
|
5
|
+
|
|
6
|
+
if (isJsdomRuntime) {
|
|
7
|
+
process.env.VITE_ENVIRONMENT = 'client'
|
|
8
|
+
vi.resetModules()
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
afterAll(() => {
|
|
12
|
+
if (!isJsdomRuntime) return
|
|
13
|
+
if (previousViteEnvironment === undefined) {
|
|
14
|
+
delete process.env.VITE_ENVIRONMENT
|
|
15
|
+
} else {
|
|
16
|
+
process.env.VITE_ENVIRONMENT = previousViteEnvironment
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
|
|
1
20
|
if (typeof globalThis.localStorage?.getItem !== 'function') {
|
|
2
21
|
const store = new Map<string, string>()
|
|
3
22
|
Object.defineProperty(globalThis, 'localStorage', {
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
// queries get `[undefined, info]` instead (the established zero-react shape).
|
|
8
8
|
|
|
9
9
|
import { createSchema, number, string, table } from '@rocicorp/zero'
|
|
10
|
+
import { IS_SERVER, IS_SERVER_RUNTIME } from '@take-out/helpers'
|
|
10
11
|
import { act } from 'react'
|
|
11
12
|
import { createRoot, type Root } from 'react-dom/client'
|
|
12
13
|
import { afterEach, beforeEach, expect, test } from 'vitest'
|
|
@@ -78,6 +79,11 @@ function renderWithDisabled<T>(useHook: () => T): T {
|
|
|
78
79
|
return captured
|
|
79
80
|
}
|
|
80
81
|
|
|
82
|
+
test('test environment loads on-zero client runtime', () => {
|
|
83
|
+
expect(IS_SERVER_RUNTIME).toBe(false)
|
|
84
|
+
expect(IS_SERVER).toBe(false)
|
|
85
|
+
})
|
|
86
|
+
|
|
81
87
|
// regression: previously this returned [null, ...] which crashed downstream
|
|
82
88
|
// .filter / .find / .length. now it must return [[], ...] for plural queries.
|
|
83
89
|
test('useQuery returns [] (not null) for plural queries under DisabledContext', () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createUseQuery.d.ts","sourceRoot":"","sources":["../src/createUseQuery.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;
|
|
1
|
+
{"version":3,"file":"createUseQuery.d.ts","sourceRoot":"","sources":["../src/createUseQuery.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAG/D,OAAO,EAA+B,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAGjE,OAAO,EAAgB,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAA;AAEhE,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,MAAM,IAAI,UAAU,EACpB,GAAG,EACJ,MAAM,gBAAgB,CAAA;AAGvB,MAAM,MAAM,gBAAgB,GAAG,KAAK,GAAG,OAAO,GAAG,YAAY,CAAA;AAE7D,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,GAAG,CAAC,EAAE,GAAG,GAAG,SAAS,CAAA;CACtB,CAAA;AAED,KAAK,kBAAkB,GAAG,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;AAC5D,MAAM,MAAM,WAAW,CAAC,OAAO,IAAI,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,kBAAkB,CAAC,CAAA;AAExF,YAAY,EAAE,YAAY,EAAE,CAAA;AAE5B,MAAM,MAAM,YAAY,CAAC,MAAM,SAAS,UAAU,IAAI;IAEpD,CAAC,IAAI,EAAE,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,EAC5D,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EACtD,MAAM,EAAE,IAAI,EACZ,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,GAClC,WAAW,CAAC,OAAO,CAAC,CAAC;IAGxB,CAAC,MAAM,SAAS,MAAM,MAAM,CAAC,QAAQ,CAAC,GAAG,MAAM,EAAE,OAAO,EACtD,EAAE,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EACtD,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,GAClC,WAAW,CAAC,OAAO,CAAC,CAAA;CACxB,CAAA;AAiBD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,OAAO,GACpB,SAAS,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAUtC;AAGD,wBAAgB,iBAAiB,CAAC,eAAe,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG;;;EAYtE;AAED,wBAAgB,cAAc,CAAC,MAAM,SAAS,UAAU,EAAE,EACxD,eAAe,EACf,aAAa,GACd,EAAE;IACD,eAAe,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1C,aAAa,EAAE,gBAAgB,CAAA;CAChC,GAAG,YAAY,CAAC,MAAM,CAAC,CAwGvB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createUseQueryDirect.d.ts","sourceRoot":"","sources":["../src/createUseQueryDirect.tsx"],"names":[],"mappings":"AAMA,OAAO,
|
|
1
|
+
{"version":3,"file":"createUseQueryDirect.d.ts","sourceRoot":"","sources":["../src/createUseQueryDirect.tsx"],"names":[],"mappings":"AAMA,OAAO,EAAsC,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACpF,OAAO,EAAqD,KAAK,OAAO,EAAE,MAAM,OAAO,CAAA;AAEvF,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,YAAY,EAElB,MAAM,kBAAkB,CAAA;AAGzB,OAAO,KAAK,EACV,gBAAgB,EAEhB,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAkBvB,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB,WAAW,CACT,KAAK,EAAE,GAAG,EACV,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAA;KAAE,GACtB;QACD,WAAW,CACT,EAAE,EAAE,CAAC,IAAI,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,gBAAgB,KAAK,IAAI,GACpE,IAAI,CAAA;QACP,OAAO,IAAI,IAAI,CAAA;QACf,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAAA;KAC1B,CAAA;CACF,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,UAAU,IAAI,CAAC,KAAK,EAAE;IACpE,eAAe,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1C,aAAa,EAAE,gBAAgB,CAAA;IAC/B,OAAO,EAAE,MAAM,kBAAkB,GAAG,IAAI,CAAA;IACxC,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;CAC7B,KAAK,YAAY,CAAC,MAAM,CAAC,CAAA;AAG1B,KAAK,gBAAgB,GAAG;IACtB,KAAK,EAAE,KAAK,GAAG,OAAO,CAAA;IACtB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAA;AA2LD,wBAAgB,oBAAoB,CAAC,MAAM,SAAS,UAAU,EAAE,EAC9D,eAAe,EACf,aAAa,EACb,OAAO,EACP,WAAW,GACZ,EAAE,UAAU,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,MAAM,CAAC,CAyFpE"}
|
|
@@ -26,7 +26,7 @@ export type DirectQueryAdapter<Schema extends ZeroSchema> = (props: {
|
|
|
26
26
|
export declare function createZeroClient<Schema extends ZeroSchema, Models extends GenericModels>(options: CreateZeroClientOptions<Schema, Models>): {
|
|
27
27
|
instanceName: string;
|
|
28
28
|
zeroEvents: Emitter<ZeroEvent | null>;
|
|
29
|
-
ProvideZero: ({ children, authData: authDataIn
|
|
29
|
+
ProvideZero: ({ children, authData: authDataIn }: Omit<ZeroOptions<Schema, GetZeroMutators<Models>>, "schema" | "mutators"> & {
|
|
30
30
|
children: ReactNode;
|
|
31
31
|
authData?: {} | null | undefined;
|
|
32
32
|
disable?: boolean;
|
|
@@ -64,7 +64,7 @@ export declare function createZeroClientInternal<Schema extends ZeroSchema, Mode
|
|
|
64
64
|
}): {
|
|
65
65
|
instanceName: string;
|
|
66
66
|
zeroEvents: Emitter<ZeroEvent | null>;
|
|
67
|
-
ProvideZero: ({ children, authData: authDataIn
|
|
67
|
+
ProvideZero: ({ children, authData: authDataIn }: Omit<ZeroOptions<Schema, GetZeroMutators<Models>>, "schema" | "mutators"> & {
|
|
68
68
|
children: ReactNode;
|
|
69
69
|
authData?: AuthData | null;
|
|
70
70
|
disable?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA8B,IAAI,IAAI,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAO/E,OAAO,
|
|
1
|
+
{"version":3,"file":"createZeroClient.d.ts","sourceRoot":"","sources":["../src/createZeroClient.tsx"],"names":[],"mappings":"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"}
|
|
@@ -90,7 +90,7 @@ export declare function createZeroServer<Schema extends ZeroSchema, Models exten
|
|
|
90
90
|
error: "app";
|
|
91
91
|
} | {
|
|
92
92
|
details?: import("drizzle-zero").ReadonlyJSONValue | undefined;
|
|
93
|
-
error: "
|
|
93
|
+
error: "alreadyProcessed" | "oooMutation";
|
|
94
94
|
};
|
|
95
95
|
}[];
|
|
96
96
|
} | {
|
|
@@ -139,7 +139,7 @@ export declare function createZeroServer<Schema extends ZeroSchema, Models exten
|
|
|
139
139
|
error: "app";
|
|
140
140
|
} | {
|
|
141
141
|
details?: import("drizzle-zero").ReadonlyJSONValue | undefined;
|
|
142
|
-
error: "
|
|
142
|
+
error: "alreadyProcessed" | "oooMutation";
|
|
143
143
|
};
|
|
144
144
|
}[];
|
|
145
145
|
} | {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,iBAAiB,EAAE,MAAM,mCAAmC,CAAA;AAmBtF,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,QAAQ,EACR,aAAa,EACb,cAAc,EACd,YAAY,EACZ,WAAW,EACZ,MAAM,SAAS,CAAA;AAChB,OAAO,KAAK,EACV,gBAAgB,EAChB,aAAa,EACb,KAAK,EACL,MAAM,IAAI,UAAU,EACrB,MAAM,gBAAgB,CAAA;AAGvB,KAAK,cAAc,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAA;AAExE,KAAK,aAAa,GAAG;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB,CAAA;
|
|
1
|
+
{"version":3,"file":"createZeroServer.d.ts","sourceRoot":"","sources":["../src/createZeroServer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createZeroServer.test.d.ts","sourceRoot":"","sources":["../src/createZeroServer.test.ts"],"names":[],"mappings":""}
|
package/types/testSetup.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.empty.test.d.ts","sourceRoot":"","sources":["../src/useQuery.empty.test.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useQuery.empty.test.d.ts","sourceRoot":"","sources":["../src/useQuery.empty.test.tsx"],"names":[],"mappings":"AAiBA,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,wBAAwB,EAAE,OAAO,GAAG,SAAS,CAAA;CAClD"}
|