on-zero 0.6.11 → 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 +44 -0
- package/dist/cjs/httpPull/transport.test.native.js +53 -0
- package/dist/cjs/httpPull/transport.test.native.js.map +1 -1
- package/dist/cjs/httpPullTransport.cjs +4 -1
- package/dist/cjs/httpPullTransport.native.js +5 -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 +44 -0
- package/dist/esm/httpPull/transport.test.mjs.map +1 -1
- package/dist/esm/httpPull/transport.test.native.js +53 -0
- package/dist/esm/httpPull/transport.test.native.js.map +1 -1
- package/dist/esm/httpPullTransport.mjs +4 -1
- package/dist/esm/httpPullTransport.mjs.map +1 -1
- package/dist/esm/httpPullTransport.native.js +5 -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 +47 -0
- package/src/httpPullTransport.ts +15 -1
- 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 +2 -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
|
@@ -25,268 +25,54 @@ __export(createZeroServer_exports, {
|
|
|
25
25
|
createZeroServer: () => createZeroServer
|
|
26
26
|
});
|
|
27
27
|
module.exports = __toCommonJS(createZeroServer_exports);
|
|
28
|
-
var
|
|
29
|
-
var import_pg = require("@rocicorp/zero/pg");
|
|
30
|
-
var import_server = require("@rocicorp/zero/server");
|
|
31
|
-
var import_pg2 = require("@rocicorp/zero/server/adapters/pg");
|
|
28
|
+
var import_pg = require("@rocicorp/zero/server/adapters/pg");
|
|
32
29
|
var import_helpers = require("@take-out/helpers");
|
|
33
|
-
var
|
|
34
|
-
var
|
|
35
|
-
var import_createMutators = require("./helpers/createMutators.cjs");
|
|
36
|
-
var import_mutatorContext = require("./helpers/mutatorContext.cjs");
|
|
37
|
-
var import_queryContext = require("./helpers/queryContext.cjs");
|
|
38
|
-
var import_modelRegistry = require("./modelRegistry.cjs");
|
|
39
|
-
var import_run = require("./run.cjs");
|
|
40
|
-
var import_state = require("./state.cjs");
|
|
41
|
-
var import_where = require("./where.cjs");
|
|
42
|
-
var import_zeroRunner = require("./zeroRunner.cjs");
|
|
30
|
+
var import_pg2 = require("pg");
|
|
31
|
+
var import_createZeroServerCore = require("./createZeroServerCore.cjs");
|
|
43
32
|
function createZeroServer({
|
|
44
|
-
createServerActions,
|
|
45
33
|
database,
|
|
46
34
|
pool: externalPool,
|
|
47
|
-
|
|
48
|
-
models,
|
|
49
|
-
queries,
|
|
50
|
-
mutations: mutationValidators,
|
|
51
|
-
validateQuery,
|
|
52
|
-
validateMutation,
|
|
53
|
-
defaultAllowAdminRole = "all",
|
|
54
|
-
defaultMutateAuthData = {}
|
|
35
|
+
...options
|
|
55
36
|
}) {
|
|
56
|
-
(0, import_state.setSchema)(schema);
|
|
57
|
-
(0, import_state.setEnvironment)("server");
|
|
58
37
|
let pool;
|
|
59
38
|
if (externalPool) {
|
|
60
39
|
pool = externalPool;
|
|
61
40
|
} else {
|
|
62
|
-
const dbString = (0, import_helpers.assertString)(database,
|
|
63
|
-
const pgPool = new
|
|
41
|
+
const dbString = (0, import_helpers.assertString)(database, 'createZeroServer "database"');
|
|
42
|
+
const pgPool = new import_pg2.Pool({
|
|
64
43
|
connectionString: dbString,
|
|
65
|
-
// handle self-signed certificates in production
|
|
66
44
|
ssl: dbString.includes("sslmode=require") ? {
|
|
67
45
|
rejectUnauthorized: false
|
|
68
46
|
} : void 0
|
|
69
47
|
});
|
|
70
48
|
pgPool.on("error", error => {
|
|
71
|
-
console.error(
|
|
49
|
+
console.error("[on-zero] pool error", error.message);
|
|
72
50
|
});
|
|
73
51
|
pgPool.on("connect", client => {
|
|
74
52
|
client.on("error", error => {
|
|
75
|
-
console.error(
|
|
53
|
+
console.error("[on-zero] client error", error.message);
|
|
76
54
|
});
|
|
77
55
|
});
|
|
78
56
|
pool = pgPool;
|
|
79
57
|
}
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
});
|
|
86
|
-
const processor = new import_pg.PushProcessor(zeroDb);
|
|
87
|
-
const handleMutationRequest = async ({
|
|
88
|
-
authData,
|
|
89
|
-
request,
|
|
90
|
-
skipAsyncTasks
|
|
91
|
-
}) => {
|
|
92
|
-
const asyncTasks = [];
|
|
93
|
-
const recoveryRequest = request.clone();
|
|
94
|
-
const mutators = (0, import_createMutators.createMutators)({
|
|
95
|
-
asyncTasks,
|
|
96
|
-
can: permissions.can,
|
|
97
|
-
createServerActions,
|
|
98
|
-
environment: "server",
|
|
99
|
-
models,
|
|
100
|
-
authData,
|
|
101
|
-
validateMutation,
|
|
102
|
-
mutationValidators
|
|
103
|
-
});
|
|
104
|
-
const response = await processor.process(mutators, request);
|
|
105
|
-
await persistAlreadyProcessedMutationResults(pool, recoveryRequest, response);
|
|
106
|
-
if (!skipAsyncTasks && asyncTasks.length) {
|
|
107
|
-
Promise.all(asyncTasks.map(task => (0, import_mutatorContext.runWithAuthScope)(authData, task))).catch(err => {
|
|
108
|
-
console.error(`[push] async tasks failed`, err);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
return {
|
|
112
|
-
response,
|
|
113
|
-
asyncTasks
|
|
114
|
-
};
|
|
115
|
-
};
|
|
116
|
-
const handleQueryRequest = async ({
|
|
117
|
-
authData,
|
|
118
|
-
request
|
|
119
|
-
}) => {
|
|
120
|
-
if (!queries) {
|
|
121
|
-
throw new Error("No queries registered with createZeroServer. Pass the syncedQueries registry to createZeroServer via the queries option.");
|
|
122
|
-
}
|
|
123
|
-
const handler = (name, args) => {
|
|
124
|
-
if (name.startsWith("permission.")) {
|
|
125
|
-
const table = name.slice("permission.".length);
|
|
126
|
-
const {
|
|
127
|
-
objOrId
|
|
128
|
-
} = args;
|
|
129
|
-
const perm = (0, import_modelRegistry.getMutationsPermissions)(table);
|
|
130
|
-
if (!perm) {
|
|
131
|
-
throw new Error(`[permission] no permission defined for table: ${table}`);
|
|
132
|
-
}
|
|
133
|
-
(0, import_where.setEvaluatingPermission)(true);
|
|
134
|
-
try {
|
|
135
|
-
return (0, import_state.getZQL)()[table].where(eb => {
|
|
136
|
-
return permissions.buildPermissionQuery(authData, eb, perm, objOrId, table);
|
|
137
|
-
}).one();
|
|
138
|
-
} finally {
|
|
139
|
-
(0, import_where.setEvaluatingPermission)(false);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
if (validateQuery) {
|
|
143
|
-
validateQuery({
|
|
144
|
-
authData,
|
|
145
|
-
queryName: name,
|
|
146
|
-
params: args
|
|
147
|
-
});
|
|
148
|
-
}
|
|
149
|
-
const query2 = (0, import_zero.mustGetQuery)(queries, name);
|
|
150
|
-
return query2.fn({
|
|
151
|
-
args,
|
|
152
|
-
ctx: authData
|
|
153
|
-
});
|
|
154
|
-
};
|
|
155
|
-
const userID = typeof authData?.id === "string" ? authData.id : void 0;
|
|
156
|
-
const response = await (0, import_queryContext.runWithQueryContext)({
|
|
157
|
-
authData: authData || {}
|
|
158
|
-
}, () => userID === void 0 ? (0, import_server.handleQueryRequest)(handler, schema, request) : (0, import_server.handleQueryRequest)({
|
|
159
|
-
handler,
|
|
160
|
-
schema,
|
|
161
|
-
request,
|
|
162
|
-
userID
|
|
163
|
-
}));
|
|
164
|
-
return {
|
|
165
|
-
response
|
|
166
|
-
};
|
|
167
|
-
};
|
|
168
|
-
async function runMutate(modelName, mutatorName, mutatorArg, options) {
|
|
169
|
-
let authData = options?.authData;
|
|
170
|
-
if (!authData) {
|
|
171
|
-
const scoped = (0, import_mutatorContext.getScopedAuthData)();
|
|
172
|
-
if (scoped) {
|
|
173
|
-
authData = scoped;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
const asyncTasks = [];
|
|
177
|
-
const mutators = (0, import_createMutators.createMutators)({
|
|
178
|
-
models,
|
|
179
|
-
environment: "server",
|
|
180
|
-
asyncTasks,
|
|
181
|
-
authData: {
|
|
182
|
-
...defaultMutateAuthData,
|
|
183
|
-
...authData
|
|
184
|
-
},
|
|
185
|
-
createServerActions,
|
|
186
|
-
can: permissions.can,
|
|
187
|
-
validateMutation,
|
|
188
|
-
mutationValidators
|
|
189
|
-
});
|
|
190
|
-
const modelMutators = mutators[modelName];
|
|
191
|
-
const mutator = modelMutators[mutatorName];
|
|
192
|
-
await transaction(async tx => {
|
|
193
|
-
await mutator(tx, mutatorArg);
|
|
194
|
-
});
|
|
195
|
-
if (asyncTasks.length) {
|
|
196
|
-
const resolvedAuth = authData ?? null;
|
|
197
|
-
const promise = Promise.all(asyncTasks.map(t => (0, import_mutatorContext.runWithAuthScope)(resolvedAuth, t)));
|
|
198
|
-
if (options?.awaitEffects) {
|
|
199
|
-
await promise;
|
|
200
|
-
} else {
|
|
201
|
-
promise.catch(err => {
|
|
202
|
-
console.error(`[mutate] async tasks failed`, err);
|
|
203
|
-
});
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
const mutate = new Proxy({}, {
|
|
208
|
-
get(_, modelName) {
|
|
209
|
-
return new Proxy({}, {
|
|
210
|
-
get(_2, mutatorName) {
|
|
211
|
-
return (arg, options) => runMutate(modelName, mutatorName, arg, options);
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
}
|
|
215
|
-
});
|
|
216
|
-
async function transaction(query2) {
|
|
217
|
-
try {
|
|
218
|
-
if ((0, import_mutatorContext.isInZeroMutation)()) {
|
|
219
|
-
const {
|
|
220
|
-
tx
|
|
221
|
-
} = (0, import_mutatorContext.mutatorContext)();
|
|
222
|
-
return await query2(tx);
|
|
223
|
-
}
|
|
224
|
-
const output = await zeroDb.transaction(query2, dummyTransactionInput);
|
|
225
|
-
return output;
|
|
226
|
-
} catch (err) {
|
|
227
|
-
if (err?.name !== "PermissionError") {
|
|
228
|
-
console.error(`Error running transaction(): ${err}`);
|
|
229
|
-
}
|
|
230
|
-
throw err;
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
function query(cb, authData) {
|
|
234
|
-
const run = () => transaction(async tx => {
|
|
235
|
-
return tx.run(cb((0, import_state.getZQL)()));
|
|
236
|
-
});
|
|
237
|
-
if (authData !== void 0) {
|
|
238
|
-
return (0, import_queryContext.runWithQueryContext)({
|
|
239
|
-
authData
|
|
240
|
-
}, run);
|
|
241
|
-
}
|
|
242
|
-
return run();
|
|
243
|
-
}
|
|
244
|
-
if (queries) {
|
|
245
|
-
(0, import_run.setCustomQueries)(queries);
|
|
246
|
-
}
|
|
247
|
-
(0, import_zeroRunner.setRunner)(queryObj => {
|
|
248
|
-
return transaction(async tx => {
|
|
249
|
-
return tx.run(queryObj);
|
|
250
|
-
});
|
|
251
|
-
});
|
|
252
|
-
const dummyTransactionInput = {
|
|
253
|
-
clientGroupID: "unused",
|
|
254
|
-
clientID: "unused",
|
|
255
|
-
mutationID: 42,
|
|
256
|
-
upstreamSchema: "unused"
|
|
257
|
-
};
|
|
258
|
-
return {
|
|
259
|
-
handleMutationRequest,
|
|
260
|
-
handleQueryRequest,
|
|
261
|
-
transaction,
|
|
262
|
-
mutate,
|
|
263
|
-
query
|
|
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";
|
|
58
|
+
const databaseProvider = (0, import_pg.zeroNodePg)(options.schema, pool);
|
|
59
|
+
return (0, import_createZeroServerCore.createZeroServerCore)({
|
|
60
|
+
...options,
|
|
61
|
+
createDatabase: () => databaseProvider,
|
|
62
|
+
persistAlreadyProcessed: args => persistAlreadyProcessedMutationResults(pool, args)
|
|
275
63
|
});
|
|
276
64
|
}
|
|
277
|
-
async function persistAlreadyProcessedMutationResults(pool,
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
const
|
|
283
|
-
if (typeof body.clientGroupID !== "string") return;
|
|
284
|
-
const table = `${quotePgIdentifier(schema)}."mutations"`;
|
|
65
|
+
async function persistAlreadyProcessedMutationResults(pool, {
|
|
66
|
+
clientGroupID,
|
|
67
|
+
mutations,
|
|
68
|
+
upstreamSchema
|
|
69
|
+
}) {
|
|
70
|
+
const table = `${quotePgIdentifier(upstreamSchema)}."mutations"`;
|
|
285
71
|
const values = mutations.map((_, index) => {
|
|
286
72
|
const offset = index * 4;
|
|
287
73
|
return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
|
|
288
74
|
}).join(", ");
|
|
289
|
-
const params = mutations.flatMap(mutation => [
|
|
75
|
+
const params = mutations.flatMap(mutation => [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)]);
|
|
290
76
|
await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
|
|
291
77
|
VALUES ${values}
|
|
292
78
|
ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
|
|
@@ -27,287 +27,61 @@ __export(createZeroServer_exports, {
|
|
|
27
27
|
createZeroServer: () => createZeroServer
|
|
28
28
|
});
|
|
29
29
|
module.exports = __toCommonJS(createZeroServer_exports);
|
|
30
|
-
var
|
|
31
|
-
var import_pg = require("@rocicorp/zero/pg");
|
|
32
|
-
var import_server = require("@rocicorp/zero/server");
|
|
33
|
-
var import_pg2 = require("@rocicorp/zero/server/adapters/pg");
|
|
30
|
+
var import_pg = require("@rocicorp/zero/server/adapters/pg");
|
|
34
31
|
var import_helpers = require("@take-out/helpers");
|
|
35
|
-
var
|
|
36
|
-
var
|
|
37
|
-
var import_createMutators = require("./helpers/createMutators.native.js");
|
|
38
|
-
var import_mutatorContext = require("./helpers/mutatorContext.native.js");
|
|
39
|
-
var import_queryContext = require("./helpers/queryContext.native.js");
|
|
40
|
-
var import_modelRegistry = require("./modelRegistry.native.js");
|
|
41
|
-
var import_run = require("./run.native.js");
|
|
42
|
-
var import_state = require("./state.native.js");
|
|
43
|
-
var import_where = require("./where.native.js");
|
|
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
|
-
}
|
|
32
|
+
var import_pg2 = require("pg");
|
|
33
|
+
var import_createZeroServerCore = require("./createZeroServerCore.native.js");
|
|
50
34
|
function createZeroServer(param) {
|
|
51
35
|
var {
|
|
52
|
-
createServerActions,
|
|
53
36
|
database,
|
|
54
37
|
pool: externalPool,
|
|
55
|
-
|
|
56
|
-
models,
|
|
57
|
-
queries,
|
|
58
|
-
mutations: mutationValidators,
|
|
59
|
-
validateQuery,
|
|
60
|
-
validateMutation,
|
|
61
|
-
defaultAllowAdminRole = "all",
|
|
62
|
-
defaultMutateAuthData = {}
|
|
38
|
+
...options
|
|
63
39
|
} = param;
|
|
64
|
-
(0, import_state.setSchema)(schema);
|
|
65
|
-
(0, import_state.setEnvironment)("server");
|
|
66
40
|
var pool;
|
|
67
41
|
if (externalPool) {
|
|
68
42
|
pool = externalPool;
|
|
69
43
|
} else {
|
|
70
|
-
var dbString = (0, import_helpers.assertString)(database,
|
|
71
|
-
var pgPool = new
|
|
44
|
+
var dbString = (0, import_helpers.assertString)(database, 'createZeroServer "database"');
|
|
45
|
+
var pgPool = new import_pg2.Pool({
|
|
72
46
|
connectionString: dbString,
|
|
73
|
-
// handle self-signed certificates in production
|
|
74
47
|
ssl: dbString.includes("sslmode=require") ? {
|
|
75
48
|
rejectUnauthorized: false
|
|
76
49
|
} : void 0
|
|
77
50
|
});
|
|
78
51
|
pgPool.on("error", function (error) {
|
|
79
|
-
console.error(
|
|
52
|
+
console.error("[on-zero] pool error", error.message);
|
|
80
53
|
});
|
|
81
54
|
pgPool.on("connect", function (client) {
|
|
82
55
|
client.on("error", function (error) {
|
|
83
|
-
console.error(
|
|
56
|
+
console.error("[on-zero] client error", error.message);
|
|
84
57
|
});
|
|
85
58
|
});
|
|
86
59
|
pool = pgPool;
|
|
87
60
|
}
|
|
88
|
-
var
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
var {
|
|
97
|
-
authData,
|
|
98
|
-
request,
|
|
99
|
-
skipAsyncTasks
|
|
100
|
-
} = param2;
|
|
101
|
-
var asyncTasks = [];
|
|
102
|
-
var recoveryRequest = request.clone();
|
|
103
|
-
var mutators = (0, import_createMutators.createMutators)({
|
|
104
|
-
asyncTasks,
|
|
105
|
-
can: permissions.can,
|
|
106
|
-
createServerActions,
|
|
107
|
-
environment: "server",
|
|
108
|
-
models,
|
|
109
|
-
authData,
|
|
110
|
-
validateMutation,
|
|
111
|
-
mutationValidators
|
|
112
|
-
});
|
|
113
|
-
var response = await processor.process(mutators, request);
|
|
114
|
-
await persistAlreadyProcessedMutationResults(pool, recoveryRequest, response);
|
|
115
|
-
if (!skipAsyncTasks && asyncTasks.length) {
|
|
116
|
-
Promise.all(asyncTasks.map(function (task) {
|
|
117
|
-
return (0, import_mutatorContext.runWithAuthScope)(authData, task);
|
|
118
|
-
})).catch(function (err) {
|
|
119
|
-
console.error(`[push] async tasks failed`, err);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
return {
|
|
123
|
-
response,
|
|
124
|
-
asyncTasks
|
|
125
|
-
};
|
|
126
|
-
};
|
|
127
|
-
var handleQueryRequest = async function (param2) {
|
|
128
|
-
var {
|
|
129
|
-
authData,
|
|
130
|
-
request
|
|
131
|
-
} = param2;
|
|
132
|
-
if (!queries) {
|
|
133
|
-
throw new Error("No queries registered with createZeroServer. Pass the syncedQueries registry to createZeroServer via the queries option.");
|
|
134
|
-
}
|
|
135
|
-
var handler = function (name, args) {
|
|
136
|
-
if (name.startsWith("permission.")) {
|
|
137
|
-
var table = name.slice("permission.".length);
|
|
138
|
-
var {
|
|
139
|
-
objOrId
|
|
140
|
-
} = args;
|
|
141
|
-
var perm = (0, import_modelRegistry.getMutationsPermissions)(table);
|
|
142
|
-
if (!perm) {
|
|
143
|
-
throw new Error(`[permission] no permission defined for table: ${table}`);
|
|
144
|
-
}
|
|
145
|
-
(0, import_where.setEvaluatingPermission)(true);
|
|
146
|
-
try {
|
|
147
|
-
return (0, import_state.getZQL)()[table].where(function (eb) {
|
|
148
|
-
return permissions.buildPermissionQuery(authData, eb, perm, objOrId, table);
|
|
149
|
-
}).one();
|
|
150
|
-
} finally {
|
|
151
|
-
(0, import_where.setEvaluatingPermission)(false);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
if (validateQuery) {
|
|
155
|
-
validateQuery({
|
|
156
|
-
authData,
|
|
157
|
-
queryName: name,
|
|
158
|
-
params: args
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
var _$query = (0, import_zero.mustGetQuery)(queries, name);
|
|
162
|
-
return _$query.fn({
|
|
163
|
-
args,
|
|
164
|
-
ctx: authData
|
|
165
|
-
});
|
|
166
|
-
};
|
|
167
|
-
var userID = typeof (authData === null || authData === void 0 ? void 0 : authData.id) === "string" ? authData.id : void 0;
|
|
168
|
-
var response = await (0, import_queryContext.runWithQueryContext)({
|
|
169
|
-
authData: authData || {}
|
|
170
|
-
}, function () {
|
|
171
|
-
return userID === void 0 ? (0, import_server.handleQueryRequest)(handler, schema, request) : (0, import_server.handleQueryRequest)({
|
|
172
|
-
handler,
|
|
173
|
-
schema,
|
|
174
|
-
request,
|
|
175
|
-
userID
|
|
176
|
-
});
|
|
177
|
-
});
|
|
178
|
-
return {
|
|
179
|
-
response
|
|
180
|
-
};
|
|
181
|
-
};
|
|
182
|
-
async function runMutate(modelName, mutatorName, mutatorArg, options) {
|
|
183
|
-
var authData = options === null || options === void 0 ? void 0 : options.authData;
|
|
184
|
-
if (!authData) {
|
|
185
|
-
var scoped = (0, import_mutatorContext.getScopedAuthData)();
|
|
186
|
-
if (scoped) {
|
|
187
|
-
authData = scoped;
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
var asyncTasks = [];
|
|
191
|
-
var mutators = (0, import_createMutators.createMutators)({
|
|
192
|
-
models,
|
|
193
|
-
environment: "server",
|
|
194
|
-
asyncTasks,
|
|
195
|
-
authData: {
|
|
196
|
-
...defaultMutateAuthData,
|
|
197
|
-
...authData
|
|
198
|
-
},
|
|
199
|
-
createServerActions,
|
|
200
|
-
can: permissions.can,
|
|
201
|
-
validateMutation,
|
|
202
|
-
mutationValidators
|
|
203
|
-
});
|
|
204
|
-
var modelMutators = mutators[modelName];
|
|
205
|
-
var mutator = modelMutators[mutatorName];
|
|
206
|
-
await transaction(async function (tx) {
|
|
207
|
-
await mutator(tx, mutatorArg);
|
|
208
|
-
});
|
|
209
|
-
if (asyncTasks.length) {
|
|
210
|
-
var resolvedAuth = authData !== null && authData !== void 0 ? authData : null;
|
|
211
|
-
var promise = Promise.all(asyncTasks.map(function (t) {
|
|
212
|
-
return (0, import_mutatorContext.runWithAuthScope)(resolvedAuth, t);
|
|
213
|
-
}));
|
|
214
|
-
if (options === null || options === void 0 ? void 0 : options.awaitEffects) {
|
|
215
|
-
await promise;
|
|
216
|
-
} else {
|
|
217
|
-
promise.catch(function (err) {
|
|
218
|
-
console.error(`[mutate] async tasks failed`, err);
|
|
219
|
-
});
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
var mutate = new Proxy({}, {
|
|
224
|
-
get(_, modelName) {
|
|
225
|
-
return new Proxy({}, {
|
|
226
|
-
get(_2, mutatorName) {
|
|
227
|
-
return function (arg, options) {
|
|
228
|
-
return runMutate(modelName, mutatorName, arg, options);
|
|
229
|
-
};
|
|
230
|
-
}
|
|
231
|
-
});
|
|
232
|
-
}
|
|
233
|
-
});
|
|
234
|
-
async function transaction(query2) {
|
|
235
|
-
try {
|
|
236
|
-
if ((0, import_mutatorContext.isInZeroMutation)()) {
|
|
237
|
-
var {
|
|
238
|
-
tx
|
|
239
|
-
} = (0, import_mutatorContext.mutatorContext)();
|
|
240
|
-
return await query2(tx);
|
|
241
|
-
}
|
|
242
|
-
var output = await zeroDb.transaction(query2, dummyTransactionInput);
|
|
243
|
-
return output;
|
|
244
|
-
} catch (err) {
|
|
245
|
-
if ((err === null || err === void 0 ? void 0 : err.name) !== "PermissionError") {
|
|
246
|
-
console.error(`Error running transaction(): ${err}`);
|
|
247
|
-
}
|
|
248
|
-
throw err;
|
|
249
|
-
}
|
|
250
|
-
}
|
|
251
|
-
function query(cb, authData) {
|
|
252
|
-
var run = function () {
|
|
253
|
-
return transaction(async function (tx) {
|
|
254
|
-
return tx.run(cb((0, import_state.getZQL)()));
|
|
255
|
-
});
|
|
256
|
-
};
|
|
257
|
-
if (authData !== void 0) {
|
|
258
|
-
return (0, import_queryContext.runWithQueryContext)({
|
|
259
|
-
authData
|
|
260
|
-
}, run);
|
|
61
|
+
var databaseProvider = (0, import_pg.zeroNodePg)(options.schema, pool);
|
|
62
|
+
return (0, import_createZeroServerCore.createZeroServerCore)({
|
|
63
|
+
...options,
|
|
64
|
+
createDatabase: function () {
|
|
65
|
+
return databaseProvider;
|
|
66
|
+
},
|
|
67
|
+
persistAlreadyProcessed: function (args) {
|
|
68
|
+
return persistAlreadyProcessedMutationResults(pool, args);
|
|
261
69
|
}
|
|
262
|
-
return run();
|
|
263
|
-
}
|
|
264
|
-
if (queries) {
|
|
265
|
-
(0, import_run.setCustomQueries)(queries);
|
|
266
|
-
}
|
|
267
|
-
(0, import_zeroRunner.setRunner)(function (queryObj) {
|
|
268
|
-
return transaction(async function (tx) {
|
|
269
|
-
return tx.run(queryObj);
|
|
270
|
-
});
|
|
271
70
|
});
|
|
272
|
-
var dummyTransactionInput = {
|
|
273
|
-
clientGroupID: "unused",
|
|
274
|
-
clientID: "unused",
|
|
275
|
-
mutationID: 42,
|
|
276
|
-
upstreamSchema: "unused"
|
|
277
|
-
};
|
|
278
|
-
return {
|
|
279
|
-
handleMutationRequest,
|
|
280
|
-
handleQueryRequest,
|
|
281
|
-
transaction,
|
|
282
|
-
mutate,
|
|
283
|
-
query
|
|
284
|
-
};
|
|
285
71
|
}
|
|
286
|
-
function
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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"`;
|
|
72
|
+
async function persistAlreadyProcessedMutationResults(pool, param) {
|
|
73
|
+
var {
|
|
74
|
+
clientGroupID,
|
|
75
|
+
mutations,
|
|
76
|
+
upstreamSchema
|
|
77
|
+
} = param;
|
|
78
|
+
var table = `${quotePgIdentifier(upstreamSchema)}."mutations"`;
|
|
305
79
|
var values = mutations.map(function (_, index) {
|
|
306
80
|
var offset = index * 4;
|
|
307
81
|
return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
|
|
308
82
|
}).join(", ");
|
|
309
83
|
var params = mutations.flatMap(function (mutation) {
|
|
310
|
-
return [
|
|
84
|
+
return [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)];
|
|
311
85
|
});
|
|
312
86
|
await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
|
|
313
87
|
VALUES ${values}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createZeroServer_exports","__export","createZeroServer","module","exports","
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createZeroServer_exports","__export","createZeroServer","module","exports","import_pg","require","import_helpers","import_pg2","import_createZeroServerCore","param","database","pool","externalPool","options","dbString","assertString","pgPool","Pool","connectionString","ssl","includes","rejectUnauthorized","on","error","console","message","client","databaseProvider","zeroNodePg","schema","createZeroServerCore","createDatabase","persistAlreadyProcessed","args","persistAlreadyProcessedMutationResults","clientGroupID","mutations","upstreamSchema","table","quotePgIdentifier","values","map","_","index","offset","join","params","flatMap","mutation","id","clientID","JSON","stringify","result","query"],"sources":["../../src/createZeroServer.ts"],"sourcesContent":[null],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,GAAA,IAAAC,WAAA,CAAAC,SAAA;EAAAC,KAAA;AAAA,IAAAH,GAAA;AAAA,IAAAI,wBAAA;AAAAC,QAAA,CAAAD,wBAAA;EAAAE,gBAAA,EAAAA,CAAA,KAAAA;AAAA;AAAAC,MAAA,CAAAC,OAAA,GAA2BT,YAAA,CAAAK,wBAAA;AAC3B,IAAAK,SAAA,GAAAC,OAA6B;AAC7B,IAAAC,cAAqB,GAAAD,OAAA;AAErB,IAAAE,UAAA,GAAAF,OAAA;AAmBO,IAAAG,2BAIL,GAAAH,OAAA;AAAA,SACAJ,iBAAAQ,KAAA;EACA;IAAMC,QAAA;IAAAC,IAAA,EAAAC,YAAA;IAAA,GAAAC;EAAA,IAAAJ,KAAA;EACN,IAAGE,IAAA;EACL,IAW8CC,YAAA;IAC5CD,IAAI,GAAAC,YAAA;EACJ,OAAI;IACF,IAAAE,QAAO,OAAAR,cAAA,CAAAS,YAAA,EAAAL,QAAA;IACT,IAAAM,MAAO,OAAAT,UAAA,CAAAU,IAAA;MACLC,gBAAM,EAAAJ,QAAW;MACjBK,GAAA,EAAML,QAAS,CAAAM,QAAI,kBAAK;QACtBC,kBAAkB;MAClB,SAAK;IAGP,CAAC;IACDL,MAAA,CAAOM,EAAA,CAAG,SAAS,UAACC,KAAU;MAC5BC,OAAA,CAAQD,KAAA,CAAM,wBAAwBA,KAAA,CAAME,OAAO;IACrD,CAAC;IACDT,MAAA,CAAOM,EAAA,CAAG,WAAW,UAACI,MAAW;MAC/BA,MAAA,CAAOJ,EAAA,CAAG,SAAS,UAACC,KAAU;QAC5BC,OAAA,CAAQD,KAAA,CAAM,0BAA0BA,KAAA,CAAME,OAAO;MACvD,CAAC;IACH,CAAC;IACDd,IAAA,GAAOK,MAAA;EACT;EAEA,IAAAW,gBAAM,OAAAvB,SAAmB,CAAAwB,UAAA,EAAAf,OAAW,CAAAgB,MAAQ,EAAAlB,IAAQ;EAEpD,WAAOH,2BAAA,CAAAsB,oBAAA,EAAqB;IAC1B,GAAGjB,OAAA;IACHkB,cAAA,EAAgB,SAAAA,CAAA,EAAM;MACtB,OAAAJ,gBAAyB;IAC1B;IACHK,uBAAA,WAAAA,CAAAC,IAAA;MAEA,OAAAC,sCAAe,CAAAvB,IACb,EAAAsB,IACE;IAEF;EACA;AAEI;AACA,eAAOC,sCAAqCA,CAAAvB,IAAU,EAAAF,KAAM;EAC9D,IACC;IAAA0B,aAAS;IAAAC,SAAA;IAAAC;EAAA,IAAA5B,KAAA;EACZ,IAAA6B,KAAM,MAASC,iBAAU,CAAQF,cAAc;EAAA,IAC7CG,MAAA,GAAAJ,SAAA,CAAAK,GAAA,WAAAC,CAAA,EAAAC,KAAA;IACA,IAAAC,MAAS,GAAGD,KAAA;IACZ,YAAYC,MAAA,UAAAA,MAAA,UAAAA,MAAA,UAAAA,MAAA;EAAA,EACZ,CAAAC,IAAK;EACP,IAACC,MAAA,GAAAV,SAAA,CAAAW,OAAA,WAAAC,QAAA;IAED,OAAM,CACJb,aAAe,EAAKa,QACV,CAAAC,EAAA,CAAAC,QAAM,EAAAF,QAAA,CAAAC,EAAA,CAAAA,EAAA,EAEhBE,IAAA,CAAAC,SAAA,CAAAJ,QAAA,CAAAK,MAAA,EACF;EACF;EAEA,MAAA1C,IAAS,CAAA2C,KAAA,gBAAiChB,KAAA;AACxC,cAAWE,MAAM;AACnB,0EAAAM,MAAA","ignoreList":[]}
|