on-zero 0.6.12 → 0.6.13

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 (131) hide show
  1. package/dist/cjs/createZeroSQLiteServer.cjs +319 -0
  2. package/dist/cjs/createZeroSQLiteServer.native.js +440 -0
  3. package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -0
  4. package/dist/cjs/createZeroSQLiteServer.test.cjs +429 -0
  5. package/dist/cjs/createZeroSQLiteServer.test.native.js +466 -0
  6. package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -0
  7. package/dist/cjs/createZeroServer.cjs +20 -234
  8. package/dist/cjs/createZeroServer.native.js +24 -250
  9. package/dist/cjs/createZeroServer.native.js.map +1 -1
  10. package/dist/cjs/createZeroServer.test.cjs +35 -1
  11. package/dist/cjs/createZeroServer.test.native.js +38 -1
  12. package/dist/cjs/createZeroServer.test.native.js.map +1 -1
  13. package/dist/cjs/createZeroServerCore.cjs +362 -0
  14. package/dist/cjs/createZeroServerCore.native.js +389 -0
  15. package/dist/cjs/createZeroServerCore.native.js.map +1 -0
  16. package/dist/cjs/generate-lite.cjs +1 -0
  17. package/dist/cjs/generate-lite.native.js +1 -0
  18. package/dist/cjs/generate-lite.native.js.map +1 -1
  19. package/dist/cjs/generate-lite.test.cjs +5 -1
  20. package/dist/cjs/generate-lite.test.native.js +5 -1
  21. package/dist/cjs/generate-lite.test.native.js.map +1 -1
  22. package/dist/cjs/generate.cjs +20 -11
  23. package/dist/cjs/generate.native.js +29 -21
  24. package/dist/cjs/generate.native.js.map +1 -1
  25. package/dist/cjs/generate.test.cjs +110 -0
  26. package/dist/cjs/generate.test.native.js +110 -0
  27. package/dist/cjs/generate.test.native.js.map +1 -1
  28. package/dist/cjs/httpPull/transport.test.cjs +5 -4
  29. package/dist/cjs/httpPull/transport.test.native.js +6 -5
  30. package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
  31. package/dist/cjs/httpPullTransport.cjs +2 -1
  32. package/dist/cjs/httpPullTransport.native.js +3 -2
  33. package/dist/cjs/httpPullTransport.native.js.map +1 -1
  34. package/dist/cjs/server.cjs +2 -1
  35. package/dist/cjs/syncHost.cjs +164 -0
  36. package/dist/cjs/syncHost.native.js +371 -0
  37. package/dist/cjs/syncHost.native.js.map +1 -0
  38. package/dist/cjs/syncHost.test.cjs +229 -0
  39. package/dist/cjs/syncHost.test.native.js +278 -0
  40. package/dist/cjs/syncHost.test.native.js.map +1 -0
  41. package/dist/esm/createZeroSQLiteServer.mjs +293 -0
  42. package/dist/esm/createZeroSQLiteServer.mjs.map +1 -0
  43. package/dist/esm/createZeroSQLiteServer.native.js +411 -0
  44. package/dist/esm/createZeroSQLiteServer.native.js.map +1 -0
  45. package/dist/esm/createZeroSQLiteServer.test.mjs +430 -0
  46. package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -0
  47. package/dist/esm/createZeroSQLiteServer.test.native.js +464 -0
  48. package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -0
  49. package/dist/esm/createZeroServer.mjs +17 -231
  50. package/dist/esm/createZeroServer.mjs.map +1 -1
  51. package/dist/esm/createZeroServer.native.js +21 -247
  52. package/dist/esm/createZeroServer.native.js.map +1 -1
  53. package/dist/esm/createZeroServer.test.mjs +35 -1
  54. package/dist/esm/createZeroServer.test.mjs.map +1 -1
  55. package/dist/esm/createZeroServer.test.native.js +38 -1
  56. package/dist/esm/createZeroServer.test.native.js.map +1 -1
  57. package/dist/esm/createZeroServerCore.mjs +336 -0
  58. package/dist/esm/createZeroServerCore.mjs.map +1 -0
  59. package/dist/esm/createZeroServerCore.native.js +360 -0
  60. package/dist/esm/createZeroServerCore.native.js.map +1 -0
  61. package/dist/esm/generate-lite.mjs +1 -0
  62. package/dist/esm/generate-lite.mjs.map +1 -1
  63. package/dist/esm/generate-lite.native.js +1 -0
  64. package/dist/esm/generate-lite.native.js.map +1 -1
  65. package/dist/esm/generate-lite.test.mjs +5 -1
  66. package/dist/esm/generate-lite.test.mjs.map +1 -1
  67. package/dist/esm/generate-lite.test.native.js +5 -1
  68. package/dist/esm/generate-lite.test.native.js.map +1 -1
  69. package/dist/esm/generate.mjs +20 -11
  70. package/dist/esm/generate.mjs.map +1 -1
  71. package/dist/esm/generate.native.js +29 -21
  72. package/dist/esm/generate.native.js.map +1 -1
  73. package/dist/esm/generate.test.mjs +87 -1
  74. package/dist/esm/generate.test.mjs.map +1 -1
  75. package/dist/esm/generate.test.native.js +87 -1
  76. package/dist/esm/generate.test.native.js.map +1 -1
  77. package/dist/esm/httpPull/transport.test.mjs +5 -4
  78. package/dist/esm/httpPull/transport.test.mjs.map +1 -1
  79. package/dist/esm/httpPull/transport.test.native.js +6 -5
  80. package/dist/esm/httpPull/transport.test.native.js.map +1 -1
  81. package/dist/esm/httpPullTransport.mjs +2 -1
  82. package/dist/esm/httpPullTransport.mjs.map +1 -1
  83. package/dist/esm/httpPullTransport.native.js +3 -2
  84. package/dist/esm/httpPullTransport.native.js.map +1 -1
  85. package/dist/esm/server.mjs +1 -0
  86. package/dist/esm/server.mjs.map +1 -1
  87. package/dist/esm/syncHost.mjs +138 -0
  88. package/dist/esm/syncHost.mjs.map +1 -0
  89. package/dist/esm/syncHost.native.js +342 -0
  90. package/dist/esm/syncHost.native.js.map +1 -0
  91. package/dist/esm/syncHost.test.mjs +206 -0
  92. package/dist/esm/syncHost.test.mjs.map +1 -0
  93. package/dist/esm/syncHost.test.native.js +252 -0
  94. package/dist/esm/syncHost.test.native.js.map +1 -0
  95. package/package.json +19 -3
  96. package/readme.md +26 -0
  97. package/src/createZeroSQLiteServer.test.ts +461 -0
  98. package/src/createZeroSQLiteServer.ts +523 -0
  99. package/src/createZeroServer.test.ts +39 -1
  100. package/src/createZeroServer.ts +35 -428
  101. package/src/createZeroServerCore.ts +557 -0
  102. package/src/generate-lite.test.ts +4 -0
  103. package/src/generate-lite.ts +1 -0
  104. package/src/generate.test.ts +87 -1
  105. package/src/generate.ts +29 -20
  106. package/src/httpPull/transport.test.ts +6 -5
  107. package/src/httpPullTransport.ts +9 -4
  108. package/src/server.ts +1 -0
  109. package/src/syncHost.test.ts +216 -0
  110. package/src/syncHost.ts +255 -0
  111. package/test-fixtures/server-return-types.ts +50 -0
  112. package/test-fixtures/tsconfig.json +13 -0
  113. package/types/createZeroSQLiteServer.d.ts +37 -0
  114. package/types/createZeroSQLiteServer.d.ts.map +1 -0
  115. package/types/createZeroSQLiteServer.test.d.ts +2 -0
  116. package/types/createZeroSQLiteServer.test.d.ts.map +1 -0
  117. package/types/createZeroServer.d.ts +11 -293
  118. package/types/createZeroServer.d.ts.map +1 -1
  119. package/types/createZeroServerCore.d.ts +310 -0
  120. package/types/createZeroServerCore.d.ts.map +1 -0
  121. package/types/generate-lite.d.ts.map +1 -1
  122. package/types/generate.d.ts +2 -1
  123. package/types/generate.d.ts.map +1 -1
  124. package/types/httpPullTransport.d.ts +1 -0
  125. package/types/httpPullTransport.d.ts.map +1 -1
  126. package/types/server.d.ts +1 -0
  127. package/types/server.d.ts.map +1 -1
  128. package/types/syncHost.d.ts +51 -0
  129. package/types/syncHost.d.ts.map +1 -0
  130. package/types/syncHost.test.d.ts +2 -0
  131. package/types/syncHost.test.d.ts.map +1 -0
@@ -41,7 +41,7 @@ class FakePgClient {
41
41
  rows: [...schemaRows("user", ["id", "name"]), ...schemaRows("project", ["id", "ownerId", "name"]), ...schemaRows("member", ["id", "projectId", "userId"])]
42
42
  };
43
43
  }
44
- if (sql.includes('INSERT INTO "zero_0"."mutations"')) {
44
+ if (sql.includes('INSERT INTO "zero_0"."mutations"') || sql.includes('INSERT INTO "zero_0".mutations')) {
45
45
  this.mutationResultInserts.push(params);
46
46
  return {
47
47
  rows: []
@@ -89,6 +89,40 @@ function pushRequest(mutationIDs) {
89
89
  });
90
90
  }
91
91
  (0, import_vitest.describe)("createZeroServer mutation recovery", () => {
92
+ (0, import_vitest.test)("discards async tasks from a rolled-back PostgreSQL mutation", async () => {
93
+ const pg = new FakePgClient();
94
+ let effectRuns = 0;
95
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
96
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
97
+ models: {
98
+ project: {
99
+ mutate: {
100
+ touch: async ({
101
+ server
102
+ }) => {
103
+ server?.asyncTasks.push(async () => {
104
+ effectRuns++;
105
+ });
106
+ throw new Error("rejected");
107
+ }
108
+ }
109
+ }
110
+ },
111
+ createServerActions: () => ({}),
112
+ pool: pg
113
+ });
114
+ const result = await zeroServer.handleMutationRequest({
115
+ authData: null,
116
+ request: pushRequest(1),
117
+ skipAsyncTasks: true
118
+ });
119
+ (0, import_vitest.expect)(result.response.mutations[0].result).toMatchObject({
120
+ error: "app",
121
+ message: "rejected"
122
+ });
123
+ (0, import_vitest.expect)(result.asyncTasks).toEqual([]);
124
+ (0, import_vitest.expect)(effectRuns).toBe(0);
125
+ });
92
126
  (0, import_vitest.test)("persists alreadyProcessed duplicate results for zero-cache recovery rows", async () => {
93
127
  const pg = new FakePgClient();
94
128
  const zeroServer = (0, import_createZeroServer.createZeroServer)({
@@ -83,7 +83,7 @@ var FakePgClient = /* @__PURE__ */function () {
83
83
  rows: [...schemaRows("user", ["id", "name"]), ...schemaRows("project", ["id", "ownerId", "name"]), ...schemaRows("member", ["id", "projectId", "userId"])]
84
84
  };
85
85
  }
86
- if (sql.includes('INSERT INTO "zero_0"."mutations"')) {
86
+ if (sql.includes('INSERT INTO "zero_0"."mutations"') || sql.includes('INSERT INTO "zero_0".mutations')) {
87
87
  this.mutationResultInserts.push(params);
88
88
  return {
89
89
  rows: []
@@ -137,6 +137,43 @@ function pushRequest(mutationIDs) {
137
137
  });
138
138
  }
139
139
  (0, import_vitest.describe)("createZeroServer mutation recovery", function () {
140
+ (0, import_vitest.test)("discards async tasks from a rolled-back PostgreSQL mutation", async function () {
141
+ var pg = new FakePgClient();
142
+ var effectRuns = 0;
143
+ var zeroServer = (0, import_createZeroServer.createZeroServer)({
144
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
145
+ models: {
146
+ project: {
147
+ mutate: {
148
+ touch: async function (param) {
149
+ var {
150
+ server
151
+ } = param;
152
+ server === null || server === void 0 ? void 0 : server.asyncTasks.push(async function () {
153
+ effectRuns++;
154
+ });
155
+ throw new Error("rejected");
156
+ }
157
+ }
158
+ }
159
+ },
160
+ createServerActions: function () {
161
+ return {};
162
+ },
163
+ pool: pg
164
+ });
165
+ var result = await zeroServer.handleMutationRequest({
166
+ authData: null,
167
+ request: pushRequest(1),
168
+ skipAsyncTasks: true
169
+ });
170
+ (0, import_vitest.expect)(result.response.mutations[0].result).toMatchObject({
171
+ error: "app",
172
+ message: "rejected"
173
+ });
174
+ (0, import_vitest.expect)(result.asyncTasks).toEqual([]);
175
+ (0, import_vitest.expect)(effectRuns).toBe(0);
176
+ });
140
177
  (0, import_vitest.test)("persists alreadyProcessed duplicate results for zero-cache recovery rows", async function () {
141
178
  var pg = new FakePgClient();
142
179
  var zeroServer = (0, import_createZeroServer.createZeroServer)({
@@ -1 +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":[]}
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","effectRuns","zeroServer","createZeroServer","zeroHttpFixtureSchema","models","project","mutate","touch","param","server","asyncTasks","createServerActions","pool","result","handleMutationRequest","authData","request","skipAsyncTasks","expect","response","toMatchObject","error","message","toEqual","toBe"],"sources":["../../src/createZeroServer.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,362 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
+ var __getOwnPropNames = Object.getOwnPropertyNames;
4
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
5
+ var __export = (target, all) => {
6
+ for (var name in all) __defProp(target, name, {
7
+ get: all[name],
8
+ enumerable: true
9
+ });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
14
+ get: () => from[key],
15
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
16
+ });
17
+ }
18
+ return to;
19
+ };
20
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
21
+ value: true
22
+ }), mod);
23
+ var createZeroServerCore_exports = {};
24
+ __export(createZeroServerCore_exports, {
25
+ createZeroServerCore: () => createZeroServerCore,
26
+ resolveServerQuery: () => resolveServerQuery
27
+ });
28
+ module.exports = __toCommonJS(createZeroServerCore_exports);
29
+ var import_zero = require("@rocicorp/zero");
30
+ var import_server = require("@rocicorp/zero/server");
31
+ var import_createPermissions = require("./createPermissions.cjs");
32
+ var import_createMutators = require("./helpers/createMutators.cjs");
33
+ var import_mutatorContext = require("./helpers/mutatorContext.cjs");
34
+ var import_queryContext = require("./helpers/queryContext.cjs");
35
+ var import_modelRegistry = require("./modelRegistry.cjs");
36
+ var import_run = require("./run.cjs");
37
+ var import_state = require("./state.cjs");
38
+ var import_where = require("./where.cjs");
39
+ var import_zeroRunner = require("./zeroRunner.cjs");
40
+ function resolveServerQuery({
41
+ authData,
42
+ name,
43
+ args,
44
+ queries,
45
+ permissions,
46
+ validateQuery
47
+ }) {
48
+ if (name.startsWith("permission.")) {
49
+ const table = name.slice("permission.".length);
50
+ const {
51
+ objOrId
52
+ } = args;
53
+ const permission = (0, import_modelRegistry.getMutationsPermissions)(table);
54
+ if (!permission) {
55
+ throw new Error(`[permission] no permission defined for table: ${table}`);
56
+ }
57
+ (0, import_where.setEvaluatingPermission)(true);
58
+ try {
59
+ return (0, import_state.getZQL)()[table].where(eb => {
60
+ return permissions.buildPermissionQuery(authData, eb, permission, objOrId, table);
61
+ }).one();
62
+ } finally {
63
+ (0, import_where.setEvaluatingPermission)(false);
64
+ }
65
+ }
66
+ if (validateQuery) {
67
+ validateQuery({
68
+ authData,
69
+ queryName: name,
70
+ params: args
71
+ });
72
+ }
73
+ const query = (0, import_zero.mustGetQuery)(queries, name);
74
+ return query.fn({
75
+ args,
76
+ ctx: authData
77
+ });
78
+ }
79
+ function createAsyncTaskCollector() {
80
+ const committed = [];
81
+ let attempt;
82
+ let completedAttempt;
83
+ const current = () => attempt ?? committed;
84
+ const queue = new Proxy([], {
85
+ deleteProperty(_target, property) {
86
+ return Reflect.deleteProperty(current(), property);
87
+ },
88
+ get(_target, property) {
89
+ const target = current();
90
+ const value = Reflect.get(target, property, target);
91
+ return typeof value === "function" ? value.bind(target) : value;
92
+ },
93
+ getOwnPropertyDescriptor(_target, property) {
94
+ return Reflect.getOwnPropertyDescriptor(current(), property);
95
+ },
96
+ has(_target, property) {
97
+ return Reflect.has(current(), property);
98
+ },
99
+ ownKeys() {
100
+ return Reflect.ownKeys(current());
101
+ },
102
+ set(_target, property, value) {
103
+ return Reflect.set(current(), property, value);
104
+ }
105
+ });
106
+ const lifecycle = {
107
+ beginAttempt() {
108
+ attempt = [];
109
+ completedAttempt = void 0;
110
+ },
111
+ completeAttempt() {
112
+ completedAttempt = attempt;
113
+ attempt = void 0;
114
+ },
115
+ rollbackAttempt() {
116
+ attempt = void 0;
117
+ completedAttempt = void 0;
118
+ },
119
+ commitTransaction() {
120
+ if (completedAttempt) committed.push(...completedAttempt);
121
+ completedAttempt = void 0;
122
+ },
123
+ rollbackTransaction() {
124
+ attempt = void 0;
125
+ completedAttempt = void 0;
126
+ }
127
+ };
128
+ return {
129
+ committed,
130
+ lifecycle,
131
+ queue
132
+ };
133
+ }
134
+ function createZeroServerCore({
135
+ createDatabase,
136
+ createServerActions,
137
+ defaultAllowAdminRole = "all",
138
+ defaultMutateAuthData = {},
139
+ models,
140
+ mutations: mutationValidators,
141
+ persistAlreadyProcessed,
142
+ queries,
143
+ schema,
144
+ validateMutation,
145
+ validateQuery
146
+ }) {
147
+ (0, import_state.setSchema)(schema);
148
+ (0, import_state.setEnvironment)("server");
149
+ const permissions = (0, import_createPermissions.createPermissions)({
150
+ environment: "server",
151
+ schema,
152
+ adminRoleMode: defaultAllowAdminRole
153
+ });
154
+ const handleMutationRequest = async ({
155
+ authData,
156
+ request,
157
+ skipAsyncTasks
158
+ }) => {
159
+ const tasks = createAsyncTaskCollector();
160
+ const recoveryRequest = request.clone();
161
+ const mutators = (0, import_createMutators.createMutators)({
162
+ asyncTasks: tasks.queue,
163
+ can: permissions.can,
164
+ createServerActions,
165
+ environment: "server",
166
+ models,
167
+ authData,
168
+ validateMutation,
169
+ mutationValidators
170
+ });
171
+ const processor = new import_server.PushProcessor(withTransactionLifecycle(createDatabase(), tasks.lifecycle));
172
+ const response = await processor.process(mutators, request);
173
+ if (persistAlreadyProcessed) {
174
+ const parsed = await parseAlreadyProcessed(recoveryRequest, response);
175
+ if (parsed) await persistAlreadyProcessed(parsed);
176
+ }
177
+ if (!skipAsyncTasks && tasks.committed.length) {
178
+ Promise.all(tasks.committed.map(task => (0, import_mutatorContext.runWithAuthScope)(authData, task))).catch(err => {
179
+ console.error("[push] async tasks failed", err);
180
+ });
181
+ }
182
+ return {
183
+ response,
184
+ asyncTasks: tasks.committed
185
+ };
186
+ };
187
+ const handleQueryRequest = async ({
188
+ authData,
189
+ request
190
+ }) => {
191
+ if (!queries) {
192
+ throw new Error("No queries registered with createZeroServer. Pass the syncedQueries registry to createZeroServer via the queries option.");
193
+ }
194
+ const handler = (name, args) => resolveServerQuery({
195
+ authData,
196
+ name,
197
+ args,
198
+ queries,
199
+ permissions,
200
+ validateQuery
201
+ });
202
+ const userID = typeof authData?.id === "string" ? authData.id : void 0;
203
+ const response = await (0, import_queryContext.runWithQueryContext)({
204
+ authData: authData || {}
205
+ }, () =>
206
+ // the legacy overload omits userID when auth does not identify a user.
207
+ userID === void 0 ? (0, import_server.handleQueryRequest)(handler, schema, request) : (0, import_server.handleQueryRequest)({
208
+ handler,
209
+ schema,
210
+ request,
211
+ userID
212
+ }));
213
+ return {
214
+ response
215
+ };
216
+ };
217
+ async function runTransaction(database, query2) {
218
+ try {
219
+ if ((0, import_mutatorContext.isInZeroMutation)()) {
220
+ const {
221
+ tx
222
+ } = (0, import_mutatorContext.mutatorContext)();
223
+ return await query2(tx);
224
+ }
225
+ return await database.transaction(query2, dummyTransactionInput);
226
+ } catch (err) {
227
+ if (err?.name !== "PermissionError") {
228
+ console.error(`Error running transaction(): ${err}`);
229
+ }
230
+ throw err;
231
+ }
232
+ }
233
+ async function transaction(query2) {
234
+ return runTransaction(createDatabase(), query2);
235
+ }
236
+ async function runMutate(modelName, mutatorName, mutatorArg, options) {
237
+ let authData = options?.authData;
238
+ if (!authData) {
239
+ const scoped = (0, import_mutatorContext.getScopedAuthData)();
240
+ if (scoped) authData = scoped;
241
+ }
242
+ const tasks = createAsyncTaskCollector();
243
+ const mutators = (0, import_createMutators.createMutators)({
244
+ models,
245
+ environment: "server",
246
+ asyncTasks: tasks.queue,
247
+ authData: {
248
+ ...defaultMutateAuthData,
249
+ ...authData
250
+ },
251
+ createServerActions,
252
+ can: permissions.can,
253
+ validateMutation,
254
+ mutationValidators
255
+ });
256
+ const modelMutators = mutators[modelName];
257
+ const mutator = modelMutators[mutatorName];
258
+ await runTransaction(withTransactionLifecycle(createDatabase(), tasks.lifecycle), async tx => {
259
+ await mutator(tx, mutatorArg);
260
+ });
261
+ if (tasks.committed.length) {
262
+ const resolvedAuth = authData ?? null;
263
+ const promise = Promise.all(tasks.committed.map(task => (0, import_mutatorContext.runWithAuthScope)(resolvedAuth, task)));
264
+ if (options?.awaitEffects) {
265
+ await promise;
266
+ } else {
267
+ promise.catch(err => {
268
+ console.error("[mutate] async tasks failed", err);
269
+ });
270
+ }
271
+ }
272
+ }
273
+ const mutate = new Proxy({}, {
274
+ get(_, modelName) {
275
+ return new Proxy({}, {
276
+ get(_2, mutatorName) {
277
+ return (arg, options) => runMutate(modelName, mutatorName, arg, options);
278
+ }
279
+ });
280
+ }
281
+ });
282
+ function query(cb, authData) {
283
+ const run = () => transaction(async tx => {
284
+ return tx.run(cb((0, import_state.getZQL)()));
285
+ });
286
+ if (authData !== void 0) {
287
+ return (0, import_queryContext.runWithQueryContext)({
288
+ authData
289
+ }, run);
290
+ }
291
+ return run();
292
+ }
293
+ if (queries) {
294
+ (0, import_run.setCustomQueries)(queries);
295
+ }
296
+ (0, import_zeroRunner.setRunner)(queryObj => {
297
+ return transaction(async tx => {
298
+ return tx.run(queryObj);
299
+ });
300
+ });
301
+ return {
302
+ handleMutationRequest,
303
+ handleQueryRequest,
304
+ transaction,
305
+ mutate,
306
+ query
307
+ };
308
+ }
309
+ function withTransactionLifecycle(database, lifecycle) {
310
+ return {
311
+ async transaction(callback, input) {
312
+ try {
313
+ const value = await database.transaction(async (tx, hooks) => {
314
+ lifecycle.beginAttempt();
315
+ try {
316
+ const result = await callback(tx, hooks);
317
+ lifecycle.completeAttempt();
318
+ return result;
319
+ } catch (error) {
320
+ lifecycle.rollbackAttempt();
321
+ throw error;
322
+ }
323
+ }, input);
324
+ lifecycle.commitTransaction();
325
+ return value;
326
+ } catch (error) {
327
+ lifecycle.rollbackTransaction();
328
+ throw error;
329
+ }
330
+ }
331
+ };
332
+ }
333
+ async function parseAlreadyProcessed(request, response) {
334
+ const mutations = alreadyProcessedMutations(response);
335
+ if (mutations.length === 0) return;
336
+ const upstreamSchema = new URL(request.url).searchParams.get("schema");
337
+ if (!upstreamSchema) return;
338
+ const body = await request.json();
339
+ if (typeof body.clientGroupID !== "string") return;
340
+ return {
341
+ clientGroupID: body.clientGroupID,
342
+ mutations,
343
+ upstreamSchema
344
+ };
345
+ }
346
+ function alreadyProcessedMutations(response) {
347
+ if (!response || typeof response !== "object") return [];
348
+ const mutations = response.mutations;
349
+ if (!Array.isArray(mutations)) return [];
350
+ return mutations.filter(mutation => {
351
+ if (!mutation || typeof mutation !== "object") return false;
352
+ const id = mutation.id;
353
+ const result = mutation.result;
354
+ return !!id && typeof id === "object" && typeof id.clientID === "string" && typeof id.id === "number" && !!result && typeof result === "object" && result.error === "alreadyProcessed";
355
+ });
356
+ }
357
+ const dummyTransactionInput = {
358
+ clientGroupID: "unused",
359
+ clientID: "unused",
360
+ mutationID: 42,
361
+ upstreamSchema: "unused"
362
+ };