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,57 @@
1
+ import { zeroNodePg } from "@rocicorp/zero/server/adapters/pg";
2
+ import { assertString } from "@take-out/helpers";
3
+ import { Pool } from "pg";
4
+ import { createZeroServerCore } from "./createZeroServerCore.mjs";
5
+ function createZeroServer({
6
+ database,
7
+ pool: externalPool,
8
+ ...options
9
+ }) {
10
+ let pool;
11
+ if (externalPool) {
12
+ pool = externalPool;
13
+ } else {
14
+ const dbString = assertString(database, 'createZeroServer "database"');
15
+ const pgPool = new Pool({
16
+ connectionString: dbString,
17
+ ssl: dbString.includes("sslmode=require") ? {
18
+ rejectUnauthorized: false
19
+ } : void 0
20
+ });
21
+ pgPool.on("error", error => {
22
+ console.error("[on-zero] pool error", error.message);
23
+ });
24
+ pgPool.on("connect", client => {
25
+ client.on("error", error => {
26
+ console.error("[on-zero] client error", error.message);
27
+ });
28
+ });
29
+ pool = pgPool;
30
+ }
31
+ const databaseProvider = zeroNodePg(options.schema, pool);
32
+ return createZeroServerCore({
33
+ ...options,
34
+ createDatabase: () => databaseProvider,
35
+ persistAlreadyProcessed: args => persistAlreadyProcessedMutationResults(pool, args)
36
+ });
37
+ }
38
+ async function persistAlreadyProcessedMutationResults(pool, {
39
+ clientGroupID,
40
+ mutations,
41
+ upstreamSchema
42
+ }) {
43
+ const table = `${quotePgIdentifier(upstreamSchema)}."mutations"`;
44
+ const values = mutations.map((_, index) => {
45
+ const offset = index * 4;
46
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
47
+ }).join(", ");
48
+ const params = mutations.flatMap(mutation => [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)]);
49
+ await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
50
+ VALUES ${values}
51
+ ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
52
+ }
53
+ function quotePgIdentifier(value) {
54
+ return `"${value.replaceAll('"', '""')}"`;
55
+ }
56
+ export { createZeroServer };
57
+ //# sourceMappingURL=createZeroServer.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["zeroNodePg","assertString","Pool","createZeroServerCore","createZeroServer","database","pool","externalPool","options","dbString","pgPool","connectionString","ssl","includes","rejectUnauthorized","on","error","console","message","client","databaseProvider","schema","createDatabase","persistAlreadyProcessed","args","persistAlreadyProcessedMutationResults","clientGroupID","mutations","upstreamSchema","table","quotePgIdentifier","values","map","_","index","offset","join","params","flatMap","mutation","id","clientID","JSON","stringify","result","query","value","replaceAll"],"sources":["../../src/createZeroServer.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,QAAkB;AAC3B,SAASC,YAAA,QAAoB;AAC7B,SAASC,IAAA,QAAY;AAErB,SAASC,oBAAA,QAA4B;AAqB9B,SAASC,iBAId;EACAC,QAAA;EACAC,IAAA,EAAMC,YAAA;EACN,GAAGC;AACL,GAW8C;EAC5C,IAAIF,IAAA;EACJ,IAAIC,YAAA,EAAc;IAChBD,IAAA,GAAOC,YAAA;EACT,OAAO;IACL,MAAME,QAAA,GAAWR,YAAA,CAAaI,QAAA,EAAU,6BAA6B;IACrE,MAAMK,MAAA,GAAS,IAAIR,IAAA,CAAK;MACtBS,gBAAA,EAAkBF,QAAA;MAClBG,GAAA,EAAKH,QAAA,CAASI,QAAA,CAAS,iBAAiB,IACpC;QAAEC,kBAAA,EAAoB;MAAM,IAC5B;IACN,CAAC;IACDJ,MAAA,CAAOK,EAAA,CAAG,SAAUC,KAAA,IAAU;MAC5BC,OAAA,CAAQD,KAAA,CAAM,wBAAwBA,KAAA,CAAME,OAAO;IACrD,CAAC;IACDR,MAAA,CAAOK,EAAA,CAAG,WAAYI,MAAA,IAAW;MAC/BA,MAAA,CAAOJ,EAAA,CAAG,SAAUC,KAAA,IAAU;QAC5BC,OAAA,CAAQD,KAAA,CAAM,0BAA0BA,KAAA,CAAME,OAAO;MACvD,CAAC;IACH,CAAC;IACDZ,IAAA,GAAOI,MAAA;EACT;EAEA,MAAMU,gBAAA,GAAmBpB,UAAA,CAAWQ,OAAA,CAAQa,MAAA,EAAQf,IAAI;EAExD,OAAOH,oBAAA,CAAqB;IAC1B,GAAGK,OAAA;IACHc,cAAA,EAAgBA,CAAA,KAAMF,gBAAA;IACtBG,uBAAA,EAA0BC,IAAA,IAASC,sCAAA,CAAuCnB,IAAA,EAAMkB,IAAI;EACtF,CAAC;AACH;AAEA,eAAeC,uCACbnB,IAAA,EACA;EAAEoB,aAAA;EAAeC,SAAA;EAAWC;AAAe,GAC3C;EACA,MAAMC,KAAA,GAAQ,GAAGC,iBAAA,CAAkBF,cAAc,CAAC;EAClD,MAAMG,MAAA,GAASJ,SAAA,CACZK,GAAA,CAAI,CAACC,CAAA,EAAGC,KAAA,KAAU;IACjB,MAAMC,MAAA,GAASD,KAAA,GAAQ;IACvB,OAAO,KAAKC,MAAA,GAAS,CAAC,MAAMA,MAAA,GAAS,CAAC,MAAMA,MAAA,GAAS,CAAC,MAAMA,MAAA,GAAS,CAAC;EACxE,CAAC,EACAC,IAAA,CAAK,IAAI;EACZ,MAAMC,MAAA,GAASV,SAAA,CAAUW,OAAA,CAASC,QAAA,IAAa,CAC7Cb,aAAA,EACAa,QAAA,CAASC,EAAA,CAAGC,QAAA,EACZF,QAAA,CAASC,EAAA,CAAGA,EAAA,EACZE,IAAA,CAAKC,SAAA,CAAUJ,QAAA,CAASK,MAAM,EAC/B;EAED,MAAMtC,IAAA,CAAKuC,KAAA,CACT,eAAehB,KAAK;AAAA,cACVE,MAAM;AAAA,0EAEhBM,MACF;AACF;AAEA,SAASP,kBAAkBgB,KAAA,EAAe;EACxC,OAAO,IAAIA,KAAA,CAAMC,UAAA,CAAW,KAAK,IAAI,CAAC;AACxC","ignoreList":[]}
@@ -0,0 +1,65 @@
1
+ import { zeroNodePg } from "@rocicorp/zero/server/adapters/pg";
2
+ import { assertString } from "@take-out/helpers";
3
+ import { Pool } from "pg";
4
+ import { createZeroServerCore } from "./createZeroServerCore.native.js";
5
+ function createZeroServer(param) {
6
+ var {
7
+ database,
8
+ pool: externalPool,
9
+ ...options
10
+ } = param;
11
+ var pool;
12
+ if (externalPool) {
13
+ pool = externalPool;
14
+ } else {
15
+ var dbString = assertString(database, 'createZeroServer "database"');
16
+ var pgPool = new Pool({
17
+ connectionString: dbString,
18
+ ssl: dbString.includes("sslmode=require") ? {
19
+ rejectUnauthorized: false
20
+ } : void 0
21
+ });
22
+ pgPool.on("error", function (error) {
23
+ console.error("[on-zero] pool error", error.message);
24
+ });
25
+ pgPool.on("connect", function (client) {
26
+ client.on("error", function (error) {
27
+ console.error("[on-zero] client error", error.message);
28
+ });
29
+ });
30
+ pool = pgPool;
31
+ }
32
+ var databaseProvider = zeroNodePg(options.schema, pool);
33
+ return createZeroServerCore({
34
+ ...options,
35
+ createDatabase: function () {
36
+ return databaseProvider;
37
+ },
38
+ persistAlreadyProcessed: function (args) {
39
+ return persistAlreadyProcessedMutationResults(pool, args);
40
+ }
41
+ });
42
+ }
43
+ async function persistAlreadyProcessedMutationResults(pool, param) {
44
+ var {
45
+ clientGroupID,
46
+ mutations,
47
+ upstreamSchema
48
+ } = param;
49
+ var table = `${quotePgIdentifier(upstreamSchema)}."mutations"`;
50
+ var values = mutations.map(function (_, index) {
51
+ var offset = index * 4;
52
+ return `($${offset + 1}, $${offset + 2}, $${offset + 3}, $${offset + 4}::json)`;
53
+ }).join(", ");
54
+ var params = mutations.flatMap(function (mutation) {
55
+ return [clientGroupID, mutation.id.clientID, mutation.id.id, JSON.stringify(mutation.result)];
56
+ });
57
+ await pool.query(`INSERT INTO ${table} ("clientGroupID", "clientID", "mutationID", "result")
58
+ VALUES ${values}
59
+ ON CONFLICT ("clientGroupID", "clientID", "mutationID") DO NOTHING`, params);
60
+ }
61
+ function quotePgIdentifier(value) {
62
+ return `"${value.replaceAll('"', '""')}"`;
63
+ }
64
+ export { createZeroServer };
65
+ //# sourceMappingURL=createZeroServer.native.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["zeroNodePg","assertString","Pool","createZeroServerCore","createZeroServer","param","database","pool","externalPool","options","dbString","pgPool","connectionString","ssl","includes","rejectUnauthorized","on","error","console","message","client","databaseProvider","schema","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,SAASA,UAAA,QAAkB;AAC3B,SAASC,YAAA,QAAoB;AAC7B,SAASC,IAAA,QAAY;AAErB,SAASC,oBAAA,QAA4B;AAqB9B,SAASC,iBAIdC,KAAA;EACA;IAAAC,QAAA;IAAAC,IAAA,EAAAC,YAAA;IAAA,GAAAC;EAAA,IAAAJ,KAAA;EACA,IAAAE,IAAM;EACN,IAAGC,YAAA;IAYyCD,IAAA,GAAAC,YAAA;EAC5C,OAAI;IACJ,IAAIE,QAAA,GAAAT,YAAc,CAAAK,QAAA;IAChB,IAAAK,MAAO,OAAAT,IAAA;MACTU,gBAAO,EAAAF,QAAA;MACLG,GAAA,EAAMH,QAAA,CAAAI,QAAW,kBAAuB;QACxCC,kBAAmB,EAAK;MACtB;IAAkB,EAClB;IAGFJ,MAAC,CAAAK,EAAA,oBAAAC,KAAA;MACDC,OAAO,CAAGD,KAAA,uBAAoB,EAAAA,KAAA,CAAAE,OAAA;IAC5B;IACFR,MAAC,CAAAK,EAAA,sBAAAI,MAAA;MACDA,MAAO,CAAAJ,EAAG,UAAW,UAACC,KAAW;QAC/BC,OAAO,CAAGD,KAAA,yBAAoB,EAAAA,KAAA,CAAAE,OAAA;MAC5B;IAAqD,EACvD;IACFZ,IAAC,GAAAI,MAAA;EACD;EACF,IAAAU,gBAAA,GAAArB,UAAA,CAAAS,OAAA,CAAAa,MAAA,EAAAf,IAAA;EAEA,OAAMJ,oBAAmB;IAEzB,GAAAM,OAAO;IACLc,cAAG,WAAAA,CAAA;MACH,OAAAF,gBAAsB;IACtB;IACDG,uBAAA,WAAAA,CAAAC,IAAA;MACH,OAAAC,sCAAA,CAAAnB,IAAA,EAAAkB,IAAA;IAEA;EAIE;AACA;AAEI,eAAMC,sCAAiBA,CAAAnB,IAAA,EAAAF,KAAA;EACvB;IAAAsB,aAAY;IAAAC,SAAgB;IAAAC;EAAgB,IAAAxB,KAAU;EACxD,IACCyB,KAAK,GAAI,GAAAC,iBAAA,CAAAF,cAAA;EACZ,IAAAG,MAAM,GAAAJ,SAAS,CAAAK,GAAU,WAASC,CAAA,EAAAC,KAAA;IAChC,IAAAC,MAAA,GAAAD,KAAA;IACA,YAAYC,MAAA,UAAAA,MAAA,UAAAA,MAAA,UAAAA,MAAA;EAAA,EACZ,CAAAC,IAAA,KAAS;EAAG,IACZC,MAAK,GAAAV,SAAU,CAAAW,OAAS,WAAMC,QAAA;IAC/B,QAEDb,aAAW,EACTa,QAAA,CAAAC,EAAA,CAAAC,QAAoB,EAAAF,QACV,CAAAC,EAAA,CAAAA,EAAM,EAAAE,IAAA,CAAAC,SAAA,CAAAJ,QAAA,CAAAK,MAAA,EAEhB;EACF;EACF,MAAAtC,IAAA,CAAAuC,KAAA,gBAAAhB,KAAA;AAEA,cAASE,MAAA;AACP,wEAAsC,EAAAM,MAAA;AACxC","ignoreList":[]}
@@ -0,0 +1,379 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+ import { createZeroServer } from "./createZeroServer.mjs";
3
+ import { zeroHttpFixtureSchema } from "./httpPull/fixtureSchema.mjs";
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
+ describe("createZeroServer mutation recovery", () => {
92
+ test("discards async tasks from a rolled-back PostgreSQL mutation", async () => {
93
+ const pg = new FakePgClient();
94
+ let effectRuns = 0;
95
+ const consoleWarn = vi.spyOn(console, "warn").mockImplementation(() => {});
96
+ const zeroServer = createZeroServer({
97
+ schema: 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
+ expect(result.response.mutations[0].result).toMatchObject({
121
+ error: "app",
122
+ message: "rejected"
123
+ });
124
+ expect(result.asyncTasks).toEqual([]);
125
+ expect(effectRuns).toBe(0);
126
+ expect(consoleWarn).toHaveBeenCalledWith("PushProcessor", expect.stringContaining("Error processing mutation"), expect.stringContaining("rejected"));
127
+ consoleWarn.mockRestore();
128
+ });
129
+ 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 = createZeroServer({
140
+ schema: 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
+ expect(responseResolved).toBe(false);
171
+ releaseBarrier();
172
+ const result = await resultPromise;
173
+ expect(result.response.mutations[0].result).toEqual({});
174
+ });
175
+ 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 = vi.spyOn(console, "error").mockImplementation(() => {});
179
+ const zeroServer = createZeroServer({
180
+ schema: 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
+ expect(result.response.mutations[0].result).toEqual({});
202
+ await vi.waitFor(() => {
203
+ expect(consoleError).toHaveBeenCalledWith("[on-zero] async task failed", error);
204
+ });
205
+ consoleError.mockRestore();
206
+ });
207
+ 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 = 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 = createZeroServer({
218
+ schema: 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
+ expect(result.response.mutations[0].result).toEqual({});
247
+ expect(scheduled).toBeInstanceOf(Promise);
248
+ expect(siblingFinished).toBe(false);
249
+ let scheduledSettled = false;
250
+ void scheduled.then(() => {
251
+ scheduledSettled = true;
252
+ });
253
+ await Promise.resolve();
254
+ expect(scheduledSettled).toBe(false);
255
+ releaseSibling();
256
+ await scheduled;
257
+ expect(siblingFinished).toBe(true);
258
+ expect(consoleError).toHaveBeenCalledWith("[on-zero] async task failed", error);
259
+ consoleError.mockRestore();
260
+ });
261
+ 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 = createZeroServer({
272
+ schema: 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
+ expect(responseResolved).toBe(false);
301
+ releaseTask();
302
+ const result = await resultPromise;
303
+ expect(result.response.mutations[0].result).toEqual({});
304
+ });
305
+ test("persists alreadyProcessed duplicate results for zero-cache recovery rows", async () => {
306
+ const pg = new FakePgClient();
307
+ const consoleWarn = vi.spyOn(console, "warn").mockImplementation(() => {});
308
+ const zeroServer = createZeroServer({
309
+ schema: 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
+ expect(first.response.mutations[0].result).toEqual({});
325
+ expect(pg.lastMutationID).toBe(1);
326
+ 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
+ expect(duplicateResult.error).toBe("alreadyProcessed");
333
+ expect(pg.lastMutationID).toBe(1);
334
+ expect(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
335
+ error: "alreadyProcessed",
336
+ details: duplicateResult.details
337
+ })]]);
338
+ expect(consoleWarn).not.toHaveBeenCalled();
339
+ consoleWarn.mockRestore();
340
+ });
341
+ test("persists only alreadyProcessed results in a mixed recovery push", async () => {
342
+ const pg = new FakePgClient();
343
+ const zeroServer = createZeroServer({
344
+ schema: 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
+ expect(results[0].result.error).toBe("alreadyProcessed");
368
+ expect(results[1]).toEqual({
369
+ id: 2,
370
+ result: {}
371
+ });
372
+ expect(pg.lastMutationID).toBe(2);
373
+ expect(pg.mutationResultInserts).toEqual([["cg1", "client-a", 1, JSON.stringify({
374
+ error: "alreadyProcessed",
375
+ details: results[0].result.details
376
+ })]]);
377
+ });
378
+ });
379
+ //# sourceMappingURL=createZeroServer.test.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["describe","expect","test","vi","createZeroServer","zeroHttpFixtureSchema","FakePgClient","lastMutationID","pendingLastMutationID","mutationResultInserts","query","sql","params","rows","includes","nextMutationID","schemaRows","push","Error","table","columns","map","column","schema","dataType","length","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","pg","effectRuns","consoleWarn","spyOn","console","mockImplementation","zeroServer","models","project","mutate","touch","server","enqueueTask","createServerActions","pool","result","handleMutationRequest","authData","request","skipAsyncTasks","response","toMatchObject","error","message","asyncTasks","toEqual","toBe","toHaveBeenCalledWith","stringContaining","mockRestore","releaseBarrier","markBarrierStarted","barrierStarted","Promise","resolve","barrier","responseResolved","resultPromise","then","result2","consoleError","waitFor","releaseSibling","siblingGate","siblingFinished","scheduled","scheduleBackgroundTask","promise","toBeInstanceOf","scheduledSettled","markTaskStarted","taskStarted","releaseTask","taskGate","first","duplicate","duplicateResult","details","not","toHaveBeenCalled","mixed","results","mutation"],"sources":["../../src/createZeroServer.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}