on-zero 0.5.1 → 0.6.1

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 (119) hide show
  1. package/dist/cjs/createUseQuery.cjs +2 -1
  2. package/dist/cjs/createUseQuery.native.js +2 -1
  3. package/dist/cjs/createUseQuery.native.js.map +1 -1
  4. package/dist/cjs/createUseQueryDirect.cjs +1 -1
  5. package/dist/cjs/createUseQueryDirect.native.js +1 -1
  6. package/dist/cjs/createUseQueryDirect.native.js.map +1 -1
  7. package/dist/cjs/createZeroClient.cjs +45 -15
  8. package/dist/cjs/createZeroClient.native.js +56 -25
  9. package/dist/cjs/createZeroClient.native.js.map +1 -1
  10. package/dist/cjs/createZeroClient.recovery.test.cjs +96 -0
  11. package/dist/cjs/createZeroClient.recovery.test.native.js +130 -0
  12. package/dist/cjs/createZeroClient.recovery.test.native.js.map +1 -0
  13. package/dist/cjs/createZeroServer.cjs +33 -0
  14. package/dist/cjs/createZeroServer.native.js +40 -0
  15. package/dist/cjs/createZeroServer.native.js.map +1 -1
  16. package/dist/cjs/createZeroServer.test.cjs +162 -0
  17. package/dist/cjs/createZeroServer.test.native.js +217 -0
  18. package/dist/cjs/createZeroServer.test.native.js.map +1 -0
  19. package/dist/cjs/httpPull/transport.test.cjs +1 -3
  20. package/dist/cjs/httpPull/transport.test.native.js +2 -4
  21. package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
  22. package/dist/cjs/mutations.cjs +2 -2
  23. package/dist/cjs/mutations.native.js +2 -2
  24. package/dist/cjs/mutations.native.js.map +1 -1
  25. package/dist/cjs/provideZero.hydration.test.cjs +5 -0
  26. package/dist/cjs/provideZero.hydration.test.native.js +5 -0
  27. package/dist/cjs/provideZero.hydration.test.native.js.map +1 -1
  28. package/dist/cjs/testSetup.cjs +15 -0
  29. package/dist/cjs/testSetup.native.js +15 -0
  30. package/dist/cjs/testSetup.native.js.map +1 -1
  31. package/dist/cjs/useQuery.empty.test.cjs +5 -0
  32. package/dist/cjs/useQuery.empty.test.native.js +5 -0
  33. package/dist/cjs/useQuery.empty.test.native.js.map +1 -1
  34. package/dist/esm/createUseQuery.mjs +2 -1
  35. package/dist/esm/createUseQuery.mjs.map +1 -1
  36. package/dist/esm/createUseQuery.native.js +2 -1
  37. package/dist/esm/createUseQuery.native.js.map +1 -1
  38. package/dist/esm/createUseQueryDirect.mjs +2 -2
  39. package/dist/esm/createUseQueryDirect.mjs.map +1 -1
  40. package/dist/esm/createUseQueryDirect.native.js +2 -2
  41. package/dist/esm/createUseQueryDirect.native.js.map +1 -1
  42. package/dist/esm/createZeroClient.mjs +46 -16
  43. package/dist/esm/createZeroClient.mjs.map +1 -1
  44. package/dist/esm/createZeroClient.native.js +57 -26
  45. package/dist/esm/createZeroClient.native.js.map +1 -1
  46. package/dist/esm/createZeroClient.recovery.test.mjs +97 -0
  47. package/dist/esm/createZeroClient.recovery.test.mjs.map +1 -0
  48. package/dist/esm/createZeroClient.recovery.test.native.js +128 -0
  49. package/dist/esm/createZeroClient.recovery.test.native.js.map +1 -0
  50. package/dist/esm/createZeroServer.mjs +33 -0
  51. package/dist/esm/createZeroServer.mjs.map +1 -1
  52. package/dist/esm/createZeroServer.native.js +40 -0
  53. package/dist/esm/createZeroServer.native.js.map +1 -1
  54. package/dist/esm/createZeroServer.test.mjs +163 -0
  55. package/dist/esm/createZeroServer.test.mjs.map +1 -0
  56. package/dist/esm/createZeroServer.test.native.js +215 -0
  57. package/dist/esm/createZeroServer.test.native.js.map +1 -0
  58. package/dist/esm/httpPull/transport.test.mjs +1 -3
  59. package/dist/esm/httpPull/transport.test.mjs.map +1 -1
  60. package/dist/esm/httpPull/transport.test.native.js +2 -4
  61. package/dist/esm/httpPull/transport.test.native.js.map +1 -1
  62. package/dist/esm/mutations.mjs +2 -2
  63. package/dist/esm/mutations.mjs.map +1 -1
  64. package/dist/esm/mutations.native.js +2 -2
  65. package/dist/esm/mutations.native.js.map +1 -1
  66. package/dist/esm/provideZero.hydration.test.mjs +5 -0
  67. package/dist/esm/provideZero.hydration.test.mjs.map +1 -1
  68. package/dist/esm/provideZero.hydration.test.native.js +5 -0
  69. package/dist/esm/provideZero.hydration.test.native.js.map +1 -1
  70. package/dist/esm/testSetup.mjs +15 -0
  71. package/dist/esm/testSetup.mjs.map +1 -1
  72. package/dist/esm/testSetup.native.js +15 -0
  73. package/dist/esm/testSetup.native.js.map +1 -1
  74. package/dist/esm/useQuery.empty.test.mjs +5 -0
  75. package/dist/esm/useQuery.empty.test.mjs.map +1 -1
  76. package/dist/esm/useQuery.empty.test.native.js +5 -0
  77. package/dist/esm/useQuery.empty.test.native.js.map +1 -1
  78. package/dist/esm/zeroRunner.mjs.map +1 -1
  79. package/dist/esm/zeroRunner.native.js.map +1 -1
  80. package/package.json +2 -2
  81. package/src/createUseQuery.tsx +5 -2
  82. package/src/createUseQueryDirect.tsx +2 -2
  83. package/src/createZeroClient.recovery.test.tsx +104 -0
  84. package/src/createZeroClient.tsx +69 -51
  85. package/src/createZeroServer.test.ts +183 -0
  86. package/src/createZeroServer.ts +78 -0
  87. package/src/httpPull/transport.test.ts +1 -3
  88. package/src/mutations.ts +2 -2
  89. package/src/provideZero.hydration.test.tsx +10 -8
  90. package/src/testSetup.ts +19 -0
  91. package/src/useQuery.empty.test.tsx +6 -0
  92. package/src/zeroRunner.ts +1 -1
  93. package/types/createUseQuery.d.ts.map +1 -1
  94. package/types/createUseQueryDirect.d.ts.map +1 -1
  95. package/types/createZeroClient.d.ts +2 -2
  96. package/types/createZeroClient.d.ts.map +1 -1
  97. package/types/createZeroClient.recovery.test.d.ts +5 -0
  98. package/types/createZeroClient.recovery.test.d.ts.map +1 -0
  99. package/types/createZeroServer.d.ts +2 -2
  100. package/types/createZeroServer.d.ts.map +1 -1
  101. package/types/createZeroServer.test.d.ts +2 -0
  102. package/types/createZeroServer.test.d.ts.map +1 -0
  103. package/types/testSetup.d.ts +1 -0
  104. package/types/useQuery.empty.test.d.ts.map +1 -1
  105. package/types/zeroRunner.d.ts +1 -1
  106. package/types/zeroRunner.d.ts.map +1 -1
  107. package/dist/cjs/constants.cjs +0 -31
  108. package/dist/cjs/constants.native.js +0 -33
  109. package/dist/cjs/constants.native.js.map +0 -1
  110. package/dist/esm/constants.mjs +0 -5
  111. package/dist/esm/constants.mjs.map +0 -1
  112. package/dist/esm/constants.native.js +0 -4
  113. package/dist/esm/constants.native.js.map +0 -1
  114. package/src/constants.native.ts +0 -2
  115. package/src/constants.ts +0 -9
  116. package/types/constants.d.ts +0 -3
  117. package/types/constants.d.ts.map +0 -1
  118. package/types/constants.native.d.ts +0 -3
  119. package/types/constants.native.d.ts.map +0 -1
@@ -90,6 +90,7 @@ function createZeroServer({
90
90
  skipAsyncTasks
91
91
  }) => {
92
92
  const asyncTasks = [];
93
+ const recoveryRequest = request.clone();
93
94
  const mutators = (0, import_createMutators.createMutators)({
94
95
  asyncTasks,
95
96
  can: permissions.can,
@@ -101,6 +102,7 @@ function createZeroServer({
101
102
  mutationValidators
102
103
  });
103
104
  const response = await processor.process(mutators, request);
105
+ await persistAlreadyProcessedMutationResults(pool, recoveryRequest, response);
104
106
  if (!skipAsyncTasks && asyncTasks.length) {
105
107
  Promise.all(asyncTasks.map(task => (0, import_mutatorContext.runWithAuthScope)(authData, task))).catch(err => {
106
108
  console.error(`[push] async tasks failed`, err);
@@ -260,4 +262,35 @@ function createZeroServer({
260
262
  mutate,
261
263
  query
262
264
  };
265
+ }
266
+ function alreadyProcessedMutations(response) {
267
+ if (!response || typeof response !== "object") return [];
268
+ const mutations = response.mutations;
269
+ if (!Array.isArray(mutations)) return [];
270
+ return mutations.filter(mutation => {
271
+ if (!mutation || typeof mutation !== "object") return false;
272
+ const id = mutation.id;
273
+ const result = mutation.result;
274
+ return !!id && typeof id === "object" && typeof id.clientID === "string" && typeof id.id === "number" && !!result && typeof result === "object" && result.error === "alreadyProcessed";
275
+ });
276
+ }
277
+ async function persistAlreadyProcessedMutationResults(pool, request, response) {
278
+ const mutations = alreadyProcessedMutations(response);
279
+ if (mutations.length === 0) return;
280
+ const schema = new URL(request.url).searchParams.get("schema");
281
+ if (!schema) return;
282
+ const body = await request.json();
283
+ if (typeof body.clientGroupID !== "string") return;
284
+ const table = `${quotePgIdentifier(schema)}."mutations"`;
285
+ const values = mutations.map((_, index) => {
286
+ const offset = index * 4;
287
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
288
+ }).join(", ");
289
+ const params = mutations.flatMap(mutation => [body.clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)]);
290
+ await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
291
+ VALUES ${values}
292
+ ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
293
+ }
294
+ function quotePgIdentifier(value) {
295
+ return `"${value.replaceAll('"', '""')}"`;
263
296
  }
@@ -42,6 +42,11 @@ var import_run = require("./run.native.js");
42
42
  var import_state = require("./state.native.js");
43
43
  var import_where = require("./where.native.js");
44
44
  var import_zeroRunner = require("./zeroRunner.native.js");
45
+ function _type_of(obj) {
46
+ "@swc/helpers - typeof";
47
+
48
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
49
+ }
45
50
  function createZeroServer(param) {
46
51
  var {
47
52
  createServerActions,
@@ -94,6 +99,7 @@ function createZeroServer(param) {
94
99
  skipAsyncTasks
95
100
  } = param2;
96
101
  var asyncTasks = [];
102
+ var recoveryRequest = request.clone();
97
103
  var mutators = (0, import_createMutators.createMutators)({
98
104
  asyncTasks,
99
105
  can: permissions.can,
@@ -105,6 +111,7 @@ function createZeroServer(param) {
105
111
  mutationValidators
106
112
  });
107
113
  var response = await processor.process(mutators, request);
114
+ await persistAlreadyProcessedMutationResults(pool, recoveryRequest, response);
108
115
  if (!skipAsyncTasks && asyncTasks.length) {
109
116
  Promise.all(asyncTasks.map(function (task) {
110
117
  return (0, import_mutatorContext.runWithAuthScope)(authData, task);
@@ -276,4 +283,37 @@ function createZeroServer(param) {
276
283
  query
277
284
  };
278
285
  }
286
+ function alreadyProcessedMutations(response) {
287
+ if (!response || (typeof response === "undefined" ? "undefined" : _type_of(response)) !== "object") return [];
288
+ var mutations = response.mutations;
289
+ if (!Array.isArray(mutations)) return [];
290
+ return mutations.filter(function (mutation) {
291
+ if (!mutation || (typeof mutation === "undefined" ? "undefined" : _type_of(mutation)) !== "object") return false;
292
+ var id = mutation.id;
293
+ var result = mutation.result;
294
+ return !!id && (typeof id === "undefined" ? "undefined" : _type_of(id)) === "object" && typeof id.clientID === "string" && typeof id.id === "number" && !!result && (typeof result === "undefined" ? "undefined" : _type_of(result)) === "object" && result.error === "alreadyProcessed";
295
+ });
296
+ }
297
+ async function persistAlreadyProcessedMutationResults(pool, request, response) {
298
+ var mutations = alreadyProcessedMutations(response);
299
+ if (mutations.length === 0) return;
300
+ var schema = new URL(request.url).searchParams.get("schema");
301
+ if (!schema) return;
302
+ var body = await request.json();
303
+ if (typeof body.clientGroupID !== "string") return;
304
+ var table = `${quotePgIdentifier(schema)}."mutations"`;
305
+ var values = mutations.map(function (_, index) {
306
+ var offset = index * 4;
307
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
308
+ }).join(", ");
309
+ var params = mutations.flatMap(function (mutation) {
310
+ return [body.clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)];
311
+ });
312
+ await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
313
+ VALUES ${values}
314
+ ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
315
+ }
316
+ function quotePgIdentifier(value) {
317
+ return `"${value.replaceAll('"', '""')}"`;
318
+ }
279
319
  //# sourceMappingURL=createZeroServer.native.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createZeroServer_exports","__export","createZeroServer","module","exports","import_zero","require","import_pg","import_server","import_pg2","import_helpers","import_pg3","import_createPermissions","import_createMutators","import_mutatorContext","import_queryContext","import_modelRegistry","import_run","import_state","import_where","import_zeroRunner","param","createServerActions","database","pool","externalPool","schema","models","queries","mutations","mutationValidators","validateQuery","validateMutation","defaultAllowAdminRole","defaultMutateAuthData","setSchema","setEnvironment","dbString","assertString","pgPool","Pool","connectionString","ssl","includes","rejectUnauthorized","on","error","console","message","client","zeroDb","zeroNodePg","permissions","createPermissions","environment","adminRoleMode","processor","PushProcessor","handleMutationRequest","param2","authData","request","skipAsyncTasks","asyncTasks","mutators","createMutators","can","response","process","length","Promise","all","map","task","runWithAuthScope","catch","err","handleQueryRequest","Error","handler","name","args","startsWith","table","slice","objOrId","perm","getMutationsPermissions","setEvaluatingPermission","getZQL","where","eb","buildPermissionQuery","one","queryName","params","_$query","mustGetQuery","fn","ctx","userID","id","runWithQueryContext","runMutate","modelName","mutatorName","mutatorArg","options","scoped","getScopedAuthData","modelMutators","mutator","transaction","tx","resolvedAuth","promise","t","awaitEffects","mutate","Proxy","get","_","_2","arg","query2","isInZeroMutation","mutatorContext","output","dummyTransactionInput","query","cb","run","setCustomQueries","setRunner","queryObj","clientGroupID","clientID","mutationID","upstreamSchema"],"sources":["../../src/createZeroServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createZeroServer_exports","__export","createZeroServer","module","exports","import_zero","require","import_pg","import_server","import_pg2","import_helpers","import_pg3","import_createPermissions","import_createMutators","import_mutatorContext","import_queryContext","import_modelRegistry","import_run","import_state","import_where","import_zeroRunner","_type_of","obj","Symbol","constructor","param","createServerActions","database","pool","externalPool","schema","models","queries","mutations","mutationValidators","validateQuery","validateMutation","defaultAllowAdminRole","defaultMutateAuthData","setSchema","setEnvironment","dbString","assertString","pgPool","Pool","connectionString","ssl","includes","rejectUnauthorized","on","error","console","message","client","zeroDb","zeroNodePg","permissions","createPermissions","environment","adminRoleMode","processor","PushProcessor","handleMutationRequest","param2","authData","request","skipAsyncTasks","asyncTasks","recoveryRequest","clone","mutators","createMutators","can","response","process","persistAlreadyProcessedMutationResults","length","Promise","all","map","task","runWithAuthScope","catch","err","handleQueryRequest","Error","handler","name","args","startsWith","table","slice","objOrId","perm","getMutationsPermissions","setEvaluatingPermission","getZQL","where","eb","buildPermissionQuery","one","queryName","params","_$query","mustGetQuery","fn","ctx","userID","id","runWithQueryContext","runMutate","modelName","mutatorName","mutatorArg","options","scoped","getScopedAuthData","modelMutators","mutator","transaction","tx","resolvedAuth","promise","t","awaitEffects","mutate","Proxy","get","_","_2","arg","query2","isInZeroMutation","mutatorContext","output","dummyTransactionInput","query","cb","run","setCustomQueries","setRunner","queryObj","clientGroupID","clientID","mutationID","upstreamSchema","alreadyProcessedMutations","Array","isArray","filter","mutation","result","URL","url","searchParams","body","json","quotePgIdentifier","values","index","offset","join","flatMap","JSON","stringify"],"sources":["../../src/createZeroServer.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,162 @@
1
+ var import_vitest = require("vitest");
2
+ var import_createZeroServer = require("./createZeroServer.cjs");
3
+ var import_fixtureSchema = require("./httpPull/fixtureSchema.cjs");
4
+ class FakePgClient {
5
+ lastMutationID = 0;
6
+ pendingLastMutationID;
7
+ mutationResultInserts = [];
8
+ async query(sql, params = []) {
9
+ if (sql === "BEGIN") {
10
+ this.pendingLastMutationID = void 0;
11
+ return {
12
+ rows: []
13
+ };
14
+ }
15
+ if (sql === "COMMIT") {
16
+ if (this.pendingLastMutationID !== void 0) {
17
+ this.lastMutationID = this.pendingLastMutationID;
18
+ }
19
+ this.pendingLastMutationID = void 0;
20
+ return {
21
+ rows: []
22
+ };
23
+ }
24
+ if (sql === "ROLLBACK") {
25
+ this.pendingLastMutationID = void 0;
26
+ return {
27
+ rows: []
28
+ };
29
+ }
30
+ if (sql.includes(".clients") && sql.includes('RETURNING "lastMutationID"')) {
31
+ const nextMutationID = this.lastMutationID + 1;
32
+ this.pendingLastMutationID = nextMutationID;
33
+ return {
34
+ rows: [{
35
+ lastMutationID: nextMutationID
36
+ }]
37
+ };
38
+ }
39
+ if (sql.includes("information_schema.columns")) {
40
+ return {
41
+ rows: [...schemaRows("user", ["id", "name"]), ...schemaRows("project", ["id", "ownerId", "name"]), ...schemaRows("member", ["id", "projectId", "userId"])]
42
+ };
43
+ }
44
+ if (sql.includes('INSERT INTO "zero_0"."mutations"')) {
45
+ this.mutationResultInserts.push(params);
46
+ return {
47
+ rows: []
48
+ };
49
+ }
50
+ throw new Error(`unexpected fake pg query: ${sql}`);
51
+ }
52
+ }
53
+ function schemaRows(table, columns) {
54
+ return columns.map(column => ({
55
+ schema: "public",
56
+ table,
57
+ column,
58
+ dataType: "text",
59
+ length: null,
60
+ precision: null,
61
+ scale: null,
62
+ typtype: "b",
63
+ typename: "text",
64
+ elemTyptype: null,
65
+ elemTypname: null
66
+ }));
67
+ }
68
+ function pushRequest(mutationIDs) {
69
+ const ids = Array.isArray(mutationIDs) ? mutationIDs : [mutationIDs];
70
+ return new Request("http://localhost/push?schema=zero_0&appID=zero", {
71
+ method: "POST",
72
+ headers: {
73
+ "content-type": "application/json"
74
+ },
75
+ body: JSON.stringify({
76
+ clientGroupID: "cg1",
77
+ mutations: ids.map(mutationID => ({
78
+ type: "custom",
79
+ id: mutationID,
80
+ clientID: "client-a",
81
+ name: "project.touch",
82
+ args: [{}],
83
+ timestamp: 1
84
+ })),
85
+ pushVersion: 1,
86
+ timestamp: 1,
87
+ requestID: `req-${ids.join("-")}`
88
+ })
89
+ });
90
+ }
91
+ (0, import_vitest.describe)("createZeroServer mutation recovery", () => {
92
+ (0, import_vitest.test)("persists alreadyProcessed duplicate results for zero-cache recovery rows", async () => {
93
+ const pg = new FakePgClient();
94
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
95
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
96
+ models: {
97
+ project: {
98
+ mutate: {
99
+ touch: async () => {}
100
+ }
101
+ }
102
+ },
103
+ createServerActions: () => ({}),
104
+ pool: pg
105
+ });
106
+ const first = await zeroServer.handleMutationRequest({
107
+ authData: null,
108
+ request: pushRequest(1)
109
+ });
110
+ (0, import_vitest.expect)(first.response.mutations[0].result).toEqual({});
111
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(1);
112
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([]);
113
+ const duplicate = await zeroServer.handleMutationRequest({
114
+ authData: null,
115
+ request: pushRequest(1)
116
+ });
117
+ const duplicateResult = duplicate.response.mutations[0].result;
118
+ (0, import_vitest.expect)(duplicateResult.error).toBe("alreadyProcessed");
119
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(1);
120
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
121
+ error: "alreadyProcessed",
122
+ details: duplicateResult.details
123
+ })]]);
124
+ });
125
+ (0, import_vitest.test)("persists only alreadyProcessed results in a mixed recovery push", async () => {
126
+ const pg = new FakePgClient();
127
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
128
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
129
+ models: {
130
+ project: {
131
+ mutate: {
132
+ touch: async () => {}
133
+ }
134
+ }
135
+ },
136
+ createServerActions: () => ({}),
137
+ pool: pg
138
+ });
139
+ await zeroServer.handleMutationRequest({
140
+ authData: null,
141
+ request: pushRequest(1)
142
+ });
143
+ const mixed = await zeroServer.handleMutationRequest({
144
+ authData: null,
145
+ request: pushRequest([1, 2])
146
+ });
147
+ const results = mixed.response.mutations.map(mutation => ({
148
+ id: mutation.id.id,
149
+ result: mutation.result
150
+ }));
151
+ (0, import_vitest.expect)(results[0].result.error).toBe("alreadyProcessed");
152
+ (0, import_vitest.expect)(results[1]).toEqual({
153
+ id: 2,
154
+ result: {}
155
+ });
156
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(2);
157
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
158
+ error: "alreadyProcessed",
159
+ details: results[0].result.details
160
+ })]]);
161
+ });
162
+ });
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+
3
+ var import_vitest = require("vitest");
4
+ var import_createZeroServer = require("./createZeroServer.native.js");
5
+ var import_fixtureSchema = require("./httpPull/fixtureSchema.native.js");
6
+ function _class_call_check(instance, Constructor) {
7
+ if (!(instance instanceof Constructor)) {
8
+ throw new TypeError("Cannot call a class as a function");
9
+ }
10
+ }
11
+ function _defineProperties(target, props) {
12
+ for (var i = 0; i < props.length; i++) {
13
+ var descriptor = props[i];
14
+ descriptor.enumerable = descriptor.enumerable || false;
15
+ descriptor.configurable = true;
16
+ if ("value" in descriptor) descriptor.writable = true;
17
+ Object.defineProperty(target, descriptor.key, descriptor);
18
+ }
19
+ }
20
+ function _create_class(Constructor, protoProps, staticProps) {
21
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
22
+ if (staticProps) _defineProperties(Constructor, staticProps);
23
+ return Constructor;
24
+ }
25
+ function _define_property(obj, key, value) {
26
+ if (key in obj) {
27
+ Object.defineProperty(obj, key, {
28
+ value,
29
+ enumerable: true,
30
+ configurable: true,
31
+ writable: true
32
+ });
33
+ } else {
34
+ obj[key] = value;
35
+ }
36
+ return obj;
37
+ }
38
+ var FakePgClient = /* @__PURE__ */function () {
39
+ "use strict";
40
+
41
+ function FakePgClient2() {
42
+ _class_call_check(this, FakePgClient2);
43
+ _define_property(this, "lastMutationID", 0);
44
+ _define_property(this, "pendingLastMutationID", void 0);
45
+ _define_property(this, "mutationResultInserts", []);
46
+ }
47
+ _create_class(FakePgClient2, [{
48
+ key: "query",
49
+ value: async function query(sql) {
50
+ var params = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : [];
51
+ if (sql === "BEGIN") {
52
+ this.pendingLastMutationID = void 0;
53
+ return {
54
+ rows: []
55
+ };
56
+ }
57
+ if (sql === "COMMIT") {
58
+ if (this.pendingLastMutationID !== void 0) {
59
+ this.lastMutationID = this.pendingLastMutationID;
60
+ }
61
+ this.pendingLastMutationID = void 0;
62
+ return {
63
+ rows: []
64
+ };
65
+ }
66
+ if (sql === "ROLLBACK") {
67
+ this.pendingLastMutationID = void 0;
68
+ return {
69
+ rows: []
70
+ };
71
+ }
72
+ if (sql.includes(".clients") && sql.includes('RETURNING "lastMutationID"')) {
73
+ var nextMutationID = this.lastMutationID + 1;
74
+ this.pendingLastMutationID = nextMutationID;
75
+ return {
76
+ rows: [{
77
+ lastMutationID: nextMutationID
78
+ }]
79
+ };
80
+ }
81
+ if (sql.includes("information_schema.columns")) {
82
+ return {
83
+ rows: [...schemaRows("user", ["id", "name"]), ...schemaRows("project", ["id", "ownerId", "name"]), ...schemaRows("member", ["id", "projectId", "userId"])]
84
+ };
85
+ }
86
+ if (sql.includes('INSERT INTO "zero_0"."mutations"')) {
87
+ this.mutationResultInserts.push(params);
88
+ return {
89
+ rows: []
90
+ };
91
+ }
92
+ throw new Error(`unexpected fake pg query: ${sql}`);
93
+ }
94
+ }]);
95
+ return FakePgClient2;
96
+ }();
97
+ function schemaRows(table, columns) {
98
+ return columns.map(function (column) {
99
+ return {
100
+ schema: "public",
101
+ table,
102
+ column,
103
+ dataType: "text",
104
+ length: null,
105
+ precision: null,
106
+ scale: null,
107
+ typtype: "b",
108
+ typename: "text",
109
+ elemTyptype: null,
110
+ elemTypname: null
111
+ };
112
+ });
113
+ }
114
+ function pushRequest(mutationIDs) {
115
+ var ids = Array.isArray(mutationIDs) ? mutationIDs : [mutationIDs];
116
+ return new Request("http://localhost/push?schema=zero_0&appID=zero", {
117
+ method: "POST",
118
+ headers: {
119
+ "content-type": "application/json"
120
+ },
121
+ body: JSON.stringify({
122
+ clientGroupID: "cg1",
123
+ mutations: ids.map(function (mutationID) {
124
+ return {
125
+ type: "custom",
126
+ id: mutationID,
127
+ clientID: "client-a",
128
+ name: "project.touch",
129
+ args: [{}],
130
+ timestamp: 1
131
+ };
132
+ }),
133
+ pushVersion: 1,
134
+ timestamp: 1,
135
+ requestID: `req-${ids.join("-")}`
136
+ })
137
+ });
138
+ }
139
+ (0, import_vitest.describe)("createZeroServer mutation recovery", function () {
140
+ (0, import_vitest.test)("persists alreadyProcessed duplicate results for zero-cache recovery rows", async function () {
141
+ var pg = new FakePgClient();
142
+ var zeroServer = (0, import_createZeroServer.createZeroServer)({
143
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
144
+ models: {
145
+ project: {
146
+ mutate: {
147
+ touch: async function () {}
148
+ }
149
+ }
150
+ },
151
+ createServerActions: function () {
152
+ return {};
153
+ },
154
+ pool: pg
155
+ });
156
+ var first = await zeroServer.handleMutationRequest({
157
+ authData: null,
158
+ request: pushRequest(1)
159
+ });
160
+ (0, import_vitest.expect)(first.response.mutations[0].result).toEqual({});
161
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(1);
162
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([]);
163
+ var duplicate = await zeroServer.handleMutationRequest({
164
+ authData: null,
165
+ request: pushRequest(1)
166
+ });
167
+ var duplicateResult = duplicate.response.mutations[0].result;
168
+ (0, import_vitest.expect)(duplicateResult.error).toBe("alreadyProcessed");
169
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(1);
170
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
171
+ error: "alreadyProcessed",
172
+ details: duplicateResult.details
173
+ })]]);
174
+ });
175
+ (0, import_vitest.test)("persists only alreadyProcessed results in a mixed recovery push", async function () {
176
+ var pg = new FakePgClient();
177
+ var zeroServer = (0, import_createZeroServer.createZeroServer)({
178
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
179
+ models: {
180
+ project: {
181
+ mutate: {
182
+ touch: async function () {}
183
+ }
184
+ }
185
+ },
186
+ createServerActions: function () {
187
+ return {};
188
+ },
189
+ pool: pg
190
+ });
191
+ await zeroServer.handleMutationRequest({
192
+ authData: null,
193
+ request: pushRequest(1)
194
+ });
195
+ var mixed = await zeroServer.handleMutationRequest({
196
+ authData: null,
197
+ request: pushRequest([1, 2])
198
+ });
199
+ var results = mixed.response.mutations.map(function (mutation) {
200
+ return {
201
+ id: mutation.id.id,
202
+ result: mutation.result
203
+ };
204
+ });
205
+ (0, import_vitest.expect)(results[0].result.error).toBe("alreadyProcessed");
206
+ (0, import_vitest.expect)(results[1]).toEqual({
207
+ id: 2,
208
+ result: {}
209
+ });
210
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(2);
211
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
212
+ error: "alreadyProcessed",
213
+ details: results[0].result.details
214
+ })]]);
215
+ });
216
+ });
217
+ //# sourceMappingURL=createZeroServer.test.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["import_vitest","require","import_createZeroServer","import_fixtureSchema","_class_call_check","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_create_class","protoProps","staticProps","prototype","_define_property","obj","value","FakePgClient","FakePgClient2","query","sql","params","arguments","pendingLastMutationID","rows","lastMutationID","includes","nextMutationID","schemaRows","mutationResultInserts","push","Error","table","columns","map","column","schema","dataType","precision","scale","typtype","typename","elemTyptype","elemTypname","pushRequest","mutationIDs","ids","Array","isArray","Request","method","headers","body","JSON","stringify","clientGroupID","mutations","mutationID","type","id","clientID","name","args","timestamp","pushVersion","requestID","join","describe","test","pg","zeroServer","createZeroServer","zeroHttpFixtureSchema","models"],"sources":["../../src/createZeroServer.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -483,9 +483,7 @@ let storageID = 0;
483
483
  createZero({
484
484
  onClientStateNotFound
485
485
  });
486
- await import_vitest.vi.waitFor(() => (0, import_vitest.expect)(onClientStateNotFound).toHaveBeenCalled(), {
487
- timeout: 5e3
488
- });
486
+ await eventually(() => (0, import_vitest.expect)(onClientStateNotFound).toHaveBeenCalled(), 5e3);
489
487
  });
490
488
  });
491
489
  function install(fetch) {
@@ -555,11 +555,9 @@ var storageID = 0;
555
555
  createZero({
556
556
  onClientStateNotFound
557
557
  });
558
- await import_vitest.vi.waitFor(function () {
558
+ await eventually(function () {
559
559
  return (0, import_vitest.expect)(onClientStateNotFound).toHaveBeenCalled();
560
- }, {
561
- timeout: 5e3
562
- });
560
+ }, 5e3);
563
561
  });
564
562
  });
565
563
  function install(fetch) {