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.
- package/dist/cjs/createZeroSQLiteServer.cjs +319 -0
- package/dist/cjs/createZeroSQLiteServer.native.js +440 -0
- package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -0
- package/dist/cjs/createZeroSQLiteServer.test.cjs +429 -0
- package/dist/cjs/createZeroSQLiteServer.test.native.js +466 -0
- package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -0
- package/dist/cjs/createZeroServer.cjs +20 -234
- package/dist/cjs/createZeroServer.native.js +24 -250
- package/dist/cjs/createZeroServer.native.js.map +1 -1
- package/dist/cjs/createZeroServer.test.cjs +35 -1
- package/dist/cjs/createZeroServer.test.native.js +38 -1
- package/dist/cjs/createZeroServer.test.native.js.map +1 -1
- package/dist/cjs/createZeroServerCore.cjs +362 -0
- package/dist/cjs/createZeroServerCore.native.js +389 -0
- package/dist/cjs/createZeroServerCore.native.js.map +1 -0
- package/dist/cjs/generate-lite.cjs +1 -0
- package/dist/cjs/generate-lite.native.js +1 -0
- package/dist/cjs/generate-lite.native.js.map +1 -1
- package/dist/cjs/generate-lite.test.cjs +5 -1
- package/dist/cjs/generate-lite.test.native.js +5 -1
- package/dist/cjs/generate-lite.test.native.js.map +1 -1
- package/dist/cjs/generate.cjs +20 -11
- package/dist/cjs/generate.native.js +29 -21
- package/dist/cjs/generate.native.js.map +1 -1
- package/dist/cjs/generate.test.cjs +110 -0
- package/dist/cjs/generate.test.native.js +110 -0
- package/dist/cjs/generate.test.native.js.map +1 -1
- package/dist/cjs/httpPull/transport.test.cjs +5 -4
- package/dist/cjs/httpPull/transport.test.native.js +6 -5
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
- package/dist/cjs/httpPullTransport.cjs +2 -1
- package/dist/cjs/httpPullTransport.native.js +3 -2
- package/dist/cjs/httpPullTransport.native.js.map +1 -1
- package/dist/cjs/server.cjs +2 -1
- package/dist/cjs/syncHost.cjs +164 -0
- package/dist/cjs/syncHost.native.js +371 -0
- package/dist/cjs/syncHost.native.js.map +1 -0
- package/dist/cjs/syncHost.test.cjs +229 -0
- package/dist/cjs/syncHost.test.native.js +278 -0
- package/dist/cjs/syncHost.test.native.js.map +1 -0
- package/dist/esm/createZeroSQLiteServer.mjs +293 -0
- package/dist/esm/createZeroSQLiteServer.mjs.map +1 -0
- package/dist/esm/createZeroSQLiteServer.native.js +411 -0
- package/dist/esm/createZeroSQLiteServer.native.js.map +1 -0
- package/dist/esm/createZeroSQLiteServer.test.mjs +430 -0
- package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -0
- package/dist/esm/createZeroSQLiteServer.test.native.js +464 -0
- package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -0
- package/dist/esm/createZeroServer.mjs +17 -231
- package/dist/esm/createZeroServer.mjs.map +1 -1
- package/dist/esm/createZeroServer.native.js +21 -247
- package/dist/esm/createZeroServer.native.js.map +1 -1
- package/dist/esm/createZeroServer.test.mjs +35 -1
- package/dist/esm/createZeroServer.test.mjs.map +1 -1
- package/dist/esm/createZeroServer.test.native.js +38 -1
- package/dist/esm/createZeroServer.test.native.js.map +1 -1
- package/dist/esm/createZeroServerCore.mjs +336 -0
- package/dist/esm/createZeroServerCore.mjs.map +1 -0
- package/dist/esm/createZeroServerCore.native.js +360 -0
- package/dist/esm/createZeroServerCore.native.js.map +1 -0
- package/dist/esm/generate-lite.mjs +1 -0
- package/dist/esm/generate-lite.mjs.map +1 -1
- package/dist/esm/generate-lite.native.js +1 -0
- package/dist/esm/generate-lite.native.js.map +1 -1
- package/dist/esm/generate-lite.test.mjs +5 -1
- package/dist/esm/generate-lite.test.mjs.map +1 -1
- package/dist/esm/generate-lite.test.native.js +5 -1
- package/dist/esm/generate-lite.test.native.js.map +1 -1
- package/dist/esm/generate.mjs +20 -11
- package/dist/esm/generate.mjs.map +1 -1
- package/dist/esm/generate.native.js +29 -21
- package/dist/esm/generate.native.js.map +1 -1
- package/dist/esm/generate.test.mjs +87 -1
- package/dist/esm/generate.test.mjs.map +1 -1
- package/dist/esm/generate.test.native.js +87 -1
- package/dist/esm/generate.test.native.js.map +1 -1
- package/dist/esm/httpPull/transport.test.mjs +5 -4
- package/dist/esm/httpPull/transport.test.mjs.map +1 -1
- package/dist/esm/httpPull/transport.test.native.js +6 -5
- package/dist/esm/httpPull/transport.test.native.js.map +1 -1
- package/dist/esm/httpPullTransport.mjs +2 -1
- package/dist/esm/httpPullTransport.mjs.map +1 -1
- package/dist/esm/httpPullTransport.native.js +3 -2
- package/dist/esm/httpPullTransport.native.js.map +1 -1
- package/dist/esm/server.mjs +1 -0
- package/dist/esm/server.mjs.map +1 -1
- package/dist/esm/syncHost.mjs +138 -0
- package/dist/esm/syncHost.mjs.map +1 -0
- package/dist/esm/syncHost.native.js +342 -0
- package/dist/esm/syncHost.native.js.map +1 -0
- package/dist/esm/syncHost.test.mjs +206 -0
- package/dist/esm/syncHost.test.mjs.map +1 -0
- package/dist/esm/syncHost.test.native.js +252 -0
- package/dist/esm/syncHost.test.native.js.map +1 -0
- package/package.json +19 -3
- package/readme.md +26 -0
- package/src/createZeroSQLiteServer.test.ts +461 -0
- package/src/createZeroSQLiteServer.ts +523 -0
- package/src/createZeroServer.test.ts +39 -1
- package/src/createZeroServer.ts +35 -428
- package/src/createZeroServerCore.ts +557 -0
- package/src/generate-lite.test.ts +4 -0
- package/src/generate-lite.ts +1 -0
- package/src/generate.test.ts +87 -1
- package/src/generate.ts +29 -20
- package/src/httpPull/transport.test.ts +6 -5
- package/src/httpPullTransport.ts +9 -4
- package/src/server.ts +1 -0
- package/src/syncHost.test.ts +216 -0
- package/src/syncHost.ts +255 -0
- package/test-fixtures/server-return-types.ts +50 -0
- package/test-fixtures/tsconfig.json +13 -0
- package/types/createZeroSQLiteServer.d.ts +37 -0
- package/types/createZeroSQLiteServer.d.ts.map +1 -0
- package/types/createZeroSQLiteServer.test.d.ts +2 -0
- package/types/createZeroSQLiteServer.test.d.ts.map +1 -0
- package/types/createZeroServer.d.ts +11 -293
- package/types/createZeroServer.d.ts.map +1 -1
- package/types/createZeroServerCore.d.ts +310 -0
- package/types/createZeroServerCore.d.ts.map +1 -0
- package/types/generate-lite.d.ts.map +1 -1
- package/types/generate.d.ts +2 -1
- package/types/generate.d.ts.map +1 -1
- package/types/httpPullTransport.d.ts +1 -0
- package/types/httpPullTransport.d.ts.map +1 -1
- package/types/server.d.ts +1 -0
- package/types/server.d.ts.map +1 -1
- package/types/syncHost.d.ts +51 -0
- package/types/syncHost.d.ts.map +1 -0
- package/types/syncHost.test.d.ts +2 -0
- 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":"AAAA;;AAEA,IAAAA,aAAA,GAAAC,OAAA,SAAiC;AACjC,IAAAC,uBAAsC,GAAAD,OAAA;AAEtC,IAAAE,oBAAmB,GAAAF,OAAA;AAAA,SACjBG,iBAAiBA,CAAAC,QAAA,EAAAC,WAAA;EACjB,MAAAD,QAAA,YAAAC,WAAA;IACA,UAAAC,SAAA,oCAAsC;EAEtC;AACE;AACE,SAAAC,iBAAKA,CAAAC,MAAA,EAAwBC,KAAA;EAC7B,SAAAC,CAAA,GAAS,GAAAA,CAAA,GAAOD,KAAE,CAAAE,MAAA,EAAAD,CAAA;IACpB,IAAAE,UAAA,GAAAH,KAAA,CAAAC,CAAA;IAEAE,UAAI,CAAAC,UAAQ,GAAUD,UAAA,CAAAC,UAAA;IACpBD,UAAI,CAAKE,YAAA;IACP,WAAK,IAAAF,UAAA,EAAiBA,UAAK,CAAAG,QAAA;IAAAC,MAC7B,CAAAC,cAAA,CAAAT,MAAA,EAAAI,UAAA,CAAAM,GAAA,EAAAN,UAAA;EACA;AACA;AAAkB,SACpBO,cAAAd,WAAA,EAAAe,UAAA,EAAAC,WAAA;EAEA,IAAAD,UAAY,EAAAb,iBAAY,CAAAF,WAAA,CAAAiB,SAAA,EAAAF,UAAA;EACtB,IAAAC,WAAK,EAAAd,iBAAwB,CAAAF,WAAA,EAAAgB,WAAA;EAC7B,OAAAhB,WAAS;AAAS;AAGpB,SAAIkB,gBAAaA,CAAAC,GAAA,EAAUN,GAAA,EAAKO,KAAI;EAClC,IAAAP,GAAA,IAAMM,GAAA;IACNR,MAAA,CAAKC,cAAA,CAAAO,GAAA,EAAAN,GAAA,EAAwB;MAC7BO,KAAA;MACFZ,UAAA;MAEAC,YAAQ,MAAS;MACfC,QAAO;IAAA;EACC;IACgCS,GAAA,CAAAN,GACpC,IAAGO,KAAA;EAA+C;EACG,OACvDD,GAAA;AAAA;AACF,IACFE,YAAA;EAEA,
|
|
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
|
+
};
|