on-zero 0.7.2-1784530701923 → 0.7.2

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 (260) hide show
  1. package/dist/cjs/asyncTasks.cjs +51 -0
  2. package/dist/cjs/asyncTasks.native.js +84 -0
  3. package/dist/cjs/asyncTasks.native.js.map +1 -0
  4. package/dist/cjs/createZeroDirectServer.cjs +269 -0
  5. package/dist/cjs/createZeroDirectServer.native.js +287 -0
  6. package/dist/cjs/createZeroDirectServer.native.js.map +1 -0
  7. package/dist/cjs/createZeroSQLiteServer.cjs +50 -0
  8. package/dist/cjs/createZeroSQLiteServer.native.js +58 -0
  9. package/dist/cjs/createZeroSQLiteServer.native.js.map +1 -0
  10. package/dist/cjs/createZeroSQLiteServer.test.cjs +595 -0
  11. package/dist/cjs/createZeroSQLiteServer.test.native.js +647 -0
  12. package/dist/cjs/createZeroSQLiteServer.test.native.js.map +1 -0
  13. package/dist/cjs/createZeroServer.cjs +82 -0
  14. package/dist/cjs/createZeroServer.native.js +93 -0
  15. package/dist/cjs/createZeroServer.native.js.map +1 -0
  16. package/dist/cjs/createZeroServer.test.cjs +378 -0
  17. package/dist/cjs/createZeroServer.test.native.js +448 -0
  18. package/dist/cjs/createZeroServer.test.native.js.map +1 -0
  19. package/dist/cjs/createZeroServerCore.cjs +211 -0
  20. package/dist/cjs/createZeroServerCore.native.js +355 -0
  21. package/dist/cjs/createZeroServerCore.native.js.map +1 -0
  22. package/dist/cjs/helpers/createMutators.cjs +3 -4
  23. package/dist/cjs/helpers/createMutators.native.js +3 -6
  24. package/dist/cjs/helpers/createMutators.native.js.map +1 -1
  25. package/dist/cjs/httpPull/auth.test.cjs +197 -0
  26. package/dist/cjs/httpPull/auth.test.native.js +279 -0
  27. package/dist/cjs/httpPull/auth.test.native.js.map +1 -0
  28. package/dist/cjs/httpPull/churn.test.cjs +132 -0
  29. package/dist/cjs/httpPull/churn.test.native.js +155 -0
  30. package/dist/cjs/httpPull/churn.test.native.js.map +1 -0
  31. package/dist/cjs/httpPull/completeAck.test.cjs +69 -0
  32. package/dist/cjs/httpPull/completeAck.test.native.js +76 -0
  33. package/dist/cjs/httpPull/completeAck.test.native.js.map +1 -0
  34. package/dist/cjs/httpPull/fixtureServer.cjs +340 -0
  35. package/dist/cjs/httpPull/fixtureServer.native.js +534 -0
  36. package/dist/cjs/httpPull/fixtureServer.native.js.map +1 -0
  37. package/dist/cjs/httpPull/integration.test.cjs +53 -0
  38. package/dist/cjs/httpPull/integration.test.native.js +60 -0
  39. package/dist/cjs/httpPull/integration.test.native.js.map +1 -0
  40. package/dist/cjs/httpPull/rebase.test.cjs +360 -0
  41. package/dist/cjs/httpPull/rebase.test.native.js +420 -0
  42. package/dist/cjs/httpPull/rebase.test.native.js.map +1 -0
  43. package/dist/cjs/httpPull/relations.test.cjs +107 -0
  44. package/dist/cjs/httpPull/relations.test.native.js +119 -0
  45. package/dist/cjs/httpPull/relations.test.native.js.map +1 -0
  46. package/dist/cjs/httpPull/testHarness.cjs +100 -0
  47. package/dist/cjs/httpPull/testHarness.native.js +112 -0
  48. package/dist/cjs/httpPull/testHarness.native.js.map +1 -0
  49. package/dist/cjs/index.cjs +1 -0
  50. package/dist/cjs/index.native.js +1 -0
  51. package/dist/cjs/index.native.js.map +1 -1
  52. package/dist/cjs/run.cjs +1 -1
  53. package/dist/cjs/run.native.js +1 -1
  54. package/dist/cjs/server.cjs +22 -0
  55. package/dist/cjs/server.native.js +4 -0
  56. package/dist/cjs/server.native.js.map +1 -0
  57. package/dist/cjs/sqliteRuntime.cjs +318 -0
  58. package/dist/cjs/sqliteRuntime.native.js +438 -0
  59. package/dist/cjs/sqliteRuntime.native.js.map +1 -0
  60. package/dist/cjs/state.cjs +1 -1
  61. package/dist/cjs/state.native.js +1 -1
  62. package/dist/cjs/syncHost.cjs +179 -0
  63. package/dist/cjs/syncHost.native.js +388 -0
  64. package/dist/cjs/syncHost.native.js.map +1 -0
  65. package/dist/cjs/syncHost.test.cjs +240 -0
  66. package/dist/cjs/syncHost.test.native.js +290 -0
  67. package/dist/cjs/syncHost.test.native.js.map +1 -0
  68. package/dist/cjs/zeroRunner.cjs +1 -1
  69. package/dist/cjs/zeroRunner.native.js +1 -1
  70. package/dist/esm/asyncTasks.mjs +26 -0
  71. package/dist/esm/asyncTasks.mjs.map +1 -0
  72. package/dist/esm/asyncTasks.native.js +56 -0
  73. package/dist/esm/asyncTasks.native.js.map +1 -0
  74. package/dist/esm/createZeroDirectServer.mjs +241 -0
  75. package/dist/esm/createZeroDirectServer.mjs.map +1 -0
  76. package/dist/esm/createZeroDirectServer.native.js +256 -0
  77. package/dist/esm/createZeroDirectServer.native.js.map +1 -0
  78. package/dist/esm/createZeroSQLiteServer.mjs +24 -0
  79. package/dist/esm/createZeroSQLiteServer.mjs.map +1 -0
  80. package/dist/esm/createZeroSQLiteServer.native.js +29 -0
  81. package/dist/esm/createZeroSQLiteServer.native.js.map +1 -0
  82. package/dist/esm/createZeroSQLiteServer.test.mjs +596 -0
  83. package/dist/esm/createZeroSQLiteServer.test.mjs.map +1 -0
  84. package/dist/esm/createZeroSQLiteServer.test.native.js +645 -0
  85. package/dist/esm/createZeroSQLiteServer.test.native.js.map +1 -0
  86. package/dist/esm/createZeroServer.mjs +57 -0
  87. package/dist/esm/createZeroServer.mjs.map +1 -0
  88. package/dist/esm/createZeroServer.native.js +65 -0
  89. package/dist/esm/createZeroServer.native.js.map +1 -0
  90. package/dist/esm/createZeroServer.test.mjs +379 -0
  91. package/dist/esm/createZeroServer.test.mjs.map +1 -0
  92. package/dist/esm/createZeroServer.test.native.js +446 -0
  93. package/dist/esm/createZeroServer.test.native.js.map +1 -0
  94. package/dist/esm/createZeroServerCore.mjs +186 -0
  95. package/dist/esm/createZeroServerCore.mjs.map +1 -0
  96. package/dist/esm/createZeroServerCore.native.js +327 -0
  97. package/dist/esm/createZeroServerCore.native.js.map +1 -0
  98. package/dist/esm/helpers/createMutators.mjs +3 -4
  99. package/dist/esm/helpers/createMutators.mjs.map +1 -1
  100. package/dist/esm/helpers/createMutators.native.js +3 -6
  101. package/dist/esm/helpers/createMutators.native.js.map +1 -1
  102. package/dist/esm/httpPull/auth.test.mjs +198 -0
  103. package/dist/esm/httpPull/auth.test.mjs.map +1 -0
  104. package/dist/esm/httpPull/auth.test.native.js +277 -0
  105. package/dist/esm/httpPull/auth.test.native.js.map +1 -0
  106. package/dist/esm/httpPull/churn.test.mjs +133 -0
  107. package/dist/esm/httpPull/churn.test.mjs.map +1 -0
  108. package/dist/esm/httpPull/churn.test.native.js +153 -0
  109. package/dist/esm/httpPull/churn.test.native.js.map +1 -0
  110. package/dist/esm/httpPull/completeAck.test.mjs +70 -0
  111. package/dist/esm/httpPull/completeAck.test.mjs.map +1 -0
  112. package/dist/esm/httpPull/completeAck.test.native.js +74 -0
  113. package/dist/esm/httpPull/completeAck.test.native.js.map +1 -0
  114. package/dist/esm/httpPull/fixtureServer.mjs +315 -0
  115. package/dist/esm/httpPull/fixtureServer.mjs.map +1 -0
  116. package/dist/esm/httpPull/fixtureServer.native.js +506 -0
  117. package/dist/esm/httpPull/fixtureServer.native.js.map +1 -0
  118. package/dist/esm/httpPull/integration.test.mjs +54 -0
  119. package/dist/esm/httpPull/integration.test.mjs.map +1 -0
  120. package/dist/esm/httpPull/integration.test.native.js +58 -0
  121. package/dist/esm/httpPull/integration.test.native.js.map +1 -0
  122. package/dist/esm/httpPull/rebase.test.mjs +361 -0
  123. package/dist/esm/httpPull/rebase.test.mjs.map +1 -0
  124. package/dist/esm/httpPull/rebase.test.native.js +418 -0
  125. package/dist/esm/httpPull/rebase.test.native.js.map +1 -0
  126. package/dist/esm/httpPull/relations.test.mjs +108 -0
  127. package/dist/esm/httpPull/relations.test.mjs.map +1 -0
  128. package/dist/esm/httpPull/relations.test.native.js +117 -0
  129. package/dist/esm/httpPull/relations.test.native.js.map +1 -0
  130. package/dist/esm/httpPull/testHarness.mjs +72 -0
  131. package/dist/esm/httpPull/testHarness.mjs.map +1 -0
  132. package/dist/esm/httpPull/testHarness.native.js +81 -0
  133. package/dist/esm/httpPull/testHarness.native.js.map +1 -0
  134. package/dist/esm/index.js +1 -0
  135. package/dist/esm/index.js.map +1 -1
  136. package/dist/esm/index.mjs +1 -0
  137. package/dist/esm/index.mjs.map +1 -1
  138. package/dist/esm/index.native.js +1 -0
  139. package/dist/esm/index.native.js.map +1 -1
  140. package/dist/esm/run.mjs +1 -1
  141. package/dist/esm/run.mjs.map +1 -1
  142. package/dist/esm/run.native.js +1 -1
  143. package/dist/esm/server.mjs +4 -0
  144. package/dist/esm/server.mjs.map +1 -0
  145. package/dist/esm/server.native.js +2 -0
  146. package/dist/esm/server.native.js.map +1 -0
  147. package/dist/esm/sqliteRuntime.mjs +289 -0
  148. package/dist/esm/sqliteRuntime.mjs.map +1 -0
  149. package/dist/esm/sqliteRuntime.native.js +406 -0
  150. package/dist/esm/sqliteRuntime.native.js.map +1 -0
  151. package/dist/esm/state.mjs +1 -1
  152. package/dist/esm/state.native.js +1 -1
  153. package/dist/esm/syncHost.mjs +153 -0
  154. package/dist/esm/syncHost.mjs.map +1 -0
  155. package/dist/esm/syncHost.native.js +359 -0
  156. package/dist/esm/syncHost.native.js.map +1 -0
  157. package/dist/esm/syncHost.test.mjs +217 -0
  158. package/dist/esm/syncHost.test.mjs.map +1 -0
  159. package/dist/esm/syncHost.test.native.js +264 -0
  160. package/dist/esm/syncHost.test.native.js.map +1 -0
  161. package/dist/esm/zeroRunner.mjs +1 -1
  162. package/dist/esm/zeroRunner.mjs.map +1 -1
  163. package/dist/esm/zeroRunner.native.js +1 -1
  164. package/package.json +23 -8
  165. package/readme.md +65 -40
  166. package/src/asyncTasks.ts +36 -0
  167. package/src/createZeroClient.tsx +1 -1
  168. package/src/createZeroDirectServer.ts +411 -0
  169. package/src/createZeroSQLiteServer.test.ts +614 -0
  170. package/src/createZeroSQLiteServer.ts +56 -0
  171. package/src/createZeroServer.test.ts +421 -0
  172. package/src/createZeroServer.ts +105 -0
  173. package/src/createZeroServerCore.ts +296 -0
  174. package/src/helpers/createMutators.ts +2 -6
  175. package/src/httpPull/auth.test.ts +208 -0
  176. package/src/httpPull/churn.test.ts +147 -0
  177. package/src/httpPull/completeAck.test.ts +80 -0
  178. package/src/httpPull/fixtureServer.ts +391 -0
  179. package/src/httpPull/integration.test.ts +57 -0
  180. package/src/httpPull/rebase.test.ts +368 -0
  181. package/src/httpPull/relations.test.ts +135 -0
  182. package/src/httpPull/testHarness.ts +95 -0
  183. package/src/index.ts +1 -0
  184. package/src/run.ts +1 -1
  185. package/src/server.native.ts +3 -0
  186. package/src/server.ts +4 -0
  187. package/src/sqliteRuntime.ts +512 -0
  188. package/src/state.ts +1 -1
  189. package/src/syncHost.test.ts +223 -0
  190. package/src/syncHost.ts +294 -0
  191. package/src/types.ts +5 -0
  192. package/src/zeroRunner.ts +1 -1
  193. package/test-fixtures/server-return-types.ts +58 -21
  194. package/types/asyncTasks.d.ts +11 -0
  195. package/types/asyncTasks.d.ts.map +1 -0
  196. package/types/createZeroDirectServer.d.ts +80 -0
  197. package/types/createZeroDirectServer.d.ts.map +1 -0
  198. package/types/createZeroSQLiteServer.d.ts +12 -0
  199. package/types/createZeroSQLiteServer.d.ts.map +1 -0
  200. package/types/createZeroSQLiteServer.test.d.ts +2 -0
  201. package/types/createZeroSQLiteServer.test.d.ts.map +1 -0
  202. package/types/createZeroServer.d.ts +18 -0
  203. package/types/createZeroServer.d.ts.map +1 -0
  204. package/types/createZeroServer.test.d.ts +2 -0
  205. package/types/createZeroServer.test.d.ts.map +1 -0
  206. package/types/createZeroServerCore.d.ts +256 -0
  207. package/types/createZeroServerCore.d.ts.map +1 -0
  208. package/types/helpers/createMutators.d.ts +1 -2
  209. package/types/helpers/createMutators.d.ts.map +1 -1
  210. package/types/httpPull/auth.test.d.ts +2 -0
  211. package/types/httpPull/auth.test.d.ts.map +1 -0
  212. package/types/httpPull/churn.test.d.ts +2 -0
  213. package/types/httpPull/churn.test.d.ts.map +1 -0
  214. package/types/httpPull/completeAck.test.d.ts +2 -0
  215. package/types/httpPull/completeAck.test.d.ts.map +1 -0
  216. package/types/httpPull/fixtureSchema.d.ts +1 -1
  217. package/types/httpPull/fixtureServer.d.ts +14 -0
  218. package/types/httpPull/fixtureServer.d.ts.map +1 -0
  219. package/types/httpPull/integration.test.d.ts +2 -0
  220. package/types/httpPull/integration.test.d.ts.map +1 -0
  221. package/types/httpPull/rebase.test.d.ts +2 -0
  222. package/types/httpPull/rebase.test.d.ts.map +1 -0
  223. package/types/httpPull/relations.test.d.ts +2 -0
  224. package/types/httpPull/relations.test.d.ts.map +1 -0
  225. package/types/httpPull/testHarness.d.ts +32 -0
  226. package/types/httpPull/testHarness.d.ts.map +1 -0
  227. package/types/index.d.ts +1 -0
  228. package/types/index.d.ts.map +1 -1
  229. package/types/server.d.ts +5 -0
  230. package/types/server.d.ts.map +1 -0
  231. package/types/server.native.d.ts +1 -0
  232. package/types/server.native.d.ts.map +1 -0
  233. package/types/sqliteRuntime.d.ts +71 -0
  234. package/types/sqliteRuntime.d.ts.map +1 -0
  235. package/types/syncHost.d.ts +42 -0
  236. package/types/syncHost.d.ts.map +1 -0
  237. package/types/syncHost.test.d.ts +2 -0
  238. package/types/syncHost.test.d.ts.map +1 -0
  239. package/types/types.d.ts +4 -0
  240. package/types/types.d.ts.map +1 -1
  241. package/dist/cjs/orez.cjs +0 -227
  242. package/dist/cjs/orez.native.js +0 -314
  243. package/dist/cjs/orez.native.js.map +0 -1
  244. package/dist/cjs/orez.test.cjs +0 -211
  245. package/dist/cjs/orez.test.native.js +0 -226
  246. package/dist/cjs/orez.test.native.js.map +0 -1
  247. package/dist/esm/orez.mjs +0 -202
  248. package/dist/esm/orez.mjs.map +0 -1
  249. package/dist/esm/orez.native.js +0 -286
  250. package/dist/esm/orez.native.js.map +0 -1
  251. package/dist/esm/orez.test.mjs +0 -188
  252. package/dist/esm/orez.test.mjs.map +0 -1
  253. package/dist/esm/orez.test.native.js +0 -200
  254. package/dist/esm/orez.test.native.js.map +0 -1
  255. package/src/orez.test.ts +0 -195
  256. package/src/orez.ts +0 -331
  257. package/types/orez.d.ts +0 -53
  258. package/types/orez.d.ts.map +0 -1
  259. package/types/orez.test.d.ts +0 -2
  260. package/types/orez.test.d.ts.map +0 -1
@@ -0,0 +1,82 @@
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 createZeroServer_exports = {};
24
+ __export(createZeroServer_exports, {
25
+ createZeroServer: () => createZeroServer
26
+ });
27
+ module.exports = __toCommonJS(createZeroServer_exports);
28
+ var import_pg = require("@rocicorp/zero/server/adapters/pg");
29
+ var import_helpers = require("@take-out/helpers");
30
+ var import_pg2 = require("pg");
31
+ var import_createZeroServerCore = require("./createZeroServerCore.cjs");
32
+ function createZeroServer({
33
+ database,
34
+ pool: externalPool,
35
+ ...options
36
+ }) {
37
+ let pool;
38
+ if (externalPool) {
39
+ pool = externalPool;
40
+ } else {
41
+ const dbString = (0, import_helpers.assertString)(database, 'createZeroServer "database"');
42
+ const pgPool = new import_pg2.Pool({
43
+ connectionString: dbString,
44
+ ssl: dbString.includes("sslmode=require") ? {
45
+ rejectUnauthorized: false
46
+ } : void 0
47
+ });
48
+ pgPool.on("error", error => {
49
+ console.error("[on-zero] pool error", error.message);
50
+ });
51
+ pgPool.on("connect", client => {
52
+ client.on("error", error => {
53
+ console.error("[on-zero] client error", error.message);
54
+ });
55
+ });
56
+ pool = pgPool;
57
+ }
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)
63
+ });
64
+ }
65
+ async function persistAlreadyProcessedMutationResults(pool, {
66
+ clientGroupID,
67
+ mutations,
68
+ upstreamSchema
69
+ }) {
70
+ const table = `${quotePgIdentifier(upstreamSchema)}."mutations"`;
71
+ const values = mutations.map((_, index) => {
72
+ const offset = index * 4;
73
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
74
+ }).join(", ");
75
+ const params = mutations.flatMap(mutation => [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)]);
76
+ await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
77
+ VALUES ${values}
78
+ ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
79
+ }
80
+ function quotePgIdentifier(value) {
81
+ return `"${value.replaceAll('"', '""')}"`;
82
+ }
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ };
13
+ var __copyProps = (to, from, except, desc) => {
14
+ if (from && typeof from === "object" || typeof from === "function") {
15
+ for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
16
+ get: () => from[key],
17
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
18
+ });
19
+ }
20
+ return to;
21
+ };
22
+ var __toCommonJS = mod => __copyProps(__defProp({}, "__esModule", {
23
+ value: true
24
+ }), mod);
25
+ var createZeroServer_exports = {};
26
+ __export(createZeroServer_exports, {
27
+ createZeroServer: () => createZeroServer
28
+ });
29
+ module.exports = __toCommonJS(createZeroServer_exports);
30
+ var import_pg = require("@rocicorp/zero/server/adapters/pg");
31
+ var import_helpers = require("@take-out/helpers");
32
+ var import_pg2 = require("pg");
33
+ var import_createZeroServerCore = require("./createZeroServerCore.native.js");
34
+ function createZeroServer(param) {
35
+ var {
36
+ database,
37
+ pool: externalPool,
38
+ ...options
39
+ } = param;
40
+ var pool;
41
+ if (externalPool) {
42
+ pool = externalPool;
43
+ } else {
44
+ var dbString = (0, import_helpers.assertString)(database, 'createZeroServer "database"');
45
+ var pgPool = new import_pg2.Pool({
46
+ connectionString: dbString,
47
+ ssl: dbString.includes("sslmode=require") ? {
48
+ rejectUnauthorized: false
49
+ } : void 0
50
+ });
51
+ pgPool.on("error", function (error) {
52
+ console.error("[on-zero] pool error", error.message);
53
+ });
54
+ pgPool.on("connect", function (client) {
55
+ client.on("error", function (error) {
56
+ console.error("[on-zero] client error", error.message);
57
+ });
58
+ });
59
+ pool = pgPool;
60
+ }
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);
69
+ }
70
+ });
71
+ }
72
+ async function persistAlreadyProcessedMutationResults(pool, param) {
73
+ var {
74
+ clientGroupID,
75
+ mutations,
76
+ upstreamSchema
77
+ } = param;
78
+ var table = `${quotePgIdentifier(upstreamSchema)}."mutations"`;
79
+ var values = mutations.map(function (_, index) {
80
+ var offset = index * 4;
81
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
82
+ }).join(", ");
83
+ var params = mutations.flatMap(function (mutation) {
84
+ return [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)];
85
+ });
86
+ await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
87
+ VALUES ${values}
88
+ ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
89
+ }
90
+ function quotePgIdentifier(value) {
91
+ return `"${value.replaceAll('"', '""')}"`;
92
+ }
93
+ //# sourceMappingURL=createZeroServer.native.js.map
@@ -0,0 +1 @@
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;AAqBO,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":[]}
@@ -0,0 +1,378 @@
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"') || 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)("discards async tasks from a rolled-back PostgreSQL mutation", async () => {
93
+ const pg = new FakePgClient();
94
+ let effectRuns = 0;
95
+ const consoleWarn = import_vitest.vi.spyOn(console, "warn").mockImplementation(() => {});
96
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
97
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
98
+ models: {
99
+ project: {
100
+ mutate: {
101
+ touch: async ({
102
+ server
103
+ }) => {
104
+ server?.enqueueTask(async () => {
105
+ effectRuns++;
106
+ });
107
+ throw new Error("rejected");
108
+ }
109
+ }
110
+ }
111
+ },
112
+ createServerActions: () => ({}),
113
+ pool: pg
114
+ });
115
+ const result = await zeroServer.handleMutationRequest({
116
+ authData: null,
117
+ request: pushRequest(1),
118
+ skipAsyncTasks: true
119
+ });
120
+ (0, import_vitest.expect)(result.response.mutations[0].result).toMatchObject({
121
+ error: "app",
122
+ message: "rejected"
123
+ });
124
+ (0, import_vitest.expect)(result.asyncTasks).toEqual([]);
125
+ (0, import_vitest.expect)(effectRuns).toBe(0);
126
+ (0, import_vitest.expect)(consoleWarn).toHaveBeenCalledWith("PushProcessor", import_vitest.expect.stringContaining("Error processing mutation"), import_vitest.expect.stringContaining("rejected"));
127
+ consoleWarn.mockRestore();
128
+ });
129
+ (0, import_vitest.test)("awaits barrier tasks before resolving the push response", async () => {
130
+ const pg = new FakePgClient();
131
+ let releaseBarrier;
132
+ let markBarrierStarted;
133
+ const barrierStarted = new Promise(resolve => {
134
+ markBarrierStarted = resolve;
135
+ });
136
+ const barrier = new Promise(resolve => {
137
+ releaseBarrier = resolve;
138
+ });
139
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
140
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
141
+ models: {
142
+ project: {
143
+ mutate: {
144
+ touch: async ({
145
+ server
146
+ }) => {
147
+ server?.enqueueTask(async () => {
148
+ markBarrierStarted();
149
+ await barrier;
150
+ }, {
151
+ barrier: true
152
+ });
153
+ }
154
+ }
155
+ }
156
+ },
157
+ createServerActions: () => ({}),
158
+ pool: pg
159
+ });
160
+ let responseResolved = false;
161
+ const resultPromise = zeroServer.handleMutationRequest({
162
+ authData: null,
163
+ request: pushRequest(1)
164
+ }).then(result2 => {
165
+ responseResolved = true;
166
+ return result2;
167
+ });
168
+ await barrierStarted;
169
+ await Promise.resolve();
170
+ (0, import_vitest.expect)(responseResolved).toBe(false);
171
+ releaseBarrier();
172
+ const result = await resultPromise;
173
+ (0, import_vitest.expect)(result.response.mutations[0].result).toEqual({});
174
+ });
175
+ (0, import_vitest.test)("does not fail the push when a background task rejects", async () => {
176
+ const pg = new FakePgClient();
177
+ const error = new Error("background failed");
178
+ const consoleError = import_vitest.vi.spyOn(console, "error").mockImplementation(() => {});
179
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
180
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
181
+ models: {
182
+ project: {
183
+ mutate: {
184
+ touch: async ({
185
+ server
186
+ }) => {
187
+ server?.enqueueTask(async () => {
188
+ throw error;
189
+ });
190
+ }
191
+ }
192
+ }
193
+ },
194
+ createServerActions: () => ({}),
195
+ pool: pg
196
+ });
197
+ const result = await zeroServer.handleMutationRequest({
198
+ authData: null,
199
+ request: pushRequest(1)
200
+ });
201
+ (0, import_vitest.expect)(result.response.mutations[0].result).toEqual({});
202
+ await import_vitest.vi.waitFor(() => {
203
+ (0, import_vitest.expect)(consoleError).toHaveBeenCalledWith("[on-zero] async task failed", error);
204
+ });
205
+ consoleError.mockRestore();
206
+ });
207
+ (0, import_vitest.test)("registers a promise that settles every background task with the request scheduler", async () => {
208
+ const pg = new FakePgClient();
209
+ const error = new Error("background failed");
210
+ const consoleError = import_vitest.vi.spyOn(console, "error").mockImplementation(() => {});
211
+ let releaseSibling;
212
+ const siblingGate = new Promise(resolve => {
213
+ releaseSibling = resolve;
214
+ });
215
+ let siblingFinished = false;
216
+ let scheduled;
217
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
218
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
219
+ models: {
220
+ project: {
221
+ mutate: {
222
+ touch: async ({
223
+ server
224
+ }) => {
225
+ server?.enqueueTask(async () => {
226
+ throw error;
227
+ });
228
+ server?.enqueueTask(async () => {
229
+ await siblingGate;
230
+ siblingFinished = true;
231
+ });
232
+ }
233
+ }
234
+ }
235
+ },
236
+ createServerActions: () => ({}),
237
+ pool: pg
238
+ });
239
+ const result = await zeroServer.handleMutationRequest({
240
+ authData: null,
241
+ request: pushRequest(1),
242
+ scheduleBackgroundTask: promise => {
243
+ scheduled = promise;
244
+ }
245
+ });
246
+ (0, import_vitest.expect)(result.response.mutations[0].result).toEqual({});
247
+ (0, import_vitest.expect)(scheduled).toBeInstanceOf(Promise);
248
+ (0, import_vitest.expect)(siblingFinished).toBe(false);
249
+ let scheduledSettled = false;
250
+ void scheduled.then(() => {
251
+ scheduledSettled = true;
252
+ });
253
+ await Promise.resolve();
254
+ (0, import_vitest.expect)(scheduledSettled).toBe(false);
255
+ releaseSibling();
256
+ await scheduled;
257
+ (0, import_vitest.expect)(siblingFinished).toBe(true);
258
+ (0, import_vitest.expect)(consoleError).toHaveBeenCalledWith("[on-zero] async task failed", error);
259
+ consoleError.mockRestore();
260
+ });
261
+ (0, import_vitest.test)("awaits background tasks when the request has no scheduler", async () => {
262
+ const pg = new FakePgClient();
263
+ let markTaskStarted;
264
+ const taskStarted = new Promise(resolve => {
265
+ markTaskStarted = resolve;
266
+ });
267
+ let releaseTask;
268
+ const taskGate = new Promise(resolve => {
269
+ releaseTask = resolve;
270
+ });
271
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
272
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
273
+ models: {
274
+ project: {
275
+ mutate: {
276
+ touch: async ({
277
+ server
278
+ }) => {
279
+ server?.enqueueTask(async () => {
280
+ markTaskStarted();
281
+ await taskGate;
282
+ });
283
+ }
284
+ }
285
+ }
286
+ },
287
+ createServerActions: () => ({}),
288
+ pool: pg
289
+ });
290
+ let responseResolved = false;
291
+ const resultPromise = zeroServer.handleMutationRequest({
292
+ authData: null,
293
+ request: pushRequest(1)
294
+ }).then(result2 => {
295
+ responseResolved = true;
296
+ return result2;
297
+ });
298
+ await taskStarted;
299
+ await Promise.resolve();
300
+ (0, import_vitest.expect)(responseResolved).toBe(false);
301
+ releaseTask();
302
+ const result = await resultPromise;
303
+ (0, import_vitest.expect)(result.response.mutations[0].result).toEqual({});
304
+ });
305
+ (0, import_vitest.test)("persists alreadyProcessed duplicate results for zero-cache recovery rows", async () => {
306
+ const pg = new FakePgClient();
307
+ const consoleWarn = import_vitest.vi.spyOn(console, "warn").mockImplementation(() => {});
308
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
309
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
310
+ models: {
311
+ project: {
312
+ mutate: {
313
+ touch: async () => {}
314
+ }
315
+ }
316
+ },
317
+ createServerActions: () => ({}),
318
+ pool: pg
319
+ });
320
+ const first = await zeroServer.handleMutationRequest({
321
+ authData: null,
322
+ request: pushRequest(1)
323
+ });
324
+ (0, import_vitest.expect)(first.response.mutations[0].result).toEqual({});
325
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(1);
326
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([]);
327
+ const duplicate = await zeroServer.handleMutationRequest({
328
+ authData: null,
329
+ request: pushRequest(1)
330
+ });
331
+ const duplicateResult = duplicate.response.mutations[0].result;
332
+ (0, import_vitest.expect)(duplicateResult.error).toBe("alreadyProcessed");
333
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(1);
334
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
335
+ error: "alreadyProcessed",
336
+ details: duplicateResult.details
337
+ })]]);
338
+ (0, import_vitest.expect)(consoleWarn).not.toHaveBeenCalled();
339
+ consoleWarn.mockRestore();
340
+ });
341
+ (0, import_vitest.test)("persists only alreadyProcessed results in a mixed recovery push", async () => {
342
+ const pg = new FakePgClient();
343
+ const zeroServer = (0, import_createZeroServer.createZeroServer)({
344
+ schema: import_fixtureSchema.zeroHttpFixtureSchema,
345
+ models: {
346
+ project: {
347
+ mutate: {
348
+ touch: async () => {}
349
+ }
350
+ }
351
+ },
352
+ createServerActions: () => ({}),
353
+ pool: pg
354
+ });
355
+ await zeroServer.handleMutationRequest({
356
+ authData: null,
357
+ request: pushRequest(1)
358
+ });
359
+ const mixed = await zeroServer.handleMutationRequest({
360
+ authData: null,
361
+ request: pushRequest([1, 2])
362
+ });
363
+ const results = mixed.response.mutations.map(mutation => ({
364
+ id: mutation.id.id,
365
+ result: mutation.result
366
+ }));
367
+ (0, import_vitest.expect)(results[0].result.error).toBe("alreadyProcessed");
368
+ (0, import_vitest.expect)(results[1]).toEqual({
369
+ id: 2,
370
+ result: {}
371
+ });
372
+ (0, import_vitest.expect)(pg.lastMutationID).toBe(2);
373
+ (0, import_vitest.expect)(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
374
+ error: "alreadyProcessed",
375
+ details: results[0].result.details
376
+ })]]);
377
+ });
378
+ });