@smthrs/journal 0.0.0-stage → 1.0.0-rc.4

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 (257) hide show
  1. package/CHANGELOG.md +149 -0
  2. package/LICENSE +21 -0
  3. package/README.md +206 -2
  4. package/dist/cjs/CallFact.d.ts +129 -0
  5. package/dist/cjs/CallFact.d.ts.map +1 -0
  6. package/dist/cjs/CallFact.js +106 -0
  7. package/dist/cjs/CallFact.js.map +7 -0
  8. package/dist/cjs/Consensus.d.ts +440 -0
  9. package/dist/cjs/Consensus.d.ts.map +1 -0
  10. package/dist/cjs/Consensus.js +251 -0
  11. package/dist/cjs/Consensus.js.map +7 -0
  12. package/dist/cjs/EngineEvent.d.ts +890 -0
  13. package/dist/cjs/EngineEvent.d.ts.map +1 -0
  14. package/dist/cjs/EngineEvent.js +383 -0
  15. package/dist/cjs/EngineEvent.js.map +7 -0
  16. package/dist/cjs/ExecutionFact.d.ts +216 -0
  17. package/dist/cjs/ExecutionFact.d.ts.map +1 -0
  18. package/dist/cjs/ExecutionFact.js +303 -0
  19. package/dist/cjs/ExecutionFact.js.map +7 -0
  20. package/dist/cjs/Journal.d.ts +617 -0
  21. package/dist/cjs/Journal.d.ts.map +1 -0
  22. package/dist/cjs/Journal.js +190 -0
  23. package/dist/cjs/Journal.js.map +7 -0
  24. package/dist/cjs/JournalEvent.d.ts +421 -0
  25. package/dist/cjs/JournalEvent.d.ts.map +1 -0
  26. package/dist/cjs/JournalEvent.js +281 -0
  27. package/dist/cjs/JournalEvent.js.map +7 -0
  28. package/dist/cjs/JournalGeneration.d.ts +34 -0
  29. package/dist/cjs/JournalGeneration.d.ts.map +1 -0
  30. package/dist/cjs/JournalGeneration.js +72 -0
  31. package/dist/cjs/JournalGeneration.js.map +7 -0
  32. package/dist/cjs/JournalMetrics.d.ts +72 -0
  33. package/dist/cjs/JournalMetrics.d.ts.map +1 -0
  34. package/dist/cjs/JournalMetrics.js +55 -0
  35. package/dist/cjs/JournalMetrics.js.map +7 -0
  36. package/dist/cjs/Migrations.d.ts +42 -0
  37. package/dist/cjs/Migrations.d.ts.map +1 -0
  38. package/dist/cjs/Migrations.js +58 -0
  39. package/dist/cjs/Migrations.js.map +7 -0
  40. package/dist/cjs/OwnerId.d.ts +40 -0
  41. package/dist/cjs/OwnerId.d.ts.map +1 -0
  42. package/dist/cjs/OwnerId.js +40 -0
  43. package/dist/cjs/OwnerId.js.map +7 -0
  44. package/dist/cjs/Projection.d.ts +29 -0
  45. package/dist/cjs/Projection.d.ts.map +1 -0
  46. package/dist/cjs/Projection.js +25 -0
  47. package/dist/cjs/Projection.js.map +7 -0
  48. package/dist/cjs/RedactedLogger.d.ts +121 -0
  49. package/dist/cjs/RedactedLogger.d.ts.map +1 -0
  50. package/dist/cjs/RedactedLogger.js +235 -0
  51. package/dist/cjs/RedactedLogger.js.map +7 -0
  52. package/dist/cjs/Redaction.d.ts +350 -0
  53. package/dist/cjs/Redaction.d.ts.map +1 -0
  54. package/dist/cjs/Redaction.js +928 -0
  55. package/dist/cjs/Redaction.js.map +7 -0
  56. package/dist/cjs/SqlConsensus.d.ts +44 -0
  57. package/dist/cjs/SqlConsensus.d.ts.map +1 -0
  58. package/dist/cjs/SqlConsensus.js +243 -0
  59. package/dist/cjs/SqlConsensus.js.map +7 -0
  60. package/dist/cjs/SqlJournal.d.ts +173 -0
  61. package/dist/cjs/SqlJournal.d.ts.map +1 -0
  62. package/dist/cjs/SqlJournal.js +1568 -0
  63. package/dist/cjs/SqlJournal.js.map +7 -0
  64. package/dist/cjs/StepFact.d.ts +66 -0
  65. package/dist/cjs/StepFact.d.ts.map +1 -0
  66. package/dist/cjs/StepFact.js +68 -0
  67. package/dist/cjs/StepFact.js.map +7 -0
  68. package/dist/cjs/index.d.ts +95 -0
  69. package/dist/cjs/index.d.ts.map +1 -0
  70. package/dist/cjs/index.js +63 -0
  71. package/dist/cjs/index.js.map +7 -0
  72. package/dist/cjs/internal/JournalInternalFault.d.ts +37 -0
  73. package/dist/cjs/internal/JournalInternalFault.d.ts.map +1 -0
  74. package/dist/cjs/internal/JournalInternalFault.js +43 -0
  75. package/dist/cjs/internal/JournalInternalFault.js.map +7 -0
  76. package/dist/cjs/migrations/0001_initial.d.ts +15 -0
  77. package/dist/cjs/migrations/0001_initial.d.ts.map +1 -0
  78. package/dist/cjs/migrations/0001_initial.js +54 -0
  79. package/dist/cjs/migrations/0001_initial.js.map +7 -0
  80. package/dist/cjs/migrations/0002_checkpoints.d.ts +27 -0
  81. package/dist/cjs/migrations/0002_checkpoints.d.ts.map +1 -0
  82. package/dist/cjs/migrations/0002_checkpoints.js +48 -0
  83. package/dist/cjs/migrations/0002_checkpoints.js.map +7 -0
  84. package/dist/cjs/migrations/0003_startup_index.d.ts +15 -0
  85. package/dist/cjs/migrations/0003_startup_index.d.ts.map +1 -0
  86. package/dist/cjs/migrations/0003_startup_index.js +40 -0
  87. package/dist/cjs/migrations/0003_startup_index.js.map +7 -0
  88. package/dist/cjs/migrations/0004_dedup.d.ts +15 -0
  89. package/dist/cjs/migrations/0004_dedup.d.ts.map +1 -0
  90. package/dist/cjs/migrations/0004_dedup.js +57 -0
  91. package/dist/cjs/migrations/0004_dedup.js.map +7 -0
  92. package/dist/cjs/migrations/0005_run_event_type.d.ts +15 -0
  93. package/dist/cjs/migrations/0005_run_event_type.d.ts.map +1 -0
  94. package/dist/cjs/migrations/0005_run_event_type.js +40 -0
  95. package/dist/cjs/migrations/0005_run_event_type.js.map +7 -0
  96. package/dist/cjs/migrations/0006_consensus.d.ts +22 -0
  97. package/dist/cjs/migrations/0006_consensus.d.ts.map +1 -0
  98. package/dist/cjs/migrations/0006_consensus.js +84 -0
  99. package/dist/cjs/migrations/0006_consensus.js.map +7 -0
  100. package/dist/cjs/package.json +1 -0
  101. package/dist/cjs/test/Notifying.d.ts +65 -0
  102. package/dist/cjs/test/Notifying.d.ts.map +1 -0
  103. package/dist/cjs/test/Notifying.js +62 -0
  104. package/dist/cjs/test/Notifying.js.map +7 -0
  105. package/dist/cjs/test/TestJournal.d.ts +43 -0
  106. package/dist/cjs/test/TestJournal.d.ts.map +1 -0
  107. package/dist/cjs/test/TestJournal.js +43 -0
  108. package/dist/cjs/test/TestJournal.js.map +7 -0
  109. package/dist/esm/CallFact.d.ts +129 -0
  110. package/dist/esm/CallFact.d.ts.map +1 -0
  111. package/dist/esm/CallFact.js +96 -0
  112. package/dist/esm/CallFact.js.map +1 -0
  113. package/dist/esm/Consensus.d.ts +440 -0
  114. package/dist/esm/Consensus.d.ts.map +1 -0
  115. package/dist/esm/Consensus.js +454 -0
  116. package/dist/esm/Consensus.js.map +1 -0
  117. package/dist/esm/EngineEvent.d.ts +890 -0
  118. package/dist/esm/EngineEvent.d.ts.map +1 -0
  119. package/dist/esm/EngineEvent.js +614 -0
  120. package/dist/esm/EngineEvent.js.map +1 -0
  121. package/dist/esm/ExecutionFact.d.ts +216 -0
  122. package/dist/esm/ExecutionFact.d.ts.map +1 -0
  123. package/dist/esm/ExecutionFact.js +374 -0
  124. package/dist/esm/ExecutionFact.js.map +1 -0
  125. package/dist/esm/Journal.d.ts +617 -0
  126. package/dist/esm/Journal.d.ts.map +1 -0
  127. package/dist/esm/Journal.js +323 -0
  128. package/dist/esm/Journal.js.map +1 -0
  129. package/dist/esm/JournalEvent.d.ts +421 -0
  130. package/dist/esm/JournalEvent.d.ts.map +1 -0
  131. package/dist/esm/JournalEvent.js +517 -0
  132. package/dist/esm/JournalEvent.js.map +1 -0
  133. package/dist/esm/JournalGeneration.d.ts +34 -0
  134. package/dist/esm/JournalGeneration.d.ts.map +1 -0
  135. package/dist/esm/JournalGeneration.js +65 -0
  136. package/dist/esm/JournalGeneration.js.map +1 -0
  137. package/dist/esm/JournalMetrics.d.ts +72 -0
  138. package/dist/esm/JournalMetrics.d.ts.map +1 -0
  139. package/dist/esm/JournalMetrics.js +79 -0
  140. package/dist/esm/JournalMetrics.js.map +1 -0
  141. package/dist/esm/Migrations.d.ts +42 -0
  142. package/dist/esm/Migrations.d.ts.map +1 -0
  143. package/dist/esm/Migrations.js +59 -0
  144. package/dist/esm/Migrations.js.map +1 -0
  145. package/dist/esm/OwnerId.d.ts +40 -0
  146. package/dist/esm/OwnerId.d.ts.map +1 -0
  147. package/dist/esm/OwnerId.js +33 -0
  148. package/dist/esm/OwnerId.js.map +1 -0
  149. package/dist/esm/Projection.d.ts +29 -0
  150. package/dist/esm/Projection.d.ts.map +1 -0
  151. package/dist/esm/Projection.js +13 -0
  152. package/dist/esm/Projection.js.map +1 -0
  153. package/dist/esm/RedactedLogger.d.ts +121 -0
  154. package/dist/esm/RedactedLogger.d.ts.map +1 -0
  155. package/dist/esm/RedactedLogger.js +445 -0
  156. package/dist/esm/RedactedLogger.js.map +1 -0
  157. package/dist/esm/Redaction.d.ts +350 -0
  158. package/dist/esm/Redaction.d.ts.map +1 -0
  159. package/dist/esm/Redaction.js +1584 -0
  160. package/dist/esm/Redaction.js.map +1 -0
  161. package/dist/esm/SqlConsensus.d.ts +44 -0
  162. package/dist/esm/SqlConsensus.d.ts.map +1 -0
  163. package/dist/esm/SqlConsensus.js +252 -0
  164. package/dist/esm/SqlConsensus.js.map +1 -0
  165. package/dist/esm/SqlJournal.d.ts +173 -0
  166. package/dist/esm/SqlJournal.d.ts.map +1 -0
  167. package/dist/esm/SqlJournal.js +1858 -0
  168. package/dist/esm/SqlJournal.js.map +1 -0
  169. package/dist/esm/StepFact.d.ts +66 -0
  170. package/dist/esm/StepFact.d.ts.map +1 -0
  171. package/dist/esm/StepFact.js +50 -0
  172. package/dist/esm/StepFact.js.map +1 -0
  173. package/dist/esm/index.d.ts +95 -0
  174. package/dist/esm/index.d.ts.map +1 -0
  175. package/dist/esm/index.js +95 -0
  176. package/dist/esm/index.js.map +1 -0
  177. package/dist/esm/internal/JournalInternalFault.d.ts +37 -0
  178. package/dist/esm/internal/JournalInternalFault.d.ts.map +1 -0
  179. package/dist/esm/internal/JournalInternalFault.js +28 -0
  180. package/dist/esm/internal/JournalInternalFault.js.map +1 -0
  181. package/dist/esm/migrations/0001_initial.d.ts +15 -0
  182. package/dist/esm/migrations/0001_initial.d.ts.map +1 -0
  183. package/dist/esm/migrations/0001_initial.js +32 -0
  184. package/dist/esm/migrations/0001_initial.js.map +1 -0
  185. package/dist/esm/migrations/0002_checkpoints.d.ts +27 -0
  186. package/dist/esm/migrations/0002_checkpoints.d.ts.map +1 -0
  187. package/dist/esm/migrations/0002_checkpoints.js +38 -0
  188. package/dist/esm/migrations/0002_checkpoints.js.map +1 -0
  189. package/dist/esm/migrations/0003_startup_index.d.ts +15 -0
  190. package/dist/esm/migrations/0003_startup_index.d.ts.map +1 -0
  191. package/dist/esm/migrations/0003_startup_index.js +18 -0
  192. package/dist/esm/migrations/0003_startup_index.js.map +1 -0
  193. package/dist/esm/migrations/0004_dedup.d.ts +15 -0
  194. package/dist/esm/migrations/0004_dedup.d.ts.map +1 -0
  195. package/dist/esm/migrations/0004_dedup.js +38 -0
  196. package/dist/esm/migrations/0004_dedup.js.map +1 -0
  197. package/dist/esm/migrations/0005_run_event_type.d.ts +15 -0
  198. package/dist/esm/migrations/0005_run_event_type.d.ts.map +1 -0
  199. package/dist/esm/migrations/0005_run_event_type.js +18 -0
  200. package/dist/esm/migrations/0005_run_event_type.js.map +1 -0
  201. package/dist/esm/migrations/0006_consensus.d.ts +22 -0
  202. package/dist/esm/migrations/0006_consensus.d.ts.map +1 -0
  203. package/dist/esm/migrations/0006_consensus.js +69 -0
  204. package/dist/esm/migrations/0006_consensus.js.map +1 -0
  205. package/dist/esm/test/Notifying.d.ts +65 -0
  206. package/dist/esm/test/Notifying.d.ts.map +1 -0
  207. package/dist/esm/test/Notifying.js +62 -0
  208. package/dist/esm/test/Notifying.js.map +1 -0
  209. package/dist/esm/test/TestJournal.d.ts +43 -0
  210. package/dist/esm/test/TestJournal.d.ts.map +1 -0
  211. package/dist/esm/test/TestJournal.js +27 -0
  212. package/dist/esm/test/TestJournal.js.map +1 -0
  213. package/docs/README.md +164 -0
  214. package/docs/api.md +639 -0
  215. package/docs/concepts/compaction.md +157 -0
  216. package/docs/concepts/idempotency.md +127 -0
  217. package/docs/concepts/owner-fence.md +124 -0
  218. package/docs/concepts/redaction.md +218 -0
  219. package/docs/concepts/state-event-authority.md +159 -0
  220. package/docs/concepts/two-channels.md +167 -0
  221. package/docs/guides/commit-state-and-entry.md +114 -0
  222. package/docs/guides/compact-a-run.md +134 -0
  223. package/docs/guides/fold-a-projection.md +106 -0
  224. package/docs/guides/read-a-run.md +139 -0
  225. package/docs/guides/redact-log-output.md +94 -0
  226. package/docs/guides/testing.md +124 -0
  227. package/docs/guides/write-lifecycle-events.md +110 -0
  228. package/docs/installation.md +133 -0
  229. package/docs/quickstart.md +143 -0
  230. package/docs/troubleshooting.md +214 -0
  231. package/package.json +263 -3
  232. package/src/CallFact.ts +117 -0
  233. package/src/Consensus.ts +683 -0
  234. package/src/EngineEvent.ts +823 -0
  235. package/src/ExecutionFact.ts +433 -0
  236. package/src/Journal.ts +688 -0
  237. package/src/JournalEvent.ts +654 -0
  238. package/src/JournalGeneration.ts +77 -0
  239. package/src/JournalMetrics.ts +89 -0
  240. package/src/Migrations.ts +62 -0
  241. package/src/OwnerId.ts +42 -0
  242. package/src/Projection.ts +31 -0
  243. package/src/RedactedLogger.ts +483 -0
  244. package/src/Redaction.ts +1784 -0
  245. package/src/SqlConsensus.ts +344 -0
  246. package/src/SqlJournal.ts +2732 -0
  247. package/src/StepFact.ts +69 -0
  248. package/src/index.ts +109 -0
  249. package/src/internal/JournalInternalFault.ts +40 -0
  250. package/src/migrations/0001_initial.ts +41 -0
  251. package/src/migrations/0002_checkpoints.ts +46 -0
  252. package/src/migrations/0003_startup_index.ts +19 -0
  253. package/src/migrations/0004_dedup.ts +43 -0
  254. package/src/migrations/0005_run_event_type.ts +19 -0
  255. package/src/migrations/0006_consensus.ts +83 -0
  256. package/src/test/Notifying.ts +101 -0
  257. package/src/test/TestJournal.ts +52 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JournalGeneration.js","sourceRoot":"","sources":["../../src/JournalGeneration.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,OAAO,MAAM,0BAA0B,CAAA;AACnD,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,SAAS,MAAM,+BAA+B,CAAA;AAE1D;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,uEAAuE;IACvE,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAM;IACnC,KAAK,CAAC,CAAC,GAAG,CAAA;;;mBAGO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBACnC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,YAAY,CACxC;kBACgB,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAClC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAA,WAAW,CACvC;;GAEC,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAqE,CAAA;AAEjG;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,MAA+C,EAAE,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,IAAI,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACjC,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,SAAS,GAAG,IAAI,GAAG,EAAE,CAAA;QACrB,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC,CAAA;IAC9B,CAAC;IACD,MAAM,UAAU,GAAG,SAAS,CAAA;IAC5B,KAAK,CAAC,CAAC,MAAM,CAAC,cAAc,CAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EACzC,GAAG,EAAE,CACH,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACf,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC,CAAC,CACL,CAAA;AACH,CAAC,CAAC,CAAA;AAEJ;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,MAA6B,EAAE,EAAE,CACtD,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAA;IACtC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QACtB,KAAK,MAAM,UAAU,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE;YAAE,UAAU,CAAC,MAAM,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA","sourcesContent":["/**\n * Durable generations distinguish histories that reuse journal sequences.\n *\n * @since 1.0.0-rc.0\n */\n\nimport * as Dialect from \"@smthrs/database/Dialect\"\nimport * as Effect from \"effect/Effect\"\nimport * as SqlClient from \"effect/unstable/sql/SqlClient\"\n\n/**\n * Installs the generation table idempotently. Both the SQL journal and time\n * travel initialize it, including databases whose migration ladder already\n * passed the journal's reserved block. A read-only client installs nothing.\n *\n * @category migrations\n * @since 1.0.0-rc.0\n */\nexport const initialize = Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n // A read-only observer reads the schema it finds and installs nothing.\n if (Dialect.isReadOnly(sql)) return\n yield* sql`\n CREATE TABLE IF NOT EXISTS flows_journal_generations (\n run_id TEXT PRIMARY KEY NOT NULL CHECK (length(run_id) > 0),\n generation ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`generation`)\n } AND generation > 0 AND generation <= 9007199254740991),\n after_seq ${Dialect.integer(sql)} NOT NULL CHECK (${\n Dialect.isInteger(sql, sql`after_seq`)\n } AND after_seq >= -1 AND after_seq <= 9007199254740991)\n )\n `\n})\n\nconst journals = new WeakMap<SqlClient.SqlClient, Set<(runIds: ReadonlyArray<string>) => void>>()\n\n/**\n * Registers a live journal's cache invalidation until its scope closes.\n * Multiple journals over the same SQL client must observe the same rewind.\n *\n * @category lifecycle\n * @since 1.0.0-rc.0\n */\nexport const onTruncate = (forget: (runIds: ReadonlyArray<string>) => void) =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n let listeners = journals.get(sql)\n if (listeners === undefined) {\n listeners = new Set()\n journals.set(sql, listeners)\n }\n const registered = listeners\n yield* Effect.acquireRelease(\n Effect.sync(() => registered.add(forget)),\n () =>\n Effect.sync(() => {\n registered.delete(forget)\n })\n )\n })\n\n/**\n * Forgets cached identities and allocation floors after a committed truncation.\n * The rewinder must quiesce producers and flush pending admissions first.\n * Database rows remain authoritative; this operation changes no durable data.\n *\n * @category lifecycle\n * @since 1.0.0-rc.0\n */\nexport const forget = (runIds: ReadonlyArray<string>) =>\n Effect.gen(function*() {\n const sql = yield* SqlClient.SqlClient\n yield* Effect.sync(() => {\n for (const invalidate of journals.get(sql) ?? []) invalidate(runIds)\n })\n })\n"]}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Standard metric definitions for the journal write path.
3
+ *
4
+ * This module only defines the metric handles, following the shape of Effect's
5
+ * `ClusterMetrics`. `SqlJournal` updates them as emission receipts are
6
+ * produced, so the counters measure admissions on the hot path rather than
7
+ * rows read back. No exporter ships in this package; provide one, for
8
+ * example `@smthrs/observability`, and these counters appear in it.
9
+ *
10
+ * @since 0.1.0
11
+ */
12
+ import * as Metric from "effect/Metric";
13
+ /**
14
+ * Counter over journal emissions, dimensioned by `channel` (`durable` or
15
+ * `lossy`) and `receipt` (`accepted`, `duplicate`, or `dropped`).
16
+ *
17
+ * **Details**
18
+ *
19
+ * A `durable` emission counts when its receipt is produced, which is after the
20
+ * write transaction returned; under `Journal.transact` that is still inside
21
+ * the caller's transaction, so a receipt that later rolls back with the
22
+ * enclosing transaction has already counted. The counter is throughput
23
+ * evidence, not commit evidence: the journal rows themselves are the latter.
24
+ *
25
+ * @category metrics
26
+ * @since 0.1.0
27
+ */
28
+ export declare const writes: Metric.Counter<number>;
29
+ /**
30
+ * `writes` views for the durable channel, keyed by the receipt tag
31
+ * `Journal.emitDurable` resolves to.
32
+ *
33
+ * @category metrics
34
+ * @since 0.1.0
35
+ */
36
+ export declare const durable: {
37
+ readonly [Tag in "Accepted" | "Duplicate"]: Metric.Metric<number, Metric.CounterState<number>>;
38
+ };
39
+ /**
40
+ * `writes` views for the lossy channel, keyed by the receipt tag
41
+ * `Journal.emitLossy` resolves to.
42
+ *
43
+ * @category metrics
44
+ * @since 0.1.0
45
+ */
46
+ export declare const lossy: {
47
+ readonly [Tag in "Accepted" | "Duplicate" | "Dropped"]: Metric.Metric<number, Metric.CounterState<number>>;
48
+ };
49
+ /**
50
+ * Counter over lossy entries the writer admitted and then failed to commit,
51
+ * dimensioned by `channel` (always `lossy`) and the `code` of the
52
+ * `JournalError` that lost them.
53
+ *
54
+ * **Details**
55
+ *
56
+ * A lossy producer rarely calls `flush`, so the failure `flush` reports is not
57
+ * where an operator learns about a lost batch. This counter moves by the number
58
+ * of entries lost the moment the writer gives them up, whether or not anyone
59
+ * is waiting on them.
60
+ *
61
+ * @category metrics
62
+ * @since 1.0.0-rc.1
63
+ */
64
+ export declare const lostEntries: Metric.Counter<number>;
65
+ /**
66
+ * The {@link lostEntries} view for one `JournalError` code.
67
+ *
68
+ * @category metrics
69
+ * @since 1.0.0-rc.1
70
+ */
71
+ export declare const lost: (code: string) => Metric.Metric<number, Metric.CounterState<number>>;
72
+ //# sourceMappingURL=JournalMetrics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JournalMetrics.d.ts","sourceRoot":"","sources":["../../src/JournalMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,MAAM,wBAEjB,CAAA;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB,QAAQ,EAAE,GAAG,IAAI,UAAU,GAAG,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;CAI/F,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,EAAE;IAClB,QAAQ,EAAE,GAAG,IAAI,UAAU,GAAG,WAAW,GAAG,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;CAK3G,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,WAAW,wBAEtB,CAAA;AAEF;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,MAAM,MAAM,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,CACrB,CAAA"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Standard metric definitions for the journal write path.
3
+ *
4
+ * This module only defines the metric handles, following the shape of Effect's
5
+ * `ClusterMetrics`. `SqlJournal` updates them as emission receipts are
6
+ * produced, so the counters measure admissions on the hot path rather than
7
+ * rows read back. No exporter ships in this package; provide one, for
8
+ * example `@smthrs/observability`, and these counters appear in it.
9
+ *
10
+ * @since 0.1.0
11
+ */
12
+ import * as Metric from "effect/Metric";
13
+ /**
14
+ * Counter over journal emissions, dimensioned by `channel` (`durable` or
15
+ * `lossy`) and `receipt` (`accepted`, `duplicate`, or `dropped`).
16
+ *
17
+ * **Details**
18
+ *
19
+ * A `durable` emission counts when its receipt is produced, which is after the
20
+ * write transaction returned; under `Journal.transact` that is still inside
21
+ * the caller's transaction, so a receipt that later rolls back with the
22
+ * enclosing transaction has already counted. The counter is throughput
23
+ * evidence, not commit evidence: the journal rows themselves are the latter.
24
+ *
25
+ * @category metrics
26
+ * @since 0.1.0
27
+ */
28
+ export const writes = Metric.counter("flows_journal_writes", {
29
+ description: "Journal emissions by channel and receipt"
30
+ });
31
+ /**
32
+ * `writes` views for the durable channel, keyed by the receipt tag
33
+ * `Journal.emitDurable` resolves to.
34
+ *
35
+ * @category metrics
36
+ * @since 0.1.0
37
+ */
38
+ export const durable = {
39
+ Accepted: Metric.withAttributes(writes, { channel: "durable", receipt: "accepted" }),
40
+ Duplicate: Metric.withAttributes(writes, { channel: "durable", receipt: "duplicate" })
41
+ };
42
+ /**
43
+ * `writes` views for the lossy channel, keyed by the receipt tag
44
+ * `Journal.emitLossy` resolves to.
45
+ *
46
+ * @category metrics
47
+ * @since 0.1.0
48
+ */
49
+ export const lossy = {
50
+ Accepted: Metric.withAttributes(writes, { channel: "lossy", receipt: "accepted" }),
51
+ Duplicate: Metric.withAttributes(writes, { channel: "lossy", receipt: "duplicate" }),
52
+ Dropped: Metric.withAttributes(writes, { channel: "lossy", receipt: "dropped" })
53
+ };
54
+ /**
55
+ * Counter over lossy entries the writer admitted and then failed to commit,
56
+ * dimensioned by `channel` (always `lossy`) and the `code` of the
57
+ * `JournalError` that lost them.
58
+ *
59
+ * **Details**
60
+ *
61
+ * A lossy producer rarely calls `flush`, so the failure `flush` reports is not
62
+ * where an operator learns about a lost batch. This counter moves by the number
63
+ * of entries lost the moment the writer gives them up, whether or not anyone
64
+ * is waiting on them.
65
+ *
66
+ * @category metrics
67
+ * @since 1.0.0-rc.1
68
+ */
69
+ export const lostEntries = Metric.counter("flows_journal_lost", {
70
+ description: "Admitted lossy journal entries the writer failed to commit"
71
+ });
72
+ /**
73
+ * The {@link lostEntries} view for one `JournalError` code.
74
+ *
75
+ * @category metrics
76
+ * @since 1.0.0-rc.1
77
+ */
78
+ export const lost = (code) => Metric.withAttributes(lostEntries, { channel: "lossy", code });
79
+ //# sourceMappingURL=JournalMetrics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JournalMetrics.js","sourceRoot":"","sources":["../../src/JournalMetrics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,sBAAsB,EAAE;IAC3D,WAAW,EAAE,0CAA0C;CACxD,CAAC,CAAA;AAEF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAEhB;IACF,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IACpF,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;CACvF,CAAA;AAED;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,KAAK,GAEd;IACF,QAAQ,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAClF,SAAS,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;IACpF,OAAO,EAAE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;CACjF,CAAA;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,CAAC,oBAAoB,EAAE;IAC9D,WAAW,EAAE,4DAA4D;CAC1E,CAAC,CAAA;AAEF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,IAAY,EAAsD,EAAE,CACvF,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA","sourcesContent":["/**\n * Standard metric definitions for the journal write path.\n *\n * This module only defines the metric handles, following the shape of Effect's\n * `ClusterMetrics`. `SqlJournal` updates them as emission receipts are\n * produced, so the counters measure admissions on the hot path rather than\n * rows read back. No exporter ships in this package; provide one, for\n * example `@smthrs/observability`, and these counters appear in it.\n *\n * @since 0.1.0\n */\n\nimport * as Metric from \"effect/Metric\"\n\n/**\n * Counter over journal emissions, dimensioned by `channel` (`durable` or\n * `lossy`) and `receipt` (`accepted`, `duplicate`, or `dropped`).\n *\n * **Details**\n *\n * A `durable` emission counts when its receipt is produced, which is after the\n * write transaction returned; under `Journal.transact` that is still inside\n * the caller's transaction, so a receipt that later rolls back with the\n * enclosing transaction has already counted. The counter is throughput\n * evidence, not commit evidence: the journal rows themselves are the latter.\n *\n * @category metrics\n * @since 0.1.0\n */\nexport const writes = Metric.counter(\"flows_journal_writes\", {\n description: \"Journal emissions by channel and receipt\"\n})\n\n/**\n * `writes` views for the durable channel, keyed by the receipt tag\n * `Journal.emitDurable` resolves to.\n *\n * @category metrics\n * @since 0.1.0\n */\nexport const durable: {\n readonly [Tag in \"Accepted\" | \"Duplicate\"]: Metric.Metric<number, Metric.CounterState<number>>\n} = {\n Accepted: Metric.withAttributes(writes, { channel: \"durable\", receipt: \"accepted\" }),\n Duplicate: Metric.withAttributes(writes, { channel: \"durable\", receipt: \"duplicate\" })\n}\n\n/**\n * `writes` views for the lossy channel, keyed by the receipt tag\n * `Journal.emitLossy` resolves to.\n *\n * @category metrics\n * @since 0.1.0\n */\nexport const lossy: {\n readonly [Tag in \"Accepted\" | \"Duplicate\" | \"Dropped\"]: Metric.Metric<number, Metric.CounterState<number>>\n} = {\n Accepted: Metric.withAttributes(writes, { channel: \"lossy\", receipt: \"accepted\" }),\n Duplicate: Metric.withAttributes(writes, { channel: \"lossy\", receipt: \"duplicate\" }),\n Dropped: Metric.withAttributes(writes, { channel: \"lossy\", receipt: \"dropped\" })\n}\n\n/**\n * Counter over lossy entries the writer admitted and then failed to commit,\n * dimensioned by `channel` (always `lossy`) and the `code` of the\n * `JournalError` that lost them.\n *\n * **Details**\n *\n * A lossy producer rarely calls `flush`, so the failure `flush` reports is not\n * where an operator learns about a lost batch. This counter moves by the number\n * of entries lost the moment the writer gives them up, whether or not anyone\n * is waiting on them.\n *\n * @category metrics\n * @since 1.0.0-rc.1\n */\nexport const lostEntries = Metric.counter(\"flows_journal_lost\", {\n description: \"Admitted lossy journal entries the writer failed to commit\"\n})\n\n/**\n * The {@link lostEntries} view for one `JournalError` code.\n *\n * @category metrics\n * @since 1.0.0-rc.1\n */\nexport const lost = (code: string): Metric.Metric<number, Metric.CounterState<number>> =>\n Metric.withAttributes(lostEntries, { channel: \"lossy\", code })\n"]}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Journal schema migrations.
3
+ *
4
+ * The journal owns four tables: `flows_journal_events` and its event-type
5
+ * index in `0001_initial`, `flows_journal_checkpoints` in
6
+ * `0002_checkpoints`, the bounded startup ordering index in
7
+ * `0003_startup_index`, compacted producer identities in `0004_dedup`, the
8
+ * per-run exact event-type cursor index in `0005_run_event_type`, and the
9
+ * `SqlConsensus` lease table `flows_consensus_leases` in `0006_consensus`. Run
10
+ * and attempt state migrate from `@smthrs/run-store`, the step cache from
11
+ * `@smthrs/step-cache`, and the durable deferred/clock tables from
12
+ * `@smthrs/engine-store`; an application composes those sets with this one
13
+ * through `@smthrs/database`'s `Migrations.layer`.
14
+ *
15
+ * @since 0.1.0
16
+ */
17
+ import * as DatabaseMigrations from "@smthrs/database/Migrations";
18
+ import * as Layer from "effect/Layer";
19
+ /**
20
+ * The journal's namespaced migration set, for composition with the other
21
+ * storage packages.
22
+ *
23
+ * @category migrations
24
+ * @since 0.1.0
25
+ */
26
+ export declare const set: DatabaseMigrations.MigrationSet;
27
+ /**
28
+ * Creates the journal's authoritative durable schema.
29
+ *
30
+ * @category migrations
31
+ * @since 0.1.0
32
+ */
33
+ export declare const run: import("effect/Effect").Effect<readonly (readonly [id: number, name: string])[], import("effect/unstable/sql/SqlError").SqlError | import("effect/unstable/sql/Migrator").MigrationError, import("effect/unstable/sql/SqlClient").SqlClient>;
34
+ /**
35
+ * Layer that runs journal migrations before exposing the database to journal
36
+ * services.
37
+ *
38
+ * @category layers
39
+ * @since 0.1.0
40
+ */
41
+ export declare const layer: Layer.Layer<never, import("effect/unstable/sql/SqlError").SqlError | import("effect/unstable/sql/Migrator").MigrationError, import("effect/unstable/sql/SqlClient").SqlClient>;
42
+ //# sourceMappingURL=Migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrations.d.ts","sourceRoot":"","sources":["../../src/Migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,kBAAkB,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAQrC;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,EAAE,kBAAkB,CAAC,YAWpC,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,GAAG,8OAAgC,CAAA;AAEhD;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,gLAA2B,CAAA"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Journal schema migrations.
3
+ *
4
+ * The journal owns four tables: `flows_journal_events` and its event-type
5
+ * index in `0001_initial`, `flows_journal_checkpoints` in
6
+ * `0002_checkpoints`, the bounded startup ordering index in
7
+ * `0003_startup_index`, compacted producer identities in `0004_dedup`, the
8
+ * per-run exact event-type cursor index in `0005_run_event_type`, and the
9
+ * `SqlConsensus` lease table `flows_consensus_leases` in `0006_consensus`. Run
10
+ * and attempt state migrate from `@smthrs/run-store`, the step cache from
11
+ * `@smthrs/step-cache`, and the durable deferred/clock tables from
12
+ * `@smthrs/engine-store`; an application composes those sets with this one
13
+ * through `@smthrs/database`'s `Migrations.layer`.
14
+ *
15
+ * @since 0.1.0
16
+ */
17
+ import * as DatabaseMigrations from "@smthrs/database/Migrations";
18
+ import * as Layer from "effect/Layer";
19
+ import { initial } from "./migrations/0001_initial.js";
20
+ import { checkpoints } from "./migrations/0002_checkpoints.js";
21
+ import { startupIndex } from "./migrations/0003_startup_index.js";
22
+ import { dedup } from "./migrations/0004_dedup.js";
23
+ import { runEventType } from "./migrations/0005_run_event_type.js";
24
+ import { consensus } from "./migrations/0006_consensus.js";
25
+ /**
26
+ * The journal's namespaced migration set, for composition with the other
27
+ * storage packages.
28
+ *
29
+ * @category migrations
30
+ * @since 0.1.0
31
+ */
32
+ export const set = {
33
+ namespace: "journal",
34
+ idOffset: 0,
35
+ migrations: {
36
+ "0001_initial": initial,
37
+ "0002_checkpoints": checkpoints,
38
+ "0003_startup_index": startupIndex,
39
+ "0004_dedup": dedup,
40
+ "0005_run_event_type": runEventType,
41
+ "0006_consensus": consensus
42
+ }
43
+ };
44
+ /**
45
+ * Creates the journal's authoritative durable schema.
46
+ *
47
+ * @category migrations
48
+ * @since 0.1.0
49
+ */
50
+ export const run = DatabaseMigrations.run([set]);
51
+ /**
52
+ * Layer that runs journal migrations before exposing the database to journal
53
+ * services.
54
+ *
55
+ * @category layers
56
+ * @since 0.1.0
57
+ */
58
+ export const layer = Layer.effectDiscard(run);
59
+ //# sourceMappingURL=Migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Migrations.js","sourceRoot":"","sources":["../../src/Migrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,KAAK,kBAAkB,MAAM,6BAA6B,CAAA;AACjE,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAA;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,kCAAkC,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAA;AACjE,OAAO,EAAE,KAAK,EAAE,MAAM,4BAA4B,CAAA;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAA;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,gCAAgC,CAAA;AAE1D;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,GAAG,GAAoC;IAClD,SAAS,EAAE,SAAS;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE;QACV,cAAc,EAAE,OAAO;QACvB,kBAAkB,EAAE,WAAW;QAC/B,oBAAoB,EAAE,YAAY;QAClC,YAAY,EAAE,KAAK;QACnB,qBAAqB,EAAE,YAAY;QACnC,gBAAgB,EAAE,SAAS;KAC5B;CACF,CAAA;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAA;AAEhD;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA","sourcesContent":["/**\n * Journal schema migrations.\n *\n * The journal owns four tables: `flows_journal_events` and its event-type\n * index in `0001_initial`, `flows_journal_checkpoints` in\n * `0002_checkpoints`, the bounded startup ordering index in\n * `0003_startup_index`, compacted producer identities in `0004_dedup`, the\n * per-run exact event-type cursor index in `0005_run_event_type`, and the\n * `SqlConsensus` lease table `flows_consensus_leases` in `0006_consensus`. Run\n * and attempt state migrate from `@smthrs/run-store`, the step cache from\n * `@smthrs/step-cache`, and the durable deferred/clock tables from\n * `@smthrs/engine-store`; an application composes those sets with this one\n * through `@smthrs/database`'s `Migrations.layer`.\n *\n * @since 0.1.0\n */\n\nimport * as DatabaseMigrations from \"@smthrs/database/Migrations\"\nimport * as Layer from \"effect/Layer\"\nimport { initial } from \"./migrations/0001_initial.ts\"\nimport { checkpoints } from \"./migrations/0002_checkpoints.ts\"\nimport { startupIndex } from \"./migrations/0003_startup_index.ts\"\nimport { dedup } from \"./migrations/0004_dedup.ts\"\nimport { runEventType } from \"./migrations/0005_run_event_type.ts\"\nimport { consensus } from \"./migrations/0006_consensus.ts\"\n\n/**\n * The journal's namespaced migration set, for composition with the other\n * storage packages.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const set: DatabaseMigrations.MigrationSet = {\n namespace: \"journal\",\n idOffset: 0,\n migrations: {\n \"0001_initial\": initial,\n \"0002_checkpoints\": checkpoints,\n \"0003_startup_index\": startupIndex,\n \"0004_dedup\": dedup,\n \"0005_run_event_type\": runEventType,\n \"0006_consensus\": consensus\n }\n}\n\n/**\n * Creates the journal's authoritative durable schema.\n *\n * @category migrations\n * @since 0.1.0\n */\nexport const run = DatabaseMigrations.run([set])\n\n/**\n * Layer that runs journal migrations before exposing the database to journal\n * services.\n *\n * @category layers\n * @since 0.1.0\n */\nexport const layer = Layer.effectDiscard(run)\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The fencing token the journal accepts on durable appends.
3
+ *
4
+ * `OwnerId` lives here rather than with the ownership *arbitration* in
5
+ * `@smthrs/run-store` because the journal is what it fences: `emitDurable`
6
+ * takes an owner and refuses the append when the persisted fence has moved on.
7
+ * The journal therefore defines the token, and the run store (which stores it
8
+ * on runs and arbitrates who holds it) imports it.
9
+ *
10
+ * @since 0.1.0
11
+ */
12
+ import * as Schema from "effect/Schema";
13
+ /**
14
+ * A process identity scoped to a host and a unique ownership nonce.
15
+ *
16
+ * `pid` is a real operating-system process id, so the schema states that: a
17
+ * non-negative integer. A fractional, `NaN`, or negative `pid` is a caller
18
+ * bug, and the fenced methods reject it as `invalid_event` rather than
19
+ * degrading it into `fence_lost`, which would read as "someone else owns this
20
+ * run" and send the caller looking for a race that never happened.
21
+ *
22
+ * `hostId` and `nonce` stay plain strings. An empty one is a legal value that
23
+ * simply matches no persisted owner, which is exactly `fence_lost`.
24
+ *
25
+ * @since 0.1.0
26
+ * @category models
27
+ */
28
+ export declare const OwnerId: Schema.Struct<{
29
+ readonly hostId: Schema.String;
30
+ readonly pid: Schema.Int;
31
+ readonly nonce: Schema.String;
32
+ }>;
33
+ /**
34
+ * A process identity scoped to a host and a unique ownership nonce.
35
+ *
36
+ * @since 0.1.0
37
+ * @category models
38
+ */
39
+ export type OwnerId = typeof OwnerId.Type;
40
+ //# sourceMappingURL=OwnerId.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnerId.d.ts","sourceRoot":"","sources":["../../src/OwnerId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,OAAO;;;;EAIlB,CAAA;AAEF;;;;;GAKG;AACH,MAAM,MAAM,OAAO,GAAG,OAAO,OAAO,CAAC,IAAI,CAAA"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The fencing token the journal accepts on durable appends.
3
+ *
4
+ * `OwnerId` lives here rather than with the ownership *arbitration* in
5
+ * `@smthrs/run-store` because the journal is what it fences: `emitDurable`
6
+ * takes an owner and refuses the append when the persisted fence has moved on.
7
+ * The journal therefore defines the token, and the run store (which stores it
8
+ * on runs and arbitrates who holds it) imports it.
9
+ *
10
+ * @since 0.1.0
11
+ */
12
+ import * as Schema from "effect/Schema";
13
+ /**
14
+ * A process identity scoped to a host and a unique ownership nonce.
15
+ *
16
+ * `pid` is a real operating-system process id, so the schema states that: a
17
+ * non-negative integer. A fractional, `NaN`, or negative `pid` is a caller
18
+ * bug, and the fenced methods reject it as `invalid_event` rather than
19
+ * degrading it into `fence_lost`, which would read as "someone else owns this
20
+ * run" and send the caller looking for a race that never happened.
21
+ *
22
+ * `hostId` and `nonce` stay plain strings. An empty one is a legal value that
23
+ * simply matches no persisted owner, which is exactly `fence_lost`.
24
+ *
25
+ * @since 0.1.0
26
+ * @category models
27
+ */
28
+ export const OwnerId = Schema.Struct({
29
+ hostId: Schema.String,
30
+ pid: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),
31
+ nonce: Schema.String
32
+ });
33
+ //# sourceMappingURL=OwnerId.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OwnerId.js","sourceRoot":"","sources":["../../src/OwnerId.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC,MAAM;IACrB,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC;IACvD,KAAK,EAAE,MAAM,CAAC,MAAM;CACrB,CAAC,CAAA","sourcesContent":["/**\n * The fencing token the journal accepts on durable appends.\n *\n * `OwnerId` lives here rather than with the ownership *arbitration* in\n * `@smthrs/run-store` because the journal is what it fences: `emitDurable`\n * takes an owner and refuses the append when the persisted fence has moved on.\n * The journal therefore defines the token, and the run store (which stores it\n * on runs and arbitrates who holds it) imports it.\n *\n * @since 0.1.0\n */\n\nimport * as Schema from \"effect/Schema\"\n\n/**\n * A process identity scoped to a host and a unique ownership nonce.\n *\n * `pid` is a real operating-system process id, so the schema states that: a\n * non-negative integer. A fractional, `NaN`, or negative `pid` is a caller\n * bug, and the fenced methods reject it as `invalid_event` rather than\n * degrading it into `fence_lost`, which would read as \"someone else owns this\n * run\" and send the caller looking for a race that never happened.\n *\n * `hostId` and `nonce` stay plain strings. An empty one is a legal value that\n * simply matches no persisted owner, which is exactly `fence_lost`.\n *\n * @since 0.1.0\n * @category models\n */\nexport const OwnerId = Schema.Struct({\n hostId: Schema.String,\n pid: Schema.Int.check(Schema.isGreaterThanOrEqualTo(0)),\n nonce: Schema.String\n})\n\n/**\n * A process identity scoped to a host and a unique ownership nonce.\n *\n * @since 0.1.0\n * @category models\n */\nexport type OwnerId = typeof OwnerId.Type\n"]}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Reproducible journal projections.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+ import type * as Effect from "effect/Effect";
7
+ import type { Entry } from "./JournalEvent.ts";
8
+ /**
9
+ * An effectful fold over committed journal entries.
10
+ *
11
+ * Projections have no independent durable state. Replaying the same entries
12
+ * through the same reducer must reproduce the same result.
13
+ *
14
+ * @category models
15
+ * @since 0.1.0
16
+ */
17
+ export interface Projection<S, E = never, R = never> {
18
+ readonly name: string;
19
+ readonly initial: S;
20
+ readonly reduce: (state: S, entry: Entry) => Effect.Effect<S, E, R>;
21
+ }
22
+ /**
23
+ * Constructs a reproducible journal projection.
24
+ *
25
+ * @category constructors
26
+ * @since 0.1.0
27
+ */
28
+ export declare const make: <S, E = never, R = never>(projection: Projection<S, E, R>) => Projection<S, E, R>;
29
+ //# sourceMappingURL=Projection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Projection.d.ts","sourceRoot":"","sources":["../../src/Projection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE9C;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK;IACjD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IACnB,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CACpE;AAED;;;;;GAKG;AACH,eAAO,MAAM,IAAI,GAAI,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,KAAK,EAAE,YAAY,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAe,CAAA"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Reproducible journal projections.
3
+ *
4
+ * @since 0.1.0
5
+ */
6
+ /**
7
+ * Constructs a reproducible journal projection.
8
+ *
9
+ * @category constructors
10
+ * @since 0.1.0
11
+ */
12
+ export const make = (projection) => projection;
13
+ //# sourceMappingURL=Projection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Projection.js","sourceRoot":"","sources":["../../src/Projection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAoBH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,IAAI,GAAG,CAA0B,UAA+B,EAAuB,EAAE,CAAC,UAAU,CAAA","sourcesContent":["/**\n * Reproducible journal projections.\n *\n * @since 0.1.0\n */\n\nimport type * as Effect from \"effect/Effect\"\nimport type { Entry } from \"./JournalEvent.ts\"\n\n/**\n * An effectful fold over committed journal entries.\n *\n * Projections have no independent durable state. Replaying the same entries\n * through the same reducer must reproduce the same result.\n *\n * @category models\n * @since 0.1.0\n */\nexport interface Projection<S, E = never, R = never> {\n readonly name: string\n readonly initial: S\n readonly reduce: (state: S, entry: Entry) => Effect.Effect<S, E, R>\n}\n\n/**\n * Constructs a reproducible journal projection.\n *\n * @category constructors\n * @since 0.1.0\n */\nexport const make = <S, E = never, R = never>(projection: Projection<S, E, R>): Projection<S, E, R> => projection\n"]}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * The redacting logger: the journal's redaction rules applied to log output.
3
+ *
4
+ * The journal redacts on the write path, so a credential a cell logs or
5
+ * returns never reaches a committed row (`./Redaction.ts`). The operator's
6
+ * terminal was the other place the same credential surfaces: every built-in
7
+ * Effect logger renders through the fiber's `Console`, so an action that hands
8
+ * a token to `Effect.logInfo` wrote it to stderr in full and it reached
9
+ * whatever collected that stream.
10
+ *
11
+ * This module closes that half with the SAME rules rather than a second rule
12
+ * set. {@link wrap} does not re-implement redaction and does not re-format a
13
+ * log line. It redacts the log event itself — the message, the cause, and the
14
+ * log annotations — before the wrapped logger is handed it, and it hands that
15
+ * logger a view of the fiber whose `Console` is a redacting console, so
16
+ * whatever the logger renders for itself — a pretty line, a JSON document —
17
+ * passes through `Redaction.redact` on its way to the stream as well.
18
+ *
19
+ * Both halves carry load. Most built-in loggers write through the fiber's
20
+ * `Console`, which is what covers the pretty line, the `--json` document, and
21
+ * the `.flows/logs/<runId>.log` stream. But a logger is free to read the event
22
+ * instead of rendering it, and one in Effect's own default logger set does:
23
+ * `Logger.tracerLogger` publishes the message as a span event name and
24
+ * `Cause.pretty` of the cause as the span's `effect.cause` attribute, and
25
+ * never reads `Console` at all. Redacting only the console would hide a
26
+ * credential on stderr and export it in clear to whatever OTLP collector is
27
+ * configured.
28
+ *
29
+ * Cost is bounded by the rules themselves: every alternation inside a
30
+ * repetition in `Redaction.diagnosticRules` starts its branches with disjoint
31
+ * characters, so each rule is linear in the length of the line and no input
32
+ * backtracks catastrophically.
33
+ *
34
+ * One deliberate difference from the journal write path. `Redaction.redact`
35
+ * rebuilds an object from its own enumerable entries, which is right for a row
36
+ * that is about to be JSON-encoded and wrong for a terminal: an `Error` keeps
37
+ * `message` and `stack` on non-enumerable properties, so rebuilding one prints
38
+ * `{}` where the operator expected a failure. An `Error` is rebuilt as a plain
39
+ * `Error` instead, carrying its name, message, stack and own members with the
40
+ * rules applied. Its class is NOT preserved. A copy built on the original's
41
+ * prototype inherits everything the prototype defines, an own-key walk sees
42
+ * none of it, and each of `name`, `cause`, `toJSON`, `Symbol.toStringTag` and
43
+ * `nodejs.util.inspect.custom` carried a credential out that way.
44
+ *
45
+ * @since 0.1.0
46
+ */
47
+ import * as Console from "effect/Console";
48
+ import * as Layer from "effect/Layer";
49
+ import * as Logger from "effect/Logger";
50
+ import * as Redaction from "./Redaction.ts";
51
+ /**
52
+ * Marks a logger this module already wrapped.
53
+ *
54
+ * Both the CLI and the durable runtime install {@link layer}, and a detached
55
+ * `smithers run` is both at once. Wrapping twice would be correct but pay the
56
+ * rules twice per line, so a wrapped logger is returned unchanged.
57
+ *
58
+ * @since 0.1.0
59
+ * @category type ids
60
+ */
61
+ export declare const TypeId: unique symbol;
62
+ /**
63
+ * Whether {@link wrap} already wrapped this logger.
64
+ *
65
+ * @since 0.1.0
66
+ * @category predicates
67
+ */
68
+ export declare const isRedacted: (logger: Logger.Logger<any, any>) => boolean;
69
+ /**
70
+ * Redacts one value on its way out of the logger.
71
+ *
72
+ * An `Error` is rebuilt as a plain `Error` whose name, message, stack and own
73
+ * members are redacted, so a renderer that special-cases an `Error` still gets
74
+ * one. Everything else goes through the journal's own rules, which rebuild a
75
+ * value from its plain data: a `Date`, a `Map`, a class instance or a host
76
+ * object therefore reaches the operator in that plain form rather than as
77
+ * itself.
78
+ *
79
+ * That collapse is deliberate, and it now covers the `Error` too. An earlier
80
+ * version rebuilt each value on its own prototype to keep the rendering
81
+ * faithful. Three rounds of review found three ways that could kill the run it
82
+ * was logging, because a host class keeps state a property walk cannot see and
83
+ * a copy of one throws the moment a brand check reads it, and four more found
84
+ * that the prototype an `Error` copy kept was itself the leak: everything it
85
+ * defines is read by a renderer and seen by no own-key walk. A log line is not
86
+ * worth a run, and the rendering it buys is cosmetic.
87
+ *
88
+ * @since 0.1.0
89
+ * @category redaction
90
+ */
91
+ export declare const redactArgument: (value: unknown, redactor: Redaction.Redactor) => unknown;
92
+ /**
93
+ * A console that runs every value it is handed through `redactor` and then
94
+ * delegates to `target`.
95
+ *
96
+ * @since 0.1.0
97
+ * @category constructors
98
+ */
99
+ export declare const redactingConsole: (target: Console.Console, redactor: Redaction.Redactor) => Console.Console;
100
+ /**
101
+ * Returns `logger` with the journal's redaction rules over everything it
102
+ * renders. A logger this module already wrapped is returned unchanged.
103
+ *
104
+ * @since 0.1.0
105
+ * @category combinators
106
+ */
107
+ export declare const wrap: <Message, Output>(logger: Logger.Logger<Message, Output>, options?: Redaction.Options) => Logger.Logger<Message, Output>;
108
+ /**
109
+ * Replaces the active logger set with redacting wrappers of the same loggers.
110
+ *
111
+ * It composes over whatever loggers are already installed rather than
112
+ * choosing one, so an operator keeps the FORMAT they had, meaning their own
113
+ * logger and its layout, though a value inside a line is rendered from its
114
+ * redacted plain data rather than as its own class, and a host that
115
+ * installed its own logger keeps it too.
116
+ *
117
+ * @since 0.1.0
118
+ * @category layers
119
+ */
120
+ export declare const layer: (options?: Redaction.Options) => Layer.Layer<never>;
121
+ //# sourceMappingURL=RedactedLogger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RedactedLogger.d.ts","sourceRoot":"","sources":["../../src/RedactedLogger.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAGH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAIzC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AAEvC,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;;;;;;;;GASG;AACH,eAAO,MAAM,MAAM,EAAE,OAAO,MAAqD,CAAA;AAEjF;;;;;GAKG;AACH,eAAO,MAAM,UAAU,GAAI,QAAQ,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,KAAG,OAA2B,CAAA;AA2LxF;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,cAAc,GAAI,OAAO,OAAO,EAAE,UAAU,SAAS,CAAC,QAAQ,KAAG,OAW7E,CAAA;AAKD;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,GAAI,QAAQ,OAAO,CAAC,OAAO,EAAE,UAAU,SAAS,CAAC,QAAQ,KAAG,OAAO,CAAC,OA0BhG,CAAA;AAkFD;;;;;;GAMG;AACH,eAAO,MAAM,IAAI,GAAI,OAAO,EAAE,MAAM,EAClC,QAAQ,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,EACtC,UAAU,SAAS,CAAC,OAAO,KAC1B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAiC/B,CAAA;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,KAAK,GAAI,UAAU,SAAS,CAAC,OAAO,KAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAUlE,CAAA"}