@openclaw/crabline 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (214) hide show
  1. package/README.md +137 -23
  2. package/dist/src/bin/crabline.js +3 -1
  3. package/dist/src/bin/crabline.js.map +1 -1
  4. package/dist/src/cli/program.d.ts +5 -1
  5. package/dist/src/cli/program.js +281 -52
  6. package/dist/src/cli/program.js.map +1 -1
  7. package/dist/src/config/load.js +39 -3
  8. package/dist/src/config/load.js.map +1 -1
  9. package/dist/src/config/schema.d.ts +20 -0
  10. package/dist/src/config/schema.js +163 -35
  11. package/dist/src/config/schema.js.map +1 -1
  12. package/dist/src/core/errors.d.ts +1 -0
  13. package/dist/src/core/errors.js +6 -3
  14. package/dist/src/core/errors.js.map +1 -1
  15. package/dist/src/core/http-path.d.ts +1 -0
  16. package/dist/src/core/http-path.js +14 -0
  17. package/dist/src/core/http-path.js.map +1 -0
  18. package/dist/src/core/matcher.d.ts +3 -1
  19. package/dist/src/core/matcher.js +58 -2
  20. package/dist/src/core/matcher.js.map +1 -1
  21. package/dist/src/core/nonces.d.ts +2 -0
  22. package/dist/src/core/nonces.js +11 -1
  23. package/dist/src/core/nonces.js.map +1 -1
  24. package/dist/src/core/reporters.d.ts +5 -0
  25. package/dist/src/core/reporters.js +26 -2
  26. package/dist/src/core/reporters.js.map +1 -1
  27. package/dist/src/core/run.d.ts +3 -1
  28. package/dist/src/core/run.js +178 -66
  29. package/dist/src/core/run.js.map +1 -1
  30. package/dist/src/index.d.ts +12 -10
  31. package/dist/src/index.js +6 -5
  32. package/dist/src/index.js.map +1 -1
  33. package/dist/src/matrix-ids.d.ts +5 -0
  34. package/dist/src/matrix-ids.js +83 -0
  35. package/dist/src/matrix-ids.js.map +1 -0
  36. package/dist/src/openclaw/artifact-generation.d.ts +7 -6
  37. package/dist/src/openclaw/artifact-generation.js +385 -41
  38. package/dist/src/openclaw/artifact-generation.js.map +1 -1
  39. package/dist/src/openclaw/bridges/discord.d.ts +1 -0
  40. package/dist/src/openclaw/bridges/discord.js +149 -0
  41. package/dist/src/openclaw/bridges/discord.js.map +1 -0
  42. package/dist/src/openclaw/bridges/matrix.js +22 -5
  43. package/dist/src/openclaw/bridges/matrix.js.map +1 -1
  44. package/dist/src/openclaw/bridges/mattermost.js +14 -9
  45. package/dist/src/openclaw/bridges/mattermost.js.map +1 -1
  46. package/dist/src/openclaw/bridges/probe-response.d.ts +1 -0
  47. package/dist/src/openclaw/bridges/probe-response.js +5 -0
  48. package/dist/src/openclaw/bridges/probe-response.js.map +1 -0
  49. package/dist/src/openclaw/bridges/signal.js +16 -7
  50. package/dist/src/openclaw/bridges/signal.js.map +1 -1
  51. package/dist/src/openclaw/bridges/slack.js +117 -24
  52. package/dist/src/openclaw/bridges/slack.js.map +1 -1
  53. package/dist/src/openclaw/bridges/telegram.js +46 -20
  54. package/dist/src/openclaw/bridges/telegram.js.map +1 -1
  55. package/dist/src/openclaw/bridges/whatsapp.js +33 -17
  56. package/dist/src/openclaw/bridges/whatsapp.js.map +1 -1
  57. package/dist/src/openclaw/bridges/zalo.js +9 -4
  58. package/dist/src/openclaw/bridges/zalo.js.map +1 -1
  59. package/dist/src/openclaw/outbound-contract.js +3 -0
  60. package/dist/src/openclaw/outbound-contract.js.map +1 -1
  61. package/dist/src/openclaw/private-file.d.ts +38 -3
  62. package/dist/src/openclaw/private-file.js +2008 -87
  63. package/dist/src/openclaw/private-file.js.map +1 -1
  64. package/dist/src/openclaw/{smoke-lock.d.ts → provider-readiness-lock.d.ts} +14 -5
  65. package/dist/src/openclaw/provider-readiness-lock.js +1320 -0
  66. package/dist/src/openclaw/provider-readiness-lock.js.map +1 -0
  67. package/dist/src/openclaw/shared.d.ts +10 -17
  68. package/dist/src/openclaw/shared.js +53 -19
  69. package/dist/src/openclaw/shared.js.map +1 -1
  70. package/dist/src/openclaw.d.ts +3 -5
  71. package/dist/src/openclaw.js +245 -60
  72. package/dist/src/openclaw.js.map +1 -1
  73. package/dist/src/platform/process-owned-lock.d.ts +11 -0
  74. package/dist/src/platform/process-owned-lock.js +1698 -0
  75. package/dist/src/platform/process-owned-lock.js.map +1 -0
  76. package/dist/src/platform/recorder-directory.d.ts +1 -0
  77. package/dist/src/platform/recorder-directory.js +14 -0
  78. package/dist/src/platform/recorder-directory.js.map +1 -0
  79. package/dist/src/platform/windows-acl.d.ts +18 -0
  80. package/dist/src/platform/windows-acl.js +1367 -0
  81. package/dist/src/platform/windows-acl.js.map +1 -0
  82. package/dist/src/platform/windows-lock-root.d.ts +13 -0
  83. package/dist/src/platform/windows-lock-root.js +98 -0
  84. package/dist/src/platform/windows-lock-root.js.map +1 -0
  85. package/dist/src/providers/builtin/discord.d.ts +4 -0
  86. package/dist/src/providers/builtin/discord.js +52 -9
  87. package/dist/src/providers/builtin/discord.js.map +1 -1
  88. package/dist/src/providers/builtin/external-webhook-auth.d.ts +1 -0
  89. package/dist/src/providers/builtin/external-webhook-auth.js +38 -1
  90. package/dist/src/providers/builtin/external-webhook-auth.js.map +1 -1
  91. package/dist/src/providers/builtin/feishu.d.ts +1 -0
  92. package/dist/src/providers/builtin/feishu.js +96 -26
  93. package/dist/src/providers/builtin/feishu.js.map +1 -1
  94. package/dist/src/providers/builtin/googlechat.d.ts +1 -0
  95. package/dist/src/providers/builtin/googlechat.js +95 -26
  96. package/dist/src/providers/builtin/googlechat.js.map +1 -1
  97. package/dist/src/providers/builtin/imessage.js +60 -17
  98. package/dist/src/providers/builtin/imessage.js.map +1 -1
  99. package/dist/src/providers/builtin/loopback.js +88 -35
  100. package/dist/src/providers/builtin/loopback.js.map +1 -1
  101. package/dist/src/providers/builtin/matrix.d.ts +2 -2
  102. package/dist/src/providers/builtin/matrix.js +78 -21
  103. package/dist/src/providers/builtin/matrix.js.map +1 -1
  104. package/dist/src/providers/builtin/mattermost.d.ts +11 -7
  105. package/dist/src/providers/builtin/mattermost.js +138 -24
  106. package/dist/src/providers/builtin/mattermost.js.map +1 -1
  107. package/dist/src/providers/builtin/msteams.d.ts +1 -0
  108. package/dist/src/providers/builtin/msteams.js +118 -38
  109. package/dist/src/providers/builtin/msteams.js.map +1 -1
  110. package/dist/src/providers/builtin/native-local-mock.js +4 -4
  111. package/dist/src/providers/builtin/native-local-mock.js.map +1 -1
  112. package/dist/src/providers/builtin/script.js +1057 -146
  113. package/dist/src/providers/builtin/script.js.map +1 -1
  114. package/dist/src/providers/builtin/slack.d.ts +8 -1
  115. package/dist/src/providers/builtin/slack.js +327 -24
  116. package/dist/src/providers/builtin/slack.js.map +1 -1
  117. package/dist/src/providers/builtin/telegram.d.ts +1 -1
  118. package/dist/src/providers/builtin/telegram.js +55 -14
  119. package/dist/src/providers/builtin/telegram.js.map +1 -1
  120. package/dist/src/providers/builtin/whatsapp.d.ts +4 -3
  121. package/dist/src/providers/builtin/whatsapp.js +157 -29
  122. package/dist/src/providers/builtin/whatsapp.js.map +1 -1
  123. package/dist/src/providers/builtin/zalo.d.ts +5 -2
  124. package/dist/src/providers/builtin/zalo.js +31 -7
  125. package/dist/src/providers/builtin/zalo.js.map +1 -1
  126. package/dist/src/providers/catalog.d.ts +1 -1
  127. package/dist/src/providers/catalog.js +1 -1
  128. package/dist/src/providers/catalog.js.map +1 -1
  129. package/dist/src/providers/local-mock.d.ts +4 -0
  130. package/dist/src/providers/local-mock.js +162 -35
  131. package/dist/src/providers/local-mock.js.map +1 -1
  132. package/dist/src/providers/native-ids.d.ts +2 -0
  133. package/dist/src/providers/native-ids.js +3 -0
  134. package/dist/src/providers/native-ids.js.map +1 -1
  135. package/dist/src/providers/recorder.d.ts +14 -3
  136. package/dist/src/providers/recorder.js +521 -41
  137. package/dist/src/providers/recorder.js.map +1 -1
  138. package/dist/src/providers/registry.d.ts +1 -0
  139. package/dist/src/providers/registry.js +65 -20
  140. package/dist/src/providers/registry.js.map +1 -1
  141. package/dist/src/providers/signed-jwt.d.ts +6 -1
  142. package/dist/src/providers/signed-jwt.js +241 -50
  143. package/dist/src/providers/signed-jwt.js.map +1 -1
  144. package/dist/src/providers/slack-ids.d.ts +1 -0
  145. package/dist/src/providers/slack-ids.js +5 -0
  146. package/dist/src/providers/slack-ids.js.map +1 -1
  147. package/dist/src/providers/target-normalizers.d.ts +9 -1
  148. package/dist/src/providers/target-normalizers.js +177 -58
  149. package/dist/src/providers/target-normalizers.js.map +1 -1
  150. package/dist/src/providers/webhook-server.d.ts +3 -0
  151. package/dist/src/providers/webhook-server.js +268 -47
  152. package/dist/src/providers/webhook-server.js.map +1 -1
  153. package/dist/src/servers/discord.d.ts +40 -0
  154. package/dist/src/servers/discord.js +842 -0
  155. package/dist/src/servers/discord.js.map +1 -0
  156. package/dist/src/servers/http.d.ts +14 -2
  157. package/dist/src/servers/http.js +229 -58
  158. package/dist/src/servers/http.js.map +1 -1
  159. package/dist/src/servers/index.d.ts +10 -4
  160. package/dist/src/servers/index.js +4 -0
  161. package/dist/src/servers/index.js.map +1 -1
  162. package/dist/src/servers/matrix.d.ts +3 -0
  163. package/dist/src/servers/matrix.js +268 -110
  164. package/dist/src/servers/matrix.js.map +1 -1
  165. package/dist/src/servers/mattermost.d.ts +5 -0
  166. package/dist/src/servers/mattermost.js +389 -91
  167. package/dist/src/servers/mattermost.js.map +1 -1
  168. package/dist/src/servers/recorder.d.ts +11 -0
  169. package/dist/src/servers/recorder.js +1072 -69
  170. package/dist/src/servers/recorder.js.map +1 -1
  171. package/dist/src/servers/signal.d.ts +1 -0
  172. package/dist/src/servers/signal.js +279 -44
  173. package/dist/src/servers/signal.js.map +1 -1
  174. package/dist/src/servers/slack.d.ts +15 -0
  175. package/dist/src/servers/slack.js +270 -54
  176. package/dist/src/servers/slack.js.map +1 -1
  177. package/dist/src/servers/telegram-identity.d.ts +6 -0
  178. package/dist/src/servers/telegram-identity.js +27 -0
  179. package/dist/src/servers/telegram-identity.js.map +1 -0
  180. package/dist/src/servers/telegram.d.ts +17 -6
  181. package/dist/src/servers/telegram.js +1218 -107
  182. package/dist/src/servers/telegram.js.map +1 -1
  183. package/dist/src/servers/webhook-target.d.ts +12 -4
  184. package/dist/src/servers/webhook-target.js +226 -28
  185. package/dist/src/servers/webhook-target.js.map +1 -1
  186. package/dist/src/servers/whatsapp-baileys-websocket.d.ts +60 -1
  187. package/dist/src/servers/whatsapp-baileys-websocket.js +782 -112
  188. package/dist/src/servers/whatsapp-baileys-websocket.js.map +1 -1
  189. package/dist/src/servers/whatsapp-jid.d.ts +1 -0
  190. package/dist/src/servers/whatsapp-jid.js +9 -5
  191. package/dist/src/servers/whatsapp-jid.js.map +1 -1
  192. package/dist/src/servers/whatsapp-wire/binary-node.d.ts +1 -0
  193. package/dist/src/servers/whatsapp-wire/binary-node.js +37 -13
  194. package/dist/src/servers/whatsapp-wire/binary-node.js.map +1 -1
  195. package/dist/src/servers/whatsapp-wire/crypto.d.ts +3 -0
  196. package/dist/src/servers/whatsapp-wire/crypto.js +23 -8
  197. package/dist/src/servers/whatsapp-wire/crypto.js.map +1 -1
  198. package/dist/src/servers/whatsapp-wire/handshake.d.ts +9 -3
  199. package/dist/src/servers/whatsapp-wire/handshake.js +173 -12
  200. package/dist/src/servers/whatsapp-wire/handshake.js.map +1 -1
  201. package/dist/src/servers/whatsapp-wire/signal.js +3 -3
  202. package/dist/src/servers/whatsapp-wire/signal.js.map +1 -1
  203. package/dist/src/servers/whatsapp.d.ts +7 -1
  204. package/dist/src/servers/whatsapp.js +149 -25
  205. package/dist/src/servers/whatsapp.js.map +1 -1
  206. package/dist/src/servers/zalo.d.ts +1 -0
  207. package/dist/src/servers/zalo.js +193 -82
  208. package/dist/src/servers/zalo.js.map +1 -1
  209. package/docs/channel-setup.md +251 -64
  210. package/fixtures/examples/crabline.example.yaml +3 -2
  211. package/package.json +18 -10
  212. package/dist/src/openclaw/smoke-lock.js +0 -1004
  213. package/dist/src/openclaw/smoke-lock.js.map +0 -1
  214. package/fixtures/examples/openclaw-bridge.yaml +0 -125
@@ -1 +1 @@
1
- {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/providers/recorder.ts"],"names":[],"mappings":"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","sourcesContent":["import { lstat, mkdir, open, readFile, readlink, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { lock } from \"proper-lockfile\";\nimport type { InboundEnvelope } from \"./types.js\";\n\nexport type RecordableInboundEnvelope = InboundEnvelope & {\n recordedDirection?: \"inbound\" | \"outbound\";\n};\n\nexport type RecordedInboundEnvelope = RecordableInboundEnvelope & {\n recordedAt: string;\n};\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n };\n const timeout = setTimeout(done, ms);\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nconst pendingAppends = new Map<string, Promise<void>>();\nconst recordIdentityIndexes = new Map<string, RecordIdentityIndex>();\nconst MAX_RECORD_IDENTITY_INDEXES = 128;\nconst MAX_RECENT_RECORD_KEYS = 4096;\nconst RECORDER_BATCH_VERSION = 1;\nconst RECORDER_LOCK_STALE_MS = 30_000;\nconst RECORDER_LOCK_UPDATE_MS = 10_000;\nconst RECORDER_ROTATION_ATTEMPTS = 3;\n\nclass RecorderRotatedError extends Error {}\n\ntype IncrementalReadState = {\n caughtUp: boolean;\n continuity: Buffer;\n generation: number;\n identity:\n | {\n dev: number;\n ino: number;\n }\n | undefined;\n offset: number;\n pending: Buffer;\n};\n\ntype RecordIdentityIndex = {\n readState: IncrementalReadState;\n seen: Set<string>;\n};\n\ntype RecorderFileIdentity = {\n dev: bigint;\n ino: bigint;\n};\n\ntype RecordedInboundBatchLine = {\n events: RecordedInboundEnvelope[];\n recordType: \"crabline.recorder.batch\";\n recorderBatchVersion: typeof RECORDER_BATCH_VERSION;\n};\n\nexport type RecordedInboundCursor = {\n buffered: RecordedInboundEnvelope[];\n readState: IncrementalReadState;\n seen: Set<string>;\n};\n\nconst CONTINUITY_BYTES = 4096;\nconst MAX_INCREMENTAL_READ_BYTES = 256 * 1024;\nconst MAX_PENDING_RECORD_BYTES = 4 * 1024 * 1024;\n\nfunction createIncrementalReadState(): IncrementalReadState {\n return {\n caughtUp: true,\n continuity: Buffer.alloc(0),\n generation: 0,\n identity: undefined,\n offset: 0,\n pending: Buffer.alloc(0),\n };\n}\n\nexport function createRecordedInboundCursor(): RecordedInboundCursor {\n return {\n buffered: [],\n readState: createIncrementalReadState(),\n seen: new Set(),\n };\n}\n\nexport function cloneRecordedInboundCursor(cursor: RecordedInboundCursor): RecordedInboundCursor {\n return {\n buffered: [...cursor.buffered],\n readState: {\n caughtUp: cursor.readState.caughtUp,\n continuity: Buffer.from(cursor.readState.continuity),\n generation: cursor.readState.generation,\n identity: cursor.readState.identity ? { ...cursor.readState.identity } : undefined,\n offset: cursor.readState.offset,\n pending: Buffer.from(cursor.readState.pending),\n },\n seen: new Set(cursor.seen),\n };\n}\n\nfunction rememberRecentRecord(seen: Set<string>, event: InboundEnvelope): boolean {\n const key = JSON.stringify([\n event.provider,\n event.threadId,\n event.id,\n recordedDirectionOf(event),\n ]);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n if (seen.size > MAX_RECENT_RECORD_KEYS) {\n seen.delete(seen.values().next().value!);\n }\n return true;\n}\n\nfunction recordedDirectionOf(\n event: Pick<RecordableInboundEnvelope, \"raw\" | \"recordedDirection\">,\n): \"inbound\" | \"outbound\" {\n if (event.recordedDirection) {\n return event.recordedDirection;\n }\n return event.raw !== null &&\n typeof event.raw === \"object\" &&\n \"direction\" in event.raw &&\n event.raw.direction === \"outbound\"\n ? \"outbound\"\n : \"inbound\";\n}\n\nfunction requireNonEmptyString(value: unknown, field: keyof RecordedInboundEnvelope): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Recorded inbound envelope ${field} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction requireString(value: unknown, field: keyof RecordedInboundEnvelope): string {\n if (typeof value !== \"string\") {\n throw new Error(`Recorded inbound envelope ${field} must be a string.`);\n }\n return value;\n}\n\nfunction parseRecordedEnvelope(value: unknown): RecordedInboundEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Recorded inbound envelope must be an object.\");\n }\n const record = value as Record<string, unknown>;\n if (record.author !== \"assistant\" && record.author !== \"system\" && record.author !== \"user\") {\n throw new Error(\"Recorded inbound envelope author must be assistant, system, or user.\");\n }\n if (\n record.recordedDirection !== undefined &&\n record.recordedDirection !== \"inbound\" &&\n record.recordedDirection !== \"outbound\"\n ) {\n throw new Error(\"Recorded inbound envelope recordedDirection must be inbound or outbound.\");\n }\n return {\n author: record.author,\n id: requireNonEmptyString(record.id, \"id\"),\n provider: requireNonEmptyString(record.provider, \"provider\"),\n ...(record.raw !== undefined ? { raw: record.raw } : {}),\n recordedAt: requireNonEmptyString(record.recordedAt, \"recordedAt\"),\n ...(record.recordedDirection !== undefined\n ? { recordedDirection: record.recordedDirection }\n : {}),\n sentAt: requireNonEmptyString(record.sentAt, \"sentAt\"),\n text: requireString(record.text, \"text\"),\n threadId: requireNonEmptyString(record.threadId, \"threadId\"),\n };\n}\n\nfunction parseRecordedLine(line: string): RecordedInboundEnvelope[] {\n const parsed = JSON.parse(line) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed) &&\n \"recordType\" in parsed &&\n parsed.recordType === \"crabline.recorder.batch\" &&\n \"recorderBatchVersion\" in parsed &&\n parsed.recorderBatchVersion === RECORDER_BATCH_VERSION &&\n \"events\" in parsed &&\n Array.isArray(parsed.events)\n ) {\n return parsed.events.map(parseRecordedEnvelope);\n }\n return [parseRecordedEnvelope(parsed)];\n}\n\nfunction resetIncrementalReadState(state: IncrementalReadState): void {\n if (\n state.identity !== undefined ||\n state.offset > 0 ||\n state.pending.length > 0 ||\n state.continuity.length > 0\n ) {\n state.generation += 1;\n }\n state.caughtUp = true;\n state.continuity = Buffer.alloc(0);\n state.offset = 0;\n state.pending = Buffer.alloc(0);\n}\n\nasync function readBufferAt(\n handle: Awaited<ReturnType<typeof open>>,\n length: number,\n position: number,\n): Promise<Buffer> {\n const buffer = Buffer.alloc(length);\n let bytesRead = 0;\n\n while (bytesRead < length) {\n const result = await handle.read(buffer, bytesRead, length - bytesRead, position + bytesRead);\n if (result.bytesRead === 0) {\n break;\n }\n bytesRead += result.bytesRead;\n }\n\n return buffer.subarray(0, bytesRead);\n}\n\nfunction consumeRecordedChunk(\n state: IncrementalReadState,\n chunk: Buffer,\n): RecordedInboundEnvelope[] {\n const continuity = Buffer.concat([state.continuity, chunk]);\n state.continuity = Buffer.from(continuity.subarray(-CONTINUITY_BYTES));\n\n const raw = state.pending.length > 0 ? Buffer.concat([state.pending, chunk]) : chunk;\n const lastNewline = raw.lastIndexOf(0x0a);\n if (lastNewline < 0) {\n if (raw.length > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n state.pending = Buffer.from(raw);\n return [];\n }\n\n state.pending = Buffer.from(raw.subarray(lastNewline + 1));\n if (state.pending.length > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n\n const events: RecordedInboundEnvelope[] = [];\n for (const line of raw.subarray(0, lastNewline).toString(\"utf8\").split(\"\\n\")) {\n if (line.trim()) {\n events.push(...parseRecordedLine(line));\n }\n }\n return events;\n}\n\nasync function appendJsonLine(filePath: string, line: string): Promise<void> {\n for (let attempt = 0; ; attempt++) {\n try {\n await serializeAppend(filePath, async (publicationPath, logicalPath) => {\n await appendCommittedLine(publicationPath, logicalPath, line, true);\n });\n return;\n } catch (error) {\n if (!(error instanceof RecorderRotatedError) || attempt + 1 >= RECORDER_ROTATION_ATTEMPTS) {\n throw error;\n }\n }\n }\n}\n\nasync function readRecorderFileIdentity(\n filePath: string,\n): Promise<RecorderFileIdentity | undefined> {\n try {\n const stats = await lstat(filePath, { bigint: true });\n if (!stats.isFile()) {\n throw new Error(`Recorder path is not a regular file: ${filePath}`);\n }\n return {\n dev: stats.dev,\n ino: stats.ino,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction sameRecorderFileIdentity(\n left: RecorderFileIdentity | undefined,\n right: RecorderFileIdentity | undefined,\n): boolean {\n return left?.dev === right?.dev && left?.ino === right?.ino;\n}\n\nasync function resolveRecorderPublicationPath(filePath: string): Promise<string> {\n try {\n return await realpath(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n try {\n const stats = await lstat(filePath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(filePath);\n return await resolveRecorderPublicationPath(path.resolve(path.dirname(filePath), target));\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n return path.join(await realpath(path.dirname(filePath)), path.basename(filePath));\n}\n\nasync function prepareRecorderTailForAppend(\n handle: Awaited<ReturnType<typeof open>>,\n): Promise<boolean> {\n const stats = await handle.stat();\n if (stats.size === 0) {\n return false;\n }\n\n const finalByte = await readBufferAt(handle, 1, stats.size - 1);\n if (finalByte[0] === 0x0a) {\n return false;\n }\n\n const windowSize = Math.min(stats.size, MAX_PENDING_RECORD_BYTES + 1);\n const tailWindow = await readBufferAt(handle, windowSize, stats.size - windowSize);\n const lastNewline = tailWindow.lastIndexOf(0x0a);\n if (lastNewline < 0 && stats.size > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n\n const tailStart = stats.size - windowSize + lastNewline + 1;\n const tail = tailWindow.subarray(lastNewline + 1).toString(\"utf8\");\n try {\n JSON.parse(tail);\n await handle.writeFile(\"\\n\", \"utf8\");\n return true;\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n await handle.truncate(tailStart);\n return true;\n }\n}\n\nasync function prepareRecorderPathForAppend(\n publicationPath: string,\n logicalPath: string,\n durable: boolean,\n): Promise<RecorderFileIdentity> {\n const handle = await open(publicationPath, \"a+\");\n const identity = await handle.stat({ bigint: true });\n const recorderIdentity = { dev: identity.dev, ino: identity.ino };\n try {\n const changed = await prepareRecorderTailForAppend(handle);\n if (changed && durable) {\n await handle.sync();\n }\n } finally {\n await handle.close();\n }\n\n if (\n !sameRecorderFileIdentity(\n recorderIdentity,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated while preparing a committed line.\");\n }\n return recorderIdentity;\n}\n\nasync function appendCommittedLine(\n publicationPath: string,\n logicalPath: string,\n line: string,\n durable: boolean,\n expectedIdentity?: RecorderFileIdentity,\n): Promise<void> {\n const handle = await open(publicationPath, \"a+\");\n const identity = await handle.stat({ bigint: true });\n const recorderIdentity = { dev: identity.dev, ino: identity.ino };\n try {\n if (\n expectedIdentity !== undefined &&\n !sameRecorderFileIdentity(expectedIdentity, recorderIdentity)\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before appending a committed line.\");\n }\n await prepareRecorderTailForAppend(handle);\n await handle.writeFile(line, \"utf8\");\n if (durable) {\n await handle.sync();\n }\n } finally {\n await handle.close();\n }\n\n if (\n !sameRecorderFileIdentity(\n recorderIdentity,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated while appending a committed line.\");\n }\n}\n\nfunction recorderLockReleaseError(\n filePath: string,\n operationError: unknown,\n releaseError: unknown,\n): AggregateError {\n return new AggregateError(\n [operationError, releaseError],\n `Recorder append and lock release both failed for \"${filePath}\".`,\n { cause: operationError },\n );\n}\n\nasync function withRecorderLock<T>(filePath: string, operation: () => Promise<T>): Promise<T> {\n const release = await lock(filePath, {\n realpath: false,\n retries: {\n factor: 1,\n maxTimeout: 10,\n minTimeout: 10,\n retries: 500,\n },\n stale: RECORDER_LOCK_STALE_MS,\n update: RECORDER_LOCK_UPDATE_MS,\n });\n let operationFailed = false;\n let operationError: unknown;\n let result: T | undefined;\n try {\n result = await operation();\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n try {\n await release();\n } catch (releaseError) {\n if (operationFailed) {\n throw recorderLockReleaseError(filePath, operationError, releaseError);\n }\n throw releaseError;\n }\n if (operationFailed) {\n throw operationError;\n }\n return result as T;\n}\n\nasync function serializeAppend<T>(\n filePath: string,\n operation: (publicationPath: string, logicalPath: string) => Promise<T>,\n): Promise<T> {\n const logicalPath = path.resolve(filePath);\n const key = await resolveRecorderPublicationPath(logicalPath);\n const previous = pendingAppends.get(key) ?? Promise.resolve();\n let result: T;\n const current = previous\n .catch(() => {})\n .then(async () => {\n result = await withRecorderLock(key, async () => await operation(key, logicalPath));\n });\n pendingAppends.set(key, current);\n\n try {\n await current;\n return result!;\n } finally {\n if (pendingAppends.get(key) === current) {\n pendingAppends.delete(key);\n }\n }\n}\n\nasync function readRecordedInboundAppend(\n filePath: string,\n state: IncrementalReadState,\n): Promise<RecordedInboundEnvelope[]> {\n let handle;\n\n try {\n handle = await open(filePath, \"r\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n resetIncrementalReadState(state);\n state.identity = undefined;\n return [];\n }\n throw error;\n }\n\n try {\n const stats = await handle.stat();\n const identity = { dev: stats.dev, ino: stats.ino };\n const sameFile = state.identity?.dev === identity.dev && state.identity.ino === identity.ino;\n const rotated = state.identity !== undefined && !sameFile;\n let hasContinuity = stats.size >= state.offset;\n\n if (hasContinuity && state.offset > 0 && state.continuity.length === 0) {\n hasContinuity = sameFile;\n } else if (hasContinuity && state.continuity.length > 0) {\n const actual = await readBufferAt(\n handle,\n state.continuity.length,\n state.offset - state.continuity.length,\n );\n hasContinuity = actual.equals(state.continuity);\n }\n\n if (!hasContinuity) {\n resetIncrementalReadState(state);\n } else if (rotated) {\n state.generation += 1;\n }\n state.identity = identity;\n\n const events: RecordedInboundEnvelope[] = [];\n let position = state.offset;\n let remainingBatchBytes = MAX_INCREMENTAL_READ_BYTES;\n let reachedUnexpectedEof = false;\n while (position < stats.size && remainingBatchBytes > 0) {\n const chunk = Buffer.alloc(Math.min(64 * 1024, stats.size - position, remainingBatchBytes));\n const { bytesRead } = await handle.read(chunk, 0, chunk.length, position);\n if (bytesRead === 0) {\n reachedUnexpectedEof = true;\n break;\n }\n position += bytesRead;\n state.offset = position;\n remainingBatchBytes -= bytesRead;\n events.push(...consumeRecordedChunk(state, chunk.subarray(0, bytesRead)));\n }\n state.caughtUp = reachedUnexpectedEof || position >= stats.size;\n return events;\n } finally {\n await handle.close();\n }\n}\n\nexport async function appendRecordedInbound(\n filePath: string,\n event: RecordableInboundEnvelope,\n): Promise<RecordedInboundEnvelope> {\n await mkdir(path.dirname(filePath), { recursive: true });\n\n const recorded = {\n ...event,\n recordedAt: new Date().toISOString(),\n } satisfies RecordedInboundEnvelope;\n\n const line = `${JSON.stringify(recorded)}\\n`;\n if (Buffer.byteLength(line) > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n await appendJsonLine(filePath, line);\n return recorded;\n}\n\nexport async function appendRecordedInboundBatch(\n filePath: string,\n events: InboundEnvelope[],\n): Promise<RecordedInboundEnvelope[]> {\n if (events.length === 0) {\n return [];\n }\n await mkdir(path.dirname(filePath), { recursive: true });\n for (let attempt = 0; ; attempt++) {\n try {\n return await serializeAppend(filePath, async (publicationPath, logicalPath) => {\n const generation = await prepareRecorderPathForAppend(publicationPath, logicalPath, true);\n const seen = await syncRecordIdentityIndex(publicationPath);\n const pendingIdentities = new Set<string>();\n const recorded: RecordedInboundEnvelope[] = [];\n for (const event of events) {\n const identity = recordIdentity(event);\n if (seen.has(identity) || pendingIdentities.has(identity)) {\n continue;\n }\n pendingIdentities.add(identity);\n recorded.push({\n ...event,\n recordedAt: new Date().toISOString(),\n });\n }\n if (recorded.length > 0) {\n const batch = {\n events: recorded,\n recordType: \"crabline.recorder.batch\",\n recorderBatchVersion: RECORDER_BATCH_VERSION,\n } satisfies RecordedInboundBatchLine;\n const line = `${JSON.stringify(batch)}\\n`;\n if (Buffer.byteLength(line) > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n await appendCommittedLine(publicationPath, logicalPath, line, true, generation);\n await syncRecordIdentityIndex(publicationPath);\n } else if (\n !sameRecorderFileIdentity(\n generation,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before confirming a duplicate batch.\");\n }\n return recorded;\n });\n } catch (error) {\n if (!(error instanceof RecorderRotatedError) || attempt + 1 >= RECORDER_ROTATION_ATTEMPTS) {\n throw error;\n }\n }\n }\n}\n\nfunction recordIdentity(event: RecordableInboundEnvelope): string {\n return JSON.stringify([event.provider, event.threadId, event.id, recordedDirectionOf(event)]);\n}\n\nasync function syncRecordIdentityIndex(filePath: string): Promise<Set<string>> {\n const key = path.resolve(filePath);\n let index = recordIdentityIndexes.get(key);\n if (!index) {\n index = { readState: createIncrementalReadState(), seen: new Set() };\n recordIdentityIndexes.set(key, index);\n if (recordIdentityIndexes.size > MAX_RECORD_IDENTITY_INDEXES) {\n recordIdentityIndexes.delete(recordIdentityIndexes.keys().next().value!);\n }\n } else {\n recordIdentityIndexes.delete(key);\n recordIdentityIndexes.set(key, index);\n }\n\n let generation = index.readState.generation;\n do {\n const appended = await readRecordedInboundAppend(filePath, index.readState);\n if (index.readState.generation !== generation) {\n index.seen.clear();\n generation = index.readState.generation;\n }\n for (const event of appended) {\n rememberRecentRecord(index.seen, event);\n }\n } while (!index.readState.caughtUp);\n return index.seen;\n}\n\nexport async function readRecordedInbound(filePath: string): Promise<RecordedInboundEnvelope[]> {\n let raw = \"\";\n\n try {\n raw = await readFile(filePath, \"utf8\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const lastNewline = raw.lastIndexOf(\"\\n\");\n const completed = lastNewline >= 0 ? raw.slice(0, lastNewline) : \"\";\n const tail = raw.slice(lastNewline + 1);\n const events: RecordedInboundEnvelope[] = [];\n\n for (const line of completed.split(\"\\n\")) {\n if (line.trim()) {\n events.push(...parseRecordedLine(line));\n }\n }\n if (tail.trim()) {\n try {\n events.push(...parseRecordedLine(tail));\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n // Ignore a syntactically partial final append; completed lines remain strict.\n }\n }\n\n return events;\n}\n\nexport async function waitForRecordedInbound(params: {\n cursor?: RecordedInboundCursor | undefined;\n filePath: string;\n matches: (event: RecordedInboundEnvelope) => boolean;\n pollMs?: number;\n recordedDirection?: \"inbound\" | \"outbound\" | undefined;\n signal?: AbortSignal | undefined;\n since?: string | undefined;\n timeoutMs: number;\n}): Promise<RecordedInboundEnvelope | null> {\n const deadline = Date.now() + params.timeoutMs;\n const cursor = params.cursor ?? createRecordedInboundCursor();\n\n while (!params.signal?.aborted && Date.now() <= deadline) {\n const generation = cursor.readState.generation;\n const events =\n cursor.buffered.length > 0\n ? cursor.buffered.splice(0)\n : await readRecordedInboundAppend(params.filePath, cursor.readState);\n if (cursor.readState.generation !== generation) {\n cursor.seen.clear();\n }\n for (const [index, event] of events.entries()) {\n if (params.recordedDirection && recordedDirectionOf(event) !== params.recordedDirection) {\n continue;\n }\n // Incremental read state owns progress; this bounded window only filters appended retries.\n if (!rememberRecentRecord(cursor.seen, event)) {\n continue;\n }\n if (params.since && new Date(event.sentAt).getTime() < new Date(params.since).getTime()) {\n continue;\n }\n\n if (params.matches(event)) {\n cursor.buffered.push(...events.slice(index + 1));\n return event;\n }\n }\n if (!cursor.readState.caughtUp) {\n if (Date.now() >= deadline) {\n return null;\n }\n continue;\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n return null;\n }\n await sleep(Math.min(params.pollMs ?? 200, remainingMs), params.signal);\n }\n\n return null;\n}\n\nexport async function* watchRecordedInbound(params: {\n filePath: string;\n matches: (event: RecordedInboundEnvelope) => boolean;\n pollMs?: number;\n recordedDirection?: \"inbound\" | \"outbound\" | undefined;\n signal?: AbortSignal | undefined;\n since?: string | undefined;\n}): AsyncIterable<RecordedInboundEnvelope> {\n const state = createIncrementalReadState();\n const seen = new Set<string>();\n\n while (!params.signal?.aborted) {\n const generation = state.generation;\n const events = await readRecordedInboundAppend(params.filePath, state);\n if (state.generation !== generation) {\n seen.clear();\n }\n if (params.signal?.aborted) {\n return;\n }\n for (const event of events) {\n if (params.signal?.aborted) {\n return;\n }\n if (!rememberRecentRecord(seen, event)) {\n continue;\n }\n if (params.recordedDirection && recordedDirectionOf(event) !== params.recordedDirection) {\n continue;\n }\n if (params.since && new Date(event.sentAt).getTime() < new Date(params.since).getTime()) {\n continue;\n }\n\n if (params.matches(event)) {\n yield event;\n }\n }\n if (!state.caughtUp) {\n continue;\n }\n\n await sleep(params.pollMs ?? 250, params.signal);\n }\n}\n"]}
1
+ {"version":3,"file":"recorder.js","sourceRoot":"","sources":["../../../src/providers/recorder.ts"],"names":[],"mappings":"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","sourcesContent":["import { constants as fsConstants } from \"node:fs\";\nimport { chmod, lstat, mkdir, open, readFile, readlink, realpath } from \"node:fs/promises\";\nimport { userInfo } from \"node:os\";\nimport path from \"node:path\";\nimport { lock } from \"proper-lockfile\";\nimport { createProcessOwnedLockFileSystem } from \"../platform/process-owned-lock.js\";\nimport { isManagedRecorderDirectory } from \"../platform/recorder-directory.js\";\nimport {\n createOwnerOnlyWindowsDirectory,\n readWindowsDirectoryNamespaceSecuritySnapshot,\n readWindowsDirectorySecuritySnapshot,\n type WindowsDirectorySecuritySnapshot,\n} from \"../platform/windows-acl.js\";\nimport {\n secureCachedWindowsLockRoot,\n type WindowsLockRootIdentity,\n} from \"../platform/windows-lock-root.js\";\nimport type { InboundEnvelope } from \"./types.js\";\n\nexport type RecordableInboundEnvelope = InboundEnvelope & {\n recordedDirection?: \"inbound\" | \"outbound\";\n};\n\nexport type RecordedInboundEnvelope = RecordableInboundEnvelope & {\n recordedAt: string;\n};\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (signal?.aborted) {\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n const done = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", done);\n resolve();\n };\n const timeout = setTimeout(done, ms);\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n}\n\nconst pendingAppends = new Map<string, Promise<void>>();\nconst recordIdentityIndexes = new Map<string, RecordIdentityIndex>();\nconst securedWindowsLockRoots = new Map<string, Promise<WindowsLockRootIdentity>>();\nconst securedWindowsRecorderDirectories = new Map<string, Promise<WindowsLockRootIdentity>>();\nconst MAX_RECORD_IDENTITY_INDEXES = 128;\nconst MAX_RECENT_RECORD_KEYS = 4096;\nconst RECORDER_BATCH_VERSION = 1;\nconst RECORDER_LOCK_STALE_MS = 30_000;\nconst RECORDER_LOCK_UPDATE_MS = 10_000;\nconst RECORDER_ROTATION_ATTEMPTS = 3;\n\nclass RecorderRotatedError extends Error {}\n\nexport class ProviderRecorderCommittedError extends AggregateError {\n readonly committed = true;\n readonly indeterminate = true;\n\n constructor(filePath: string, cause: unknown, relatedErrors: unknown[] = []) {\n super(\n [cause, ...relatedErrors],\n `Provider recorder append was published for \"${filePath}\", but durability or identity confirmation failed.`,\n { cause },\n );\n this.name = \"ProviderRecorderCommittedError\";\n }\n}\n\ntype IncrementalReadState = {\n caughtUp: boolean;\n continuity: Buffer;\n generation: number;\n identity:\n | {\n dev: bigint;\n ino: bigint;\n }\n | undefined;\n offset: number;\n pending: Buffer;\n};\n\ntype RecordIdentityIndex = {\n readState: IncrementalReadState;\n seen: Set<string>;\n};\n\ntype RecorderFileIdentity = {\n dev: bigint;\n ino: bigint;\n nlink: bigint;\n};\n\ntype RecordedInboundBatchLine = {\n events: RecordedInboundEnvelope[];\n recordType: \"crabline.recorder.batch\";\n recorderBatchVersion: typeof RECORDER_BATCH_VERSION;\n};\n\nexport type RecordedInboundCursor = {\n buffered: RecordedInboundEnvelope[];\n readState: IncrementalReadState;\n seen: Set<string>;\n};\n\nconst CONTINUITY_BYTES = 4096;\nconst MAX_INCREMENTAL_READ_BYTES = 256 * 1024;\nconst MAX_PENDING_RECORD_BYTES = 4 * 1024 * 1024;\n\nfunction createIncrementalReadState(): IncrementalReadState {\n return {\n caughtUp: true,\n continuity: Buffer.alloc(0),\n generation: 0,\n identity: undefined,\n offset: 0,\n pending: Buffer.alloc(0),\n };\n}\n\nfunction snapshotIncrementalReadState(state: IncrementalReadState): IncrementalReadState {\n return {\n ...state,\n identity: state.identity ? { ...state.identity } : undefined,\n };\n}\n\nfunction restoreIncrementalReadState(\n state: IncrementalReadState,\n snapshot: IncrementalReadState,\n): void {\n state.caughtUp = snapshot.caughtUp;\n state.continuity = snapshot.continuity;\n state.generation = snapshot.generation;\n state.identity = snapshot.identity;\n state.offset = snapshot.offset;\n state.pending = snapshot.pending;\n}\n\nexport function createRecordedInboundCursor(): RecordedInboundCursor {\n return {\n buffered: [],\n readState: createIncrementalReadState(),\n seen: new Set(),\n };\n}\n\nexport function cloneRecordedInboundCursor(cursor: RecordedInboundCursor): RecordedInboundCursor {\n return {\n buffered: [...cursor.buffered],\n readState: {\n caughtUp: cursor.readState.caughtUp,\n continuity: Buffer.from(cursor.readState.continuity),\n generation: cursor.readState.generation,\n identity: cursor.readState.identity ? { ...cursor.readState.identity } : undefined,\n offset: cursor.readState.offset,\n pending: Buffer.from(cursor.readState.pending),\n },\n seen: new Set(cursor.seen),\n };\n}\n\nfunction rememberRecentRecord(seen: Set<string>, event: InboundEnvelope): boolean {\n const key = JSON.stringify([\n event.provider,\n event.threadId,\n event.id,\n recordedDirectionOf(event),\n ]);\n if (seen.has(key)) {\n return false;\n }\n seen.add(key);\n if (seen.size > MAX_RECENT_RECORD_KEYS) {\n seen.delete(seen.values().next().value!);\n }\n return true;\n}\n\nfunction recordedDirectionOf(\n event: Pick<RecordableInboundEnvelope, \"raw\" | \"recordedDirection\">,\n): \"inbound\" | \"outbound\" {\n if (event.recordedDirection) {\n return event.recordedDirection;\n }\n return event.raw !== null &&\n typeof event.raw === \"object\" &&\n \"direction\" in event.raw &&\n event.raw.direction === \"outbound\"\n ? \"outbound\"\n : \"inbound\";\n}\n\nfunction requireNonEmptyString(value: unknown, field: keyof RecordedInboundEnvelope): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`Recorded inbound envelope ${field} must be a non-empty string.`);\n }\n return value;\n}\n\nfunction requireString(value: unknown, field: keyof RecordedInboundEnvelope): string {\n if (typeof value !== \"string\") {\n throw new Error(`Recorded inbound envelope ${field} must be a string.`);\n }\n return value;\n}\n\nfunction parseRecordedEnvelope(value: unknown): RecordedInboundEnvelope {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new Error(\"Recorded inbound envelope must be an object.\");\n }\n const record = value as Record<string, unknown>;\n if (record.author !== \"assistant\" && record.author !== \"system\" && record.author !== \"user\") {\n throw new Error(\"Recorded inbound envelope author must be assistant, system, or user.\");\n }\n if (\n record.recordedDirection !== undefined &&\n record.recordedDirection !== \"inbound\" &&\n record.recordedDirection !== \"outbound\"\n ) {\n throw new Error(\"Recorded inbound envelope recordedDirection must be inbound or outbound.\");\n }\n return {\n author: record.author,\n id: requireNonEmptyString(record.id, \"id\"),\n provider: requireNonEmptyString(record.provider, \"provider\"),\n ...(record.raw !== undefined ? { raw: record.raw } : {}),\n recordedAt: requireNonEmptyString(record.recordedAt, \"recordedAt\"),\n ...(record.recordedDirection !== undefined\n ? { recordedDirection: record.recordedDirection }\n : {}),\n sentAt: requireNonEmptyString(record.sentAt, \"sentAt\"),\n text: requireString(record.text, \"text\"),\n threadId: requireNonEmptyString(record.threadId, \"threadId\"),\n };\n}\n\nfunction parseRecordedLine(line: string): RecordedInboundEnvelope[] {\n const parsed = JSON.parse(line) as unknown;\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n !Array.isArray(parsed) &&\n \"recordType\" in parsed &&\n parsed.recordType === \"crabline.recorder.batch\" &&\n \"recorderBatchVersion\" in parsed &&\n parsed.recorderBatchVersion === RECORDER_BATCH_VERSION &&\n \"events\" in parsed &&\n Array.isArray(parsed.events)\n ) {\n return parsed.events.map(parseRecordedEnvelope);\n }\n return [parseRecordedEnvelope(parsed)];\n}\n\nfunction resetIncrementalReadState(state: IncrementalReadState): void {\n if (\n state.identity !== undefined ||\n state.offset > 0 ||\n state.pending.length > 0 ||\n state.continuity.length > 0\n ) {\n state.generation += 1;\n }\n state.caughtUp = true;\n state.continuity = Buffer.alloc(0);\n state.offset = 0;\n state.pending = Buffer.alloc(0);\n}\n\nasync function readBufferAt(\n handle: Awaited<ReturnType<typeof open>>,\n length: number,\n position: number,\n): Promise<Buffer> {\n const buffer = Buffer.alloc(length);\n let bytesRead = 0;\n\n while (bytesRead < length) {\n const result = await handle.read(buffer, bytesRead, length - bytesRead, position + bytesRead);\n if (result.bytesRead === 0) {\n break;\n }\n bytesRead += result.bytesRead;\n }\n\n return buffer.subarray(0, bytesRead);\n}\n\nfunction consumeRecordedChunk(\n state: IncrementalReadState,\n chunk: Buffer,\n): RecordedInboundEnvelope[] {\n const continuity = Buffer.concat([state.continuity, chunk]);\n state.continuity = Buffer.from(continuity.subarray(-CONTINUITY_BYTES));\n\n const raw = state.pending.length > 0 ? Buffer.concat([state.pending, chunk]) : chunk;\n const lastNewline = raw.lastIndexOf(0x0a);\n if (lastNewline < 0) {\n if (raw.length > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n state.pending = Buffer.from(raw);\n return [];\n }\n\n state.pending = Buffer.from(raw.subarray(lastNewline + 1));\n if (state.pending.length > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n\n const events: RecordedInboundEnvelope[] = [];\n for (const line of raw.subarray(0, lastNewline).toString(\"utf8\").split(\"\\n\")) {\n if (line.trim()) {\n events.push(...parseRecordedLine(line));\n }\n }\n return events;\n}\n\nasync function appendJsonLine(\n filePath: string,\n line: string,\n firstCreatedDirectory?: string,\n): Promise<void> {\n for (let attempt = 0; ; attempt++) {\n try {\n await serializeAppend(\n filePath,\n async (publicationPath, logicalPath, _lockCreatedFile, lockedIdentity) => {\n await appendCommittedLine(\n publicationPath,\n logicalPath,\n line,\n true,\n lockedIdentity,\n firstCreatedDirectory,\n );\n },\n );\n return;\n } catch (error) {\n if (!(error instanceof RecorderRotatedError) || attempt + 1 >= RECORDER_ROTATION_ATTEMPTS) {\n throw error;\n }\n }\n }\n}\n\nasync function readRecorderFileIdentity(\n filePath: string,\n): Promise<RecorderFileIdentity | undefined> {\n try {\n const stats = await lstat(filePath, { bigint: true });\n if (!stats.isFile()) {\n throw new Error(`Recorder path is not a regular file: ${filePath}`);\n }\n return {\n dev: stats.dev,\n ino: stats.ino,\n nlink: stats.nlink,\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return undefined;\n }\n throw error;\n }\n}\n\nfunction sameRecorderFileIdentity(\n left: RecorderFileIdentity | undefined,\n right: RecorderFileIdentity | undefined,\n): boolean {\n return left?.dev === right?.dev && left?.ino === right?.ino;\n}\n\nfunction sameRecorderLockIdentity(\n left: RecorderFileIdentity | undefined,\n right: RecorderFileIdentity | undefined,\n): boolean {\n return sameRecorderFileIdentity(left, right) && left?.nlink === right?.nlink;\n}\n\nfunction requireRecorderHandleIdentity(stats: {\n dev: bigint;\n ino: bigint;\n isFile?: () => boolean;\n nlink: bigint;\n}): RecorderFileIdentity {\n if (stats.isFile?.() === false) {\n throw new Error(\"Recorder path is not a regular file.\");\n }\n return {\n dev: stats.dev,\n ino: stats.ino,\n nlink: stats.nlink,\n };\n}\n\nasync function resolveRecorderPublicationPath(filePath: string): Promise<string> {\n try {\n return await realpath(filePath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n\n try {\n const stats = await lstat(filePath);\n if (stats.isSymbolicLink()) {\n const target = await readlink(filePath);\n return await resolveRecorderPublicationPath(path.resolve(path.dirname(filePath), target));\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n }\n return path.join(await realpath(path.dirname(filePath)), path.basename(filePath));\n}\n\nasync function openRecorderForAppend(\n filePath: string,\n): Promise<{ created: boolean; handle: Awaited<ReturnType<typeof open>> }> {\n const createFlags =\n process.platform === \"win32\"\n ? \"wx+\"\n : fsConstants.O_RDWR |\n fsConstants.O_APPEND |\n fsConstants.O_CREAT |\n fsConstants.O_EXCL |\n fsConstants.O_NONBLOCK |\n fsConstants.O_NOFOLLOW;\n const existingFlags =\n process.platform === \"win32\"\n ? \"r+\"\n : fsConstants.O_RDWR | fsConstants.O_APPEND | fsConstants.O_NONBLOCK | fsConstants.O_NOFOLLOW;\n try {\n return {\n created: true,\n handle: await open(filePath, createFlags, 0o600),\n };\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n return {\n created: false,\n handle: await open(filePath, existingFlags, 0o600),\n };\n }\n}\n\nasync function appendRecorderData(\n handle: Awaited<ReturnType<typeof open>>,\n data: string,\n): Promise<void> {\n if (process.platform !== \"win32\") {\n await handle.writeFile(data, \"utf8\");\n return;\n }\n\n const bytes = Buffer.from(data, \"utf8\");\n const position = (await handle.stat()).size;\n let offset = 0;\n while (offset < bytes.length) {\n const { bytesWritten } = await handle.write(\n bytes,\n offset,\n bytes.length - offset,\n position + offset,\n );\n if (bytesWritten === 0) {\n throw new Error(\"Could not append recorder data.\");\n }\n offset += bytesWritten;\n }\n}\n\nasync function syncParentDirectory(filePath: string): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n const directory = await open(path.dirname(filePath), \"r\");\n try {\n await directory.sync();\n } finally {\n await directory.close();\n }\n}\n\nasync function syncRecorderPathAncestry(\n filePath: string,\n firstCreatedDirectory?: string,\n): Promise<void> {\n if (process.platform === \"win32\") {\n return;\n }\n const resolvedFilePath = path.resolve(filePath);\n let currentPath = resolvedFilePath;\n const syncThroughPath =\n firstCreatedDirectory === undefined ? undefined : path.resolve(firstCreatedDirectory);\n for (;;) {\n const directoryPath = path.dirname(currentPath);\n const mandatory = syncThroughPath !== undefined || currentPath === resolvedFilePath;\n try {\n await syncParentDirectory(currentPath);\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (!mandatory && (code === \"EACCES\" || code === \"EPERM\")) {\n return;\n }\n throw error;\n }\n if (syncThroughPath === undefined) {\n return;\n }\n if (currentPath === syncThroughPath) {\n return;\n }\n if (path.dirname(directoryPath) === directoryPath) {\n return;\n }\n currentPath = directoryPath;\n }\n}\n\nasync function prepareRecorderTailForAppend(\n handle: Awaited<ReturnType<typeof open>>,\n): Promise<boolean> {\n const stats = await handle.stat();\n if (stats.size === 0) {\n return false;\n }\n\n const finalByte = await readBufferAt(handle, 1, stats.size - 1);\n if (finalByte[0] === 0x0a) {\n return false;\n }\n\n const windowSize = Math.min(stats.size, MAX_PENDING_RECORD_BYTES + 1);\n const tailWindow = await readBufferAt(handle, windowSize, stats.size - windowSize);\n const lastNewline = tailWindow.lastIndexOf(0x0a);\n if (lastNewline < 0 && stats.size > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n\n const tailStart = stats.size - windowSize + lastNewline + 1;\n const tail = tailWindow.subarray(lastNewline + 1).toString(\"utf8\");\n try {\n parseRecordedLine(tail);\n await appendRecorderData(handle, \"\\n\");\n return true;\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n await handle.truncate(tailStart);\n return true;\n }\n}\n\nasync function prepareRecorderPathForAppend(\n publicationPath: string,\n logicalPath: string,\n durable: boolean,\n expectedIdentity?: RecorderFileIdentity,\n): Promise<{ created: boolean; identity: RecorderFileIdentity }> {\n const opened = await openRecorderForAppend(publicationPath);\n const { handle } = opened;\n const recorderIdentity = requireRecorderHandleIdentity(await handle.stat({ bigint: true }));\n try {\n if (\n expectedIdentity !== undefined &&\n !sameRecorderFileIdentity(expectedIdentity, recorderIdentity)\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before preparing a committed line.\");\n }\n const changed = await prepareRecorderTailForAppend(handle);\n if (changed && durable) {\n await handle.sync();\n }\n } finally {\n await handle.close();\n }\n\n if (\n !sameRecorderFileIdentity(\n recorderIdentity,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated while preparing a committed line.\");\n }\n return { created: opened.created, identity: recorderIdentity };\n}\n\nfunction providerRecorderCloseError(\n filePath: string,\n operationError: unknown,\n closeError: unknown,\n): AggregateError {\n return new AggregateError(\n [operationError, closeError],\n `Provider recorder operation and file close both failed for \"${filePath}\".`,\n { cause: closeError },\n );\n}\n\nasync function appendCommittedLine(\n publicationPath: string,\n logicalPath: string,\n line: string,\n durable: boolean,\n expectedIdentity?: RecorderFileIdentity,\n firstCreatedDirectory?: string,\n): Promise<void> {\n const opened = await openRecorderForAppend(publicationPath);\n const { handle } = opened;\n const recorderIdentity = requireRecorderHandleIdentity(await handle.stat({ bigint: true }));\n let published = false;\n let operationError: unknown;\n try {\n if (\n expectedIdentity !== undefined &&\n !sameRecorderFileIdentity(expectedIdentity, recorderIdentity)\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before appending a committed line.\");\n }\n await prepareRecorderTailForAppend(handle);\n published = true;\n await appendRecorderData(handle, line);\n if (durable) {\n await handle.sync();\n }\n if (durable) {\n const firstCreatedPath =\n firstCreatedDirectory ?? (opened.created ? publicationPath : undefined);\n await syncRecorderPathAncestry(publicationPath, firstCreatedPath);\n }\n } catch (error) {\n operationError = published ? new ProviderRecorderCommittedError(logicalPath, error) : error;\n }\n try {\n await handle.close();\n } catch (closeError) {\n if (operationError !== undefined) {\n if (published) {\n throw new ProviderRecorderCommittedError(logicalPath, operationError, [closeError]);\n }\n throw providerRecorderCloseError(logicalPath, operationError, closeError);\n }\n throw published ? new ProviderRecorderCommittedError(logicalPath, closeError) : closeError;\n }\n if (operationError !== undefined) {\n throw operationError;\n }\n\n let publishedIdentity: RecorderFileIdentity | undefined;\n try {\n publishedIdentity = await readRecorderFileIdentity(\n await resolveRecorderPublicationPath(logicalPath),\n );\n } catch (error) {\n throw new ProviderRecorderCommittedError(logicalPath, error);\n }\n if (!sameRecorderFileIdentity(recorderIdentity, publishedIdentity)) {\n throw new RecorderRotatedError(\"Recorder rotated while appending a committed line.\");\n }\n}\n\nfunction recorderLockReleaseError(\n filePath: string,\n operationError: unknown,\n releaseErrors: unknown[],\n): AggregateError {\n return new AggregateError(\n [operationError, ...releaseErrors],\n `Recorder append and lock release both failed for \"${filePath}\".`,\n { cause: operationError },\n );\n}\n\nfunction recorderErrorDetail(error: unknown): string {\n if (error instanceof AggregateError) {\n return error.errors.map(recorderErrorDetail).join(\"; \");\n }\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction reportRecorderLockReleaseFailure(filePath: string, releaseError: unknown): void {\n const detail = recorderErrorDetail(releaseError);\n try {\n process.emitWarning(\n `Provider recorder append committed but lock cleanup failed for \"${filePath}\": ${detail}`,\n {\n code: \"CRABLINE_RECORDER_LOCK_CLEANUP\",\n type: \"ProviderRecorderWarning\",\n },\n );\n } catch {\n // Cleanup reporting must not change the result of a committed append.\n }\n}\n\nasync function verifyProviderRecorderLockAncestry(\n directory: string,\n currentUserId: number,\n): Promise<void> {\n let currentPath = path.resolve(directory);\n for (;;) {\n const current = await lstat(currentPath, { bigint: true });\n const ownerIsTrusted = current.uid === BigInt(currentUserId) || current.uid === 0n;\n if (current.isSymbolicLink()) {\n if (!ownerIsTrusted) {\n throw new Error(\"Provider recorder lock directory parent namespace is not trusted.\");\n }\n } else {\n const peerWritable = (current.mode & 0o022n) !== 0n;\n const sticky = (current.mode & 0o1000n) !== 0n;\n if (!current.isDirectory() || !ownerIsTrusted || (peerWritable && !sticky)) {\n throw new Error(\"Provider recorder lock directory parent namespace is not trusted.\");\n }\n }\n const parent = path.dirname(currentPath);\n if (parent === currentPath) {\n return;\n }\n currentPath = parent;\n }\n}\n\nasync function prepareProviderRecorderLockRoot(\n root: string,\n currentUserId: number,\n): Promise<string> {\n let existingPath = path.resolve(root);\n const missingComponents: string[] = [];\n for (;;) {\n try {\n await lstat(existingPath);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n const parent = path.dirname(existingPath);\n if (parent === existingPath) {\n throw error;\n }\n missingComponents.unshift(path.basename(existingPath));\n existingPath = parent;\n }\n }\n await verifyProviderRecorderLockAncestry(existingPath, currentUserId);\n let canonicalPath = await realpath(existingPath);\n if (canonicalPath !== existingPath) {\n await verifyProviderRecorderLockAncestry(canonicalPath, currentUserId);\n }\n for (const component of missingComponents) {\n canonicalPath = path.join(canonicalPath, component);\n try {\n await mkdir(canonicalPath, { mode: 0o700 });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"EEXIST\") {\n throw error;\n }\n }\n const identity = await lstat(canonicalPath, { bigint: true });\n if (\n !identity.isDirectory() ||\n identity.isSymbolicLink() ||\n identity.uid !== BigInt(currentUserId)\n ) {\n throw new Error(\"Provider recorder lock directory is not privately owned.\");\n }\n await chmod(canonicalPath, 0o700);\n }\n return canonicalPath;\n}\n\nexport async function secureProviderRecorderLockRoot(\n root: string,\n currentUserId: number | undefined,\n options: {\n platform?: NodeJS.Platform;\n createWindowsDirectory?: (directoryPath: string) => Promise<void>;\n readWindowsDirectorySecuritySnapshot?: (\n directoryPath: string,\n ) => Promise<WindowsDirectorySecuritySnapshot>;\n } = {},\n): Promise<string> {\n if ((options.platform ?? process.platform) === \"win32\") {\n const cacheKey = path.win32.normalize(path.resolve(root)).toLowerCase();\n return secureCachedWindowsLockRoot({\n cache: securedWindowsLockRoots,\n cacheKey,\n createDirectory: () =>\n (options.createWindowsDirectory ?? createOwnerOnlyWindowsDirectory)(root),\n errorPrefix: \"Provider recorder lock directory\",\n readSecuritySnapshot: () =>\n (options.readWindowsDirectorySecuritySnapshot ?? readWindowsDirectorySecuritySnapshot)(\n root,\n ),\n root,\n });\n }\n\n if (currentUserId === undefined) {\n throw new Error(\"Provider recorder identity locking requires a current user id.\");\n }\n\n const canonicalRoot = await prepareProviderRecorderLockRoot(root, currentUserId);\n\n const handle = await open(\n canonicalRoot,\n fsConstants.O_RDONLY | fsConstants.O_DIRECTORY | fsConstants.O_NOFOLLOW,\n );\n try {\n const identity = await handle.stat({ bigint: true });\n const current = await lstat(canonicalRoot, { bigint: true });\n if (\n !identity.isDirectory() ||\n !current.isDirectory() ||\n identity.dev !== current.dev ||\n identity.ino !== current.ino ||\n identity.uid !== BigInt(currentUserId) ||\n current.uid !== BigInt(currentUserId)\n ) {\n throw new Error(\"Provider recorder lock directory is not privately owned.\");\n }\n if ((identity.mode & 0o777n) !== 0o700n) {\n await handle.chmod(0o700);\n const secured = await handle.stat({ bigint: true });\n if ((secured.mode & 0o777n) !== 0o700n) {\n throw new Error(\"Provider recorder lock directory permissions are not private.\");\n }\n }\n } finally {\n await handle.close();\n }\n return canonicalRoot;\n}\n\nasync function secureProviderRecorderWindowsDirectory(root: string): Promise<string> {\n const cacheKey = path.win32.normalize(path.resolve(root)).toLowerCase();\n return secureCachedWindowsLockRoot({\n cache: securedWindowsRecorderDirectories,\n cacheKey,\n createDirectory: async () => {\n try {\n const identity = await lstat(root);\n if (!identity.isDirectory() || identity.isSymbolicLink()) {\n throw new Error(\"Provider recorder Windows directory is not a private directory.\");\n }\n if (isManagedRecorderDirectory(root)) {\n await createOwnerOnlyWindowsDirectory(root);\n }\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") {\n throw error;\n }\n await createOwnerOnlyWindowsDirectory(root);\n }\n },\n errorPrefix: \"Provider recorder Windows directory\",\n readSecuritySnapshot: () => readWindowsDirectoryNamespaceSecuritySnapshot(root),\n root,\n });\n}\n\nasync function prepareRecorderDirectory(filePath: string): Promise<string | undefined> {\n const directory = path.dirname(filePath);\n if (process.platform === \"win32\") {\n await secureProviderRecorderWindowsDirectory(directory);\n return undefined;\n }\n const createdDirectory = await mkdir(directory, { recursive: true });\n return createdDirectory === undefined ? undefined : await realpath(createdDirectory);\n}\n\nfunction recorderLockRootUnavailable(error: unknown): boolean {\n const code = (error as NodeJS.ErrnoException).code;\n return (\n code === \"EACCES\" ||\n code === \"EDQUOT\" ||\n code === \"ENOSPC\" ||\n code === \"EPERM\" ||\n code === \"EROFS\"\n );\n}\n\nfunction adjacentRecorderLockRoot(filePath: string, currentUserId: number | undefined): string {\n return path.join(\n path.dirname(filePath),\n currentUserId === undefined\n ? \".crabline-provider-recorder-locks\"\n : `.crabline-provider-recorder-locks-${currentUserId}`,\n );\n}\n\nfunction recorderIdentityLockPath(root: string, identity: RecorderFileIdentity): string {\n return path.join(root, `recorder-${identity.dev}-${identity.ino}`);\n}\n\nasync function recorderIdentityLockTargets(\n filePath: string,\n identity: RecorderFileIdentity,\n): Promise<{\n fallbackRoot?: string;\n preferred: string;\n userId: number | undefined;\n}> {\n const currentUserId = process.platform === \"win32\" ? undefined : process.geteuid?.();\n let sharedRoot: string | undefined;\n try {\n const account = userInfo();\n sharedRoot =\n process.platform === \"win32\"\n ? path.join(account.homedir, \"AppData\", \"Local\", \"Crabline\", \"locks\", \"provider-recorder\")\n : path.join(account.homedir, \".cache\", \"crabline\", \"locks\", \"provider-recorder\");\n } catch {\n // Arbitrary container UIDs may not have an OS account entry.\n }\n if (sharedRoot) {\n try {\n return {\n ...(identity.nlink === 1n\n ? { fallbackRoot: adjacentRecorderLockRoot(filePath, currentUserId) }\n : {}),\n preferred: recorderIdentityLockPath(\n await secureProviderRecorderLockRoot(sharedRoot, currentUserId),\n identity,\n ),\n userId: currentUserId,\n };\n } catch (error) {\n if (!recorderLockRootUnavailable(error)) {\n throw error;\n }\n }\n }\n\n if (identity.nlink > 1n) {\n throw new Error(\n \"Provider recorder hardlinks require a writable shared per-user lock directory.\",\n );\n }\n const adjacentRoot = await secureProviderRecorderLockRoot(\n adjacentRecorderLockRoot(filePath, currentUserId),\n currentUserId,\n );\n return {\n preferred: recorderIdentityLockPath(adjacentRoot, identity),\n userId: currentUserId,\n };\n}\n\nasync function acquireRecorderIdentityLock(\n filePath: string,\n identity: RecorderFileIdentity,\n): Promise<() => Promise<void>> {\n const targets = await recorderIdentityLockTargets(filePath, identity);\n try {\n return await acquireRecorderLock(targets.preferred);\n } catch (error) {\n if (!targets.fallbackRoot || !recorderLockRootUnavailable(error)) {\n throw error;\n }\n const fallbackRoot = await secureProviderRecorderLockRoot(targets.fallbackRoot, targets.userId);\n return await acquireRecorderLock(recorderIdentityLockPath(fallbackRoot, identity));\n }\n}\n\nasync function acquireRecorderLock(filePath: string): Promise<() => Promise<void>> {\n return await lock(filePath, {\n fs: createProcessOwnedLockFileSystem(),\n realpath: false,\n retries: {\n factor: 1,\n maxTimeout: 10,\n minTimeout: 10,\n retries: 500,\n },\n stale: RECORDER_LOCK_STALE_MS,\n update: RECORDER_LOCK_UPDATE_MS,\n });\n}\n\nasync function ensureRecorderExistsForLock(filePath: string): Promise<boolean> {\n if (await readRecorderFileIdentity(filePath)) {\n return false;\n }\n let handle: Awaited<ReturnType<typeof open>>;\n try {\n handle = await open(filePath, \"ax\", 0o600);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"EEXIST\") {\n return false;\n }\n throw error;\n }\n await handle.close();\n return true;\n}\n\nasync function releaseRecorderLocks(releases: Array<() => Promise<void>>): Promise<unknown[]> {\n const errors: unknown[] = [];\n for (const release of releases.reverse()) {\n try {\n await release();\n } catch (error) {\n errors.push(error);\n }\n }\n return errors;\n}\n\nasync function withRecorderLock<T>(\n filePath: string,\n operation: (lockCreatedFile: boolean, lockedIdentity: RecorderFileIdentity) => Promise<T>,\n): Promise<T> {\n const releases: Array<() => Promise<void>> = [];\n let lockCreatedFile = false;\n let lockedIdentity: RecorderFileIdentity | undefined;\n try {\n releases.push(await acquireRecorderLock(filePath));\n for (let attempt = 0; attempt < RECORDER_ROTATION_ATTEMPTS; attempt += 1) {\n lockCreatedFile = await ensureRecorderExistsForLock(filePath);\n const identity = await readRecorderFileIdentity(filePath);\n if (!identity) {\n continue;\n }\n const releaseIdentityLock = await acquireRecorderIdentityLock(filePath, identity);\n releases.push(releaseIdentityLock);\n const currentIdentity = await readRecorderFileIdentity(filePath);\n if (sameRecorderLockIdentity(identity, currentIdentity)) {\n lockedIdentity = identity;\n break;\n }\n const registeredIdentityRelease = releases.pop();\n const releaseErrors = await releaseRecorderLocks(\n registeredIdentityRelease ? [registeredIdentityRelease] : [],\n );\n if (releaseErrors.length > 0) {\n throw recorderLockReleaseError(\n filePath,\n new RecorderRotatedError(\"Recorder rotated while acquiring its identity lock.\"),\n releaseErrors,\n );\n }\n if (attempt + 1 >= RECORDER_ROTATION_ATTEMPTS) {\n throw new RecorderRotatedError(\"Recorder kept rotating while acquiring its identity lock.\");\n }\n }\n if (!lockedIdentity) {\n throw new RecorderRotatedError(\"Recorder disappeared while acquiring its identity lock.\");\n }\n } catch (error) {\n const releaseErrors = await releaseRecorderLocks(releases);\n if (releaseErrors.length > 0) {\n throw recorderLockReleaseError(filePath, error, releaseErrors);\n }\n throw error;\n }\n\n let operationFailed = false;\n let operationError: unknown;\n let result: T | undefined;\n try {\n result = await operation(lockCreatedFile, lockedIdentity);\n } catch (error) {\n operationFailed = true;\n operationError = error;\n }\n const releaseErrors = await releaseRecorderLocks(releases);\n if (operationFailed) {\n if (releaseErrors.length > 0) {\n throw recorderLockReleaseError(filePath, operationError, releaseErrors);\n }\n throw operationError;\n }\n if (releaseErrors.length > 0) {\n reportRecorderLockReleaseFailure(\n filePath,\n releaseErrors.length === 1\n ? releaseErrors[0]\n : new AggregateError(releaseErrors, \"Multiple recorder lock cleanup operations failed.\"),\n );\n }\n return result as T;\n}\n\nasync function serializeAppend<T>(\n filePath: string,\n operation: (\n publicationPath: string,\n logicalPath: string,\n lockCreatedFile: boolean,\n lockedIdentity: RecorderFileIdentity,\n ) => Promise<T>,\n): Promise<T> {\n const logicalPath = path.resolve(filePath);\n const key = await resolveRecorderPublicationPath(logicalPath);\n const previous = pendingAppends.get(key) ?? Promise.resolve();\n let result: T;\n const current = previous\n .catch(() => {})\n .then(async () => {\n result = await withRecorderLock(\n key,\n async (lockCreatedFile, lockedIdentity) =>\n await operation(key, logicalPath, lockCreatedFile, lockedIdentity),\n );\n });\n pendingAppends.set(key, current);\n\n try {\n await current;\n return result!;\n } finally {\n if (pendingAppends.get(key) === current) {\n pendingAppends.delete(key);\n }\n }\n}\n\nasync function readRecordedInboundAppend(\n filePath: string,\n state: IncrementalReadState,\n): Promise<RecordedInboundEnvelope[]> {\n const snapshot = snapshotIncrementalReadState(state);\n let handle;\n\n try {\n handle = await open(filePath, \"r\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n resetIncrementalReadState(state);\n state.identity = undefined;\n return [];\n }\n throw error;\n }\n\n try {\n const stats = await handle.stat();\n const identityStats = await handle.stat({ bigint: true });\n const identity = { dev: identityStats.dev, ino: identityStats.ino };\n const sameFile = state.identity?.dev === identity.dev && state.identity.ino === identity.ino;\n const rotated = state.identity !== undefined && !sameFile;\n let hasContinuity = stats.size >= state.offset;\n\n if (hasContinuity && state.offset > 0 && state.continuity.length === 0) {\n hasContinuity = sameFile;\n } else if (hasContinuity && state.continuity.length > 0) {\n const actual = await readBufferAt(\n handle,\n state.continuity.length,\n state.offset - state.continuity.length,\n );\n hasContinuity = actual.equals(state.continuity);\n }\n\n if (!hasContinuity) {\n resetIncrementalReadState(state);\n } else if (rotated) {\n state.generation += 1;\n }\n state.identity = identity;\n\n const events: RecordedInboundEnvelope[] = [];\n let position = state.offset;\n let remainingBatchBytes = MAX_INCREMENTAL_READ_BYTES;\n let reachedUnexpectedEof = false;\n while (position < stats.size && remainingBatchBytes > 0) {\n const chunk = Buffer.alloc(Math.min(64 * 1024, stats.size - position, remainingBatchBytes));\n const { bytesRead } = await handle.read(chunk, 0, chunk.length, position);\n if (bytesRead === 0) {\n reachedUnexpectedEof = true;\n break;\n }\n position += bytesRead;\n state.offset = position;\n remainingBatchBytes -= bytesRead;\n events.push(...consumeRecordedChunk(state, chunk.subarray(0, bytesRead)));\n }\n state.caughtUp = reachedUnexpectedEof || position >= stats.size;\n return events;\n } catch (error) {\n restoreIncrementalReadState(state, snapshot);\n throw error;\n } finally {\n await handle.close();\n }\n}\n\nexport async function appendRecordedInbound(\n filePath: string,\n event: RecordableInboundEnvelope,\n): Promise<RecordedInboundEnvelope> {\n const firstCreatedDirectory = await prepareRecorderDirectory(filePath);\n\n const recorded = {\n ...event,\n recordedAt: new Date().toISOString(),\n } satisfies RecordedInboundEnvelope;\n\n const line = `${JSON.stringify(recorded)}\\n`;\n if (Buffer.byteLength(line) > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n await appendJsonLine(filePath, line, firstCreatedDirectory);\n return recorded;\n}\n\nexport async function appendRecordedInboundBatch(\n filePath: string,\n events: RecordableInboundEnvelope[],\n): Promise<RecordedInboundEnvelope[]> {\n if (events.length === 0) {\n return [];\n }\n const firstCreatedDirectory = await prepareRecorderDirectory(filePath);\n for (let attempt = 0; ; attempt++) {\n try {\n return await serializeAppend(\n filePath,\n async (publicationPath, logicalPath, _lockCreatedFile, lockedIdentity) => {\n const generation = await prepareRecorderPathForAppend(\n publicationPath,\n logicalPath,\n true,\n lockedIdentity,\n );\n const seen = await syncRecordIdentityIndex(publicationPath);\n const pendingIdentities = new Set<string>();\n const recorded: RecordedInboundEnvelope[] = [];\n for (const event of events) {\n const identity = recordIdentity(event);\n if (seen.has(identity) || pendingIdentities.has(identity)) {\n continue;\n }\n pendingIdentities.add(identity);\n recorded.push({\n ...event,\n recordedAt: new Date().toISOString(),\n });\n }\n if (recorded.length > 0) {\n const batch = {\n events: recorded,\n recordType: \"crabline.recorder.batch\",\n recorderBatchVersion: RECORDER_BATCH_VERSION,\n } satisfies RecordedInboundBatchLine;\n const line = `${JSON.stringify(batch)}\\n`;\n if (Buffer.byteLength(line) > MAX_PENDING_RECORD_BYTES) {\n throw new Error(\n `Recorder record exceeded ${MAX_PENDING_RECORD_BYTES} bytes without a newline.`,\n );\n }\n await appendCommittedLine(\n publicationPath,\n logicalPath,\n line,\n true,\n generation.identity,\n firstCreatedDirectory,\n );\n await syncRecordIdentityIndex(publicationPath);\n } else if (\n !sameRecorderFileIdentity(\n generation.identity,\n await readRecorderFileIdentity(await resolveRecorderPublicationPath(logicalPath)),\n )\n ) {\n throw new RecorderRotatedError(\"Recorder rotated before confirming a duplicate batch.\");\n }\n return recorded;\n },\n );\n } catch (error) {\n if (!(error instanceof RecorderRotatedError) || attempt + 1 >= RECORDER_ROTATION_ATTEMPTS) {\n throw error;\n }\n }\n }\n}\n\nfunction recordIdentity(event: RecordableInboundEnvelope): string {\n return JSON.stringify([event.provider, event.threadId, event.id, recordedDirectionOf(event)]);\n}\n\nasync function syncRecordIdentityIndex(filePath: string): Promise<Set<string>> {\n const key = path.resolve(filePath);\n let index = recordIdentityIndexes.get(key);\n if (!index) {\n index = { readState: createIncrementalReadState(), seen: new Set() };\n recordIdentityIndexes.set(key, index);\n if (recordIdentityIndexes.size > MAX_RECORD_IDENTITY_INDEXES) {\n recordIdentityIndexes.delete(recordIdentityIndexes.keys().next().value!);\n }\n } else {\n recordIdentityIndexes.delete(key);\n recordIdentityIndexes.set(key, index);\n }\n\n let generation = index.readState.generation;\n do {\n const appended = await readRecordedInboundAppend(filePath, index.readState);\n if (index.readState.generation !== generation) {\n index.seen.clear();\n generation = index.readState.generation;\n index.readState.caughtUp = false;\n index.readState.continuity = Buffer.alloc(0);\n index.readState.offset = 0;\n index.readState.pending = Buffer.alloc(0);\n continue;\n }\n for (const event of appended) {\n rememberRecentRecord(index.seen, event);\n }\n } while (!index.readState.caughtUp);\n return index.seen;\n}\n\nexport async function readRecordedInbound(filePath: string): Promise<RecordedInboundEnvelope[]> {\n let raw = \"\";\n\n try {\n raw = await readFile(filePath, \"utf8\");\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const lastNewline = raw.lastIndexOf(\"\\n\");\n const completed = lastNewline >= 0 ? raw.slice(0, lastNewline) : \"\";\n const tail = raw.slice(lastNewline + 1);\n const events: RecordedInboundEnvelope[] = [];\n\n for (const line of completed.split(\"\\n\")) {\n if (line.trim()) {\n events.push(...parseRecordedLine(line));\n }\n }\n if (tail.trim()) {\n try {\n events.push(...parseRecordedLine(tail));\n } catch (error) {\n if (!(error instanceof SyntaxError)) {\n throw error;\n }\n // Ignore a syntactically partial final append; completed lines remain strict.\n }\n }\n\n return events;\n}\n\nexport async function waitForRecordedInbound(params: {\n cursor?: RecordedInboundCursor | undefined;\n filePath: string;\n matches: (event: RecordedInboundEnvelope) => boolean;\n pollMs?: number;\n recordedDirection?: \"inbound\" | \"outbound\" | undefined;\n signal?: AbortSignal | undefined;\n since?: string | undefined;\n timeoutMs: number;\n}): Promise<RecordedInboundEnvelope | null> {\n const deadline = Date.now() + params.timeoutMs;\n const cursor = params.cursor ?? createRecordedInboundCursor();\n\n while (!params.signal?.aborted && Date.now() <= deadline) {\n const generation = cursor.readState.generation;\n const events =\n cursor.buffered.length > 0\n ? cursor.buffered.splice(0)\n : await readRecordedInboundAppend(params.filePath, cursor.readState);\n if (cursor.readState.generation !== generation) {\n cursor.seen.clear();\n }\n for (const [index, event] of events.entries()) {\n if (params.recordedDirection && recordedDirectionOf(event) !== params.recordedDirection) {\n continue;\n }\n // Incremental read state owns progress; this bounded window only filters appended retries.\n if (!rememberRecentRecord(cursor.seen, event)) {\n continue;\n }\n if (params.since && new Date(event.sentAt).getTime() < new Date(params.since).getTime()) {\n continue;\n }\n\n if (params.matches(event)) {\n cursor.buffered.push(...events.slice(index + 1));\n return event;\n }\n }\n if (!cursor.readState.caughtUp) {\n if (Date.now() >= deadline) {\n return null;\n }\n continue;\n }\n\n const remainingMs = deadline - Date.now();\n if (remainingMs <= 0) {\n return null;\n }\n await sleep(Math.min(params.pollMs ?? 200, remainingMs), params.signal);\n }\n\n return null;\n}\n\nexport async function* watchRecordedInbound(params: {\n filePath: string;\n matches: (event: RecordedInboundEnvelope) => boolean;\n pollMs?: number;\n recordedDirection?: \"inbound\" | \"outbound\" | undefined;\n signal?: AbortSignal | undefined;\n since?: string | undefined;\n}): AsyncIterable<RecordedInboundEnvelope> {\n const state = createIncrementalReadState();\n const seen = new Set<string>();\n\n while (!params.signal?.aborted) {\n const generation = state.generation;\n const events = await readRecordedInboundAppend(params.filePath, state);\n if (state.generation !== generation) {\n seen.clear();\n }\n if (params.signal?.aborted) {\n return;\n }\n for (const event of events) {\n if (params.signal?.aborted) {\n return;\n }\n if (!rememberRecentRecord(seen, event)) {\n continue;\n }\n if (params.recordedDirection && recordedDirectionOf(event) !== params.recordedDirection) {\n continue;\n }\n if (params.since && new Date(event.sentAt).getTime() < new Date(params.since).getTime()) {\n continue;\n }\n\n if (params.matches(event)) {\n yield event;\n }\n }\n if (!state.caughtUp) {\n continue;\n }\n\n await sleep(params.pollMs ?? 250, params.signal);\n }\n}\n"]}
@@ -26,6 +26,7 @@ export declare class LazyProviderAdapter implements ProviderAdapter {
26
26
  send(context: SendContext): Promise<SendResult>;
27
27
  waitForInbound(context: WaitContext): Promise<InboundEnvelope | null>;
28
28
  watch(context: WatchContext): AsyncIterable<InboundEnvelope>;
29
+ beginCleanup(): void;
29
30
  cleanup(): Promise<void>;
30
31
  }
31
32
  export declare function createRegistry(manifest: ManifestDefinition, manifestPath: string): Registry;
@@ -70,7 +70,7 @@ function createDispatchBarrier() {
70
70
  return dispatch;
71
71
  }
72
72
  function isLazyAdapter(adapter) {
73
- return adapter in LAZY_PROVIDER_FACTORIES;
73
+ return Object.hasOwn(LAZY_PROVIDER_FACTORIES, adapter);
74
74
  }
75
75
  function createLazyProvider(params) {
76
76
  return new LazyProviderAdapter({
@@ -92,8 +92,10 @@ export class LazyProviderAdapter {
92
92
  #normalizeTarget;
93
93
  #activeWatches = new Set();
94
94
  #inFlightOperations = new Set();
95
+ #providerCleanupErrors = [];
95
96
  #cleanedUp = false;
96
97
  #cleanupPromise = null;
98
+ #providerCleanupBegun = false;
97
99
  #providerInstance = null;
98
100
  #providerPromise = null;
99
101
  constructor(params) {
@@ -156,12 +158,15 @@ export class LazyProviderAdapter {
156
158
  closePromise ??= (async () => {
157
159
  controller.abort();
158
160
  try {
159
- const result = source.return
160
- ? await source.return()
161
- : { done: true, value: undefined };
162
- if (result.done) {
161
+ if (!source.return) {
163
162
  finish();
163
+ return { done: true, value: undefined };
164
+ }
165
+ let result = await source.return();
166
+ while (!result.done) {
167
+ result = await source.next();
164
168
  }
169
+ finish();
165
170
  return result;
166
171
  }
167
172
  catch (error) {
@@ -203,12 +208,17 @@ export class LazyProviderAdapter {
203
208
  controller.abort();
204
209
  try {
205
210
  if (source.throw) {
206
- return await source.throw(error);
211
+ const result = await source.throw(error);
212
+ if (result.done) {
213
+ finish();
214
+ }
215
+ return result;
207
216
  }
208
217
  throw error;
209
218
  }
210
- finally {
219
+ catch (thrownError) {
211
220
  finish();
221
+ throw thrownError;
212
222
  }
213
223
  },
214
224
  [Symbol.asyncIterator]() {
@@ -227,11 +237,18 @@ export class LazyProviderAdapter {
227
237
  this.#activeWatches.add(activeWatch);
228
238
  return iterator;
229
239
  }
230
- async cleanup() {
240
+ beginCleanup() {
241
+ if (this.#cleanedUp) {
242
+ return;
243
+ }
231
244
  this.#cleanedUp = true;
232
245
  for (const watch of this.#activeWatches) {
233
246
  watch.abort();
234
247
  }
248
+ this.#beginProviderCleanupIfReady();
249
+ }
250
+ async cleanup() {
251
+ this.beginCleanup();
235
252
  this.#cleanupPromise ??= (async () => {
236
253
  const operations = [...this.#inFlightOperations];
237
254
  const watches = [...this.#activeWatches];
@@ -262,6 +279,7 @@ export class LazyProviderAdapter {
262
279
  this.#providerPromise ??= this.#factory()
263
280
  .then((provider) => {
264
281
  this.#providerInstance = provider;
282
+ this.#beginProviderCleanupIfReady();
265
283
  return provider;
266
284
  })
267
285
  .catch((error) => {
@@ -314,13 +332,8 @@ export class LazyProviderAdapter {
314
332
  if (!provider) {
315
333
  return;
316
334
  }
317
- const errors = [];
318
- try {
319
- provider.beginCleanup?.();
320
- }
321
- catch (error) {
322
- errors.push(error);
323
- }
335
+ this.#beginProviderCleanup(provider);
336
+ const errors = [...this.#providerCleanupErrors];
324
337
  try {
325
338
  await provider.cleanup?.();
326
339
  }
@@ -334,6 +347,27 @@ export class LazyProviderAdapter {
334
347
  throw new AggregateError(errors, "Provider teardown failed.");
335
348
  }
336
349
  }
350
+ #beginProviderCleanup(provider) {
351
+ if (this.#providerCleanupBegun) {
352
+ return;
353
+ }
354
+ this.#providerCleanupBegun = true;
355
+ try {
356
+ provider.beginCleanup?.();
357
+ }
358
+ catch (error) {
359
+ this.#providerCleanupErrors.push(error);
360
+ }
361
+ }
362
+ #beginProviderCleanupIfReady() {
363
+ const provider = this.#providerInstance;
364
+ if (!this.#cleanedUp ||
365
+ !provider ||
366
+ [...this.#inFlightOperations].some((operation) => !operation.dispatch.reached)) {
367
+ return;
368
+ }
369
+ this.#beginProviderCleanup(provider);
370
+ }
337
371
  #runOperation(run, signal) {
338
372
  if (this.#cleanedUp) {
339
373
  return Promise.reject(this.#cleanedUpError());
@@ -342,6 +376,14 @@ export class LazyProviderAdapter {
342
376
  return Promise.reject(signal.reason ?? new Error("Provider operation aborted."));
343
377
  }
344
378
  const dispatch = createDispatchBarrier();
379
+ let rejectCompletion;
380
+ let resolveCompletion;
381
+ const completion = new Promise((resolve, reject) => {
382
+ rejectCompletion = reject;
383
+ resolveCompletion = resolve;
384
+ });
385
+ const operation = { completion, dispatch };
386
+ this.#inFlightOperations.add(operation);
345
387
  const underlying = (async () => {
346
388
  try {
347
389
  const provider = await this.#provider();
@@ -350,17 +392,18 @@ export class LazyProviderAdapter {
350
392
  }
351
393
  const result = run(provider);
352
394
  dispatch.reach();
395
+ this.#beginProviderCleanupIfReady();
353
396
  return await result;
354
397
  }
355
398
  catch (error) {
356
399
  dispatch.reach();
400
+ this.#beginProviderCleanupIfReady();
357
401
  throw error;
358
402
  }
359
403
  })();
360
- const operation = { completion: underlying, dispatch };
361
- this.#inFlightOperations.add(operation);
362
- void underlying.then(() => this.#inFlightOperations.delete(operation), () => this.#inFlightOperations.delete(operation));
363
- return underlying;
404
+ void underlying.then(resolveCompletion, rejectCompletion);
405
+ void completion.then(() => this.#inFlightOperations.delete(operation), () => this.#inFlightOperations.delete(operation));
406
+ return completion;
364
407
  }
365
408
  #cleanedUpError() {
366
409
  return new CrablineError(`Provider "${this.id}" has been cleaned up.`, { kind: "config" });
@@ -374,7 +417,9 @@ export function createRegistry(manifest, manifestPath) {
374
417
  if (!fixture) {
375
418
  throw new CrablineError(`Unknown fixture: ${fixtureId}`, { kind: "config" });
376
419
  }
377
- const config = manifest.providers[providerId];
420
+ const config = Object.hasOwn(manifest.providers, providerId)
421
+ ? manifest.providers[providerId]
422
+ : undefined;
378
423
  if (!config) {
379
424
  throw new CrablineError(`Unknown provider: ${providerId}`, { kind: "config" });
380
425
  }