@smoothbricks/lmao 0.1.0

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 (447) hide show
  1. package/README.md +269 -0
  2. package/dist/allocator.wasm +0 -0
  3. package/dist/bun/preload.d.ts +11 -0
  4. package/dist/bun/preload.d.ts.map +1 -0
  5. package/dist/bun/preload.js +10 -0
  6. package/dist/bun/trace-preload.d.ts +8 -0
  7. package/dist/bun/trace-preload.d.ts.map +1 -0
  8. package/dist/bun/trace-preload.js +12 -0
  9. package/dist/es.d.ts +8 -0
  10. package/dist/es.d.ts.map +1 -0
  11. package/dist/es.js +9 -0
  12. package/dist/index.d.ts +41 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +84 -0
  15. package/dist/lib/JsBufferStrategy.d.ts +49 -0
  16. package/dist/lib/JsBufferStrategy.d.ts.map +1 -0
  17. package/dist/lib/JsBufferStrategy.js +60 -0
  18. package/dist/lib/archive/chunkCompaction.d.ts +15 -0
  19. package/dist/lib/archive/chunkCompaction.d.ts.map +1 -0
  20. package/dist/lib/archive/chunkCompaction.js +24 -0
  21. package/dist/lib/archive/chunkEnvelope.d.ts +21 -0
  22. package/dist/lib/archive/chunkEnvelope.d.ts.map +1 -0
  23. package/dist/lib/archive/chunkEnvelope.js +55 -0
  24. package/dist/lib/archive/chunkRouting.d.ts +10 -0
  25. package/dist/lib/archive/chunkRouting.d.ts.map +1 -0
  26. package/dist/lib/archive/chunkRouting.js +47 -0
  27. package/dist/lib/archive/chunkStats.d.ts +12 -0
  28. package/dist/lib/archive/chunkStats.d.ts.map +1 -0
  29. package/dist/lib/archive/chunkStats.js +10 -0
  30. package/dist/lib/archive/index.d.ts +5 -0
  31. package/dist/lib/archive/index.d.ts.map +1 -0
  32. package/dist/lib/archive/index.js +4 -0
  33. package/dist/lib/arrow/capacityStats.d.ts +9 -0
  34. package/dist/lib/arrow/capacityStats.d.ts.map +1 -0
  35. package/dist/lib/arrow/capacityStats.js +231 -0
  36. package/dist/lib/arrow/dictionaries.d.ts +27 -0
  37. package/dist/lib/arrow/dictionaries.d.ts.map +1 -0
  38. package/dist/lib/arrow/dictionaries.js +135 -0
  39. package/dist/lib/arrow/flechette.d.ts +40 -0
  40. package/dist/lib/arrow/flechette.d.ts.map +1 -0
  41. package/dist/lib/arrow/flechette.js +67 -0
  42. package/dist/lib/arrow/utils.d.ts +38 -0
  43. package/dist/lib/arrow/utils.d.ts.map +1 -0
  44. package/dist/lib/arrow/utils.js +112 -0
  45. package/dist/lib/buffer/Nanoseconds.d.ts +109 -0
  46. package/dist/lib/buffer/Nanoseconds.d.ts.map +1 -0
  47. package/dist/lib/buffer/Nanoseconds.js +86 -0
  48. package/dist/lib/bufferStrategy.d.ts +95 -0
  49. package/dist/lib/bufferStrategy.d.ts.map +1 -0
  50. package/dist/lib/bufferStrategy.js +1 -0
  51. package/dist/lib/capacityTuning.d.ts +50 -0
  52. package/dist/lib/capacityTuning.d.ts.map +1 -0
  53. package/dist/lib/capacityTuning.js +65 -0
  54. package/dist/lib/codegen/evaluatorGenerator.d.ts +35 -0
  55. package/dist/lib/codegen/evaluatorGenerator.d.ts.map +1 -0
  56. package/dist/lib/codegen/evaluatorGenerator.js +199 -0
  57. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts +139 -0
  58. package/dist/lib/codegen/fixedPositionWriterGenerator.d.ts.map +1 -0
  59. package/dist/lib/codegen/fixedPositionWriterGenerator.js +289 -0
  60. package/dist/lib/codegen/spanLoggerGenerator.d.ts +115 -0
  61. package/dist/lib/codegen/spanLoggerGenerator.d.ts.map +1 -0
  62. package/dist/lib/codegen/spanLoggerGenerator.js +575 -0
  63. package/dist/lib/convertToArrow.d.ts +40 -0
  64. package/dist/lib/convertToArrow.d.ts.map +1 -0
  65. package/dist/lib/convertToArrow.js +1467 -0
  66. package/dist/lib/defineOpContext.d.ts +96 -0
  67. package/dist/lib/defineOpContext.d.ts.map +1 -0
  68. package/dist/lib/defineOpContext.js +227 -0
  69. package/dist/lib/errors/Blocked.d.ts +113 -0
  70. package/dist/lib/errors/Blocked.d.ts.map +1 -0
  71. package/dist/lib/errors/Blocked.js +68 -0
  72. package/dist/lib/errors/CodeError.d.ts +101 -0
  73. package/dist/lib/errors/CodeError.d.ts.map +1 -0
  74. package/dist/lib/errors/CodeError.js +42 -0
  75. package/dist/lib/errors/RetriesExhausted.d.ts +67 -0
  76. package/dist/lib/errors/RetriesExhausted.d.ts.map +1 -0
  77. package/dist/lib/errors/RetriesExhausted.js +31 -0
  78. package/dist/lib/errors/Transient.d.ts +115 -0
  79. package/dist/lib/errors/Transient.d.ts.map +1 -0
  80. package/dist/lib/errors/Transient.js +54 -0
  81. package/dist/lib/errors/index.d.ts +14 -0
  82. package/dist/lib/errors/index.d.ts.map +1 -0
  83. package/dist/lib/errors/index.js +16 -0
  84. package/dist/lib/errors/retry-policy.d.ts +60 -0
  85. package/dist/lib/errors/retry-policy.d.ts.map +1 -0
  86. package/dist/lib/errors/retry-policy.js +54 -0
  87. package/dist/lib/flushScheduler.d.ts +162 -0
  88. package/dist/lib/flushScheduler.d.ts.map +1 -0
  89. package/dist/lib/flushScheduler.js +388 -0
  90. package/dist/lib/library.d.ts +149 -0
  91. package/dist/lib/library.d.ts.map +1 -0
  92. package/dist/lib/library.js +588 -0
  93. package/dist/lib/logApi.d.ts +61 -0
  94. package/dist/lib/logApi.d.ts.map +1 -0
  95. package/dist/lib/logApi.js +12 -0
  96. package/dist/lib/logBinding.d.ts +63 -0
  97. package/dist/lib/logBinding.d.ts.map +1 -0
  98. package/dist/lib/logBinding.js +1 -0
  99. package/dist/lib/op.d.ts +105 -0
  100. package/dist/lib/op.d.ts.map +1 -0
  101. package/dist/lib/op.js +59 -0
  102. package/dist/lib/opContext/contextTypes.d.ts +88 -0
  103. package/dist/lib/opContext/contextTypes.d.ts.map +1 -0
  104. package/dist/lib/opContext/contextTypes.js +34 -0
  105. package/dist/lib/opContext/createOpGroup.d.ts +57 -0
  106. package/dist/lib/opContext/createOpGroup.d.ts.map +1 -0
  107. package/dist/lib/opContext/createOpGroup.js +341 -0
  108. package/dist/lib/opContext/defineOp.d.ts +83 -0
  109. package/dist/lib/opContext/defineOp.d.ts.map +1 -0
  110. package/dist/lib/opContext/defineOp.js +197 -0
  111. package/dist/lib/opContext/featureFlagTypes.d.ts +58 -0
  112. package/dist/lib/opContext/featureFlagTypes.d.ts.map +1 -0
  113. package/dist/lib/opContext/featureFlagTypes.js +1 -0
  114. package/dist/lib/opContext/index.d.ts +13 -0
  115. package/dist/lib/opContext/index.d.ts.map +1 -0
  116. package/dist/lib/opContext/index.js +15 -0
  117. package/dist/lib/opContext/opGroupTypes.d.ts +250 -0
  118. package/dist/lib/opContext/opGroupTypes.d.ts.map +1 -0
  119. package/dist/lib/opContext/opGroupTypes.js +31 -0
  120. package/dist/lib/opContext/opTypes.d.ts +48 -0
  121. package/dist/lib/opContext/opTypes.d.ts.map +1 -0
  122. package/dist/lib/opContext/opTypes.js +7 -0
  123. package/dist/lib/opContext/spanContextTypes.d.ts +347 -0
  124. package/dist/lib/opContext/spanContextTypes.d.ts.map +1 -0
  125. package/dist/lib/opContext/spanContextTypes.js +1 -0
  126. package/dist/lib/opContext/types.d.ts +297 -0
  127. package/dist/lib/opContext/types.d.ts.map +1 -0
  128. package/dist/lib/opContext/types.js +16 -0
  129. package/dist/lib/result.d.ts +308 -0
  130. package/dist/lib/result.d.ts.map +1 -0
  131. package/dist/lib/result.js +359 -0
  132. package/dist/lib/schema/LogSchema.d.ts +62 -0
  133. package/dist/lib/schema/LogSchema.d.ts.map +1 -0
  134. package/dist/lib/schema/LogSchema.js +134 -0
  135. package/dist/lib/schema/builder.d.ts +12 -0
  136. package/dist/lib/schema/builder.d.ts.map +1 -0
  137. package/dist/lib/schema/builder.js +169 -0
  138. package/dist/lib/schema/defineFeatureFlags.d.ts +60 -0
  139. package/dist/lib/schema/defineFeatureFlags.d.ts.map +1 -0
  140. package/dist/lib/schema/defineFeatureFlags.js +29 -0
  141. package/dist/lib/schema/defineLogSchema.d.ts +87 -0
  142. package/dist/lib/schema/defineLogSchema.d.ts.map +1 -0
  143. package/dist/lib/schema/defineLogSchema.js +171 -0
  144. package/dist/lib/schema/evaluator.d.ts +267 -0
  145. package/dist/lib/schema/evaluator.d.ts.map +1 -0
  146. package/dist/lib/schema/evaluator.js +169 -0
  147. package/dist/lib/schema/extend.d.ts +14 -0
  148. package/dist/lib/schema/extend.d.ts.map +1 -0
  149. package/dist/lib/schema/extend.js +51 -0
  150. package/dist/lib/schema/systemSchema.d.ts +112 -0
  151. package/dist/lib/schema/systemSchema.d.ts.map +1 -0
  152. package/dist/lib/schema/systemSchema.js +260 -0
  153. package/dist/lib/schema/typeGuards.d.ts +52 -0
  154. package/dist/lib/schema/typeGuards.d.ts.map +1 -0
  155. package/dist/lib/schema/typeGuards.js +127 -0
  156. package/dist/lib/schema/types.d.ts +156 -0
  157. package/dist/lib/schema/types.d.ts.map +1 -0
  158. package/dist/lib/schema/types.js +4 -0
  159. package/dist/lib/spanBuffer.d.ts +133 -0
  160. package/dist/lib/spanBuffer.d.ts.map +1 -0
  161. package/dist/lib/spanBuffer.js +442 -0
  162. package/dist/lib/spanBufferHelpers.d.ts +53 -0
  163. package/dist/lib/spanBufferHelpers.d.ts.map +1 -0
  164. package/dist/lib/spanBufferHelpers.js +65 -0
  165. package/dist/lib/spanBufferStats.d.ts +38 -0
  166. package/dist/lib/spanBufferStats.d.ts.map +1 -0
  167. package/dist/lib/spanBufferStats.js +1 -0
  168. package/dist/lib/spanContext.d.ts +141 -0
  169. package/dist/lib/spanContext.d.ts.map +1 -0
  170. package/dist/lib/spanContext.js +763 -0
  171. package/dist/lib/sqlite/index.d.ts +14 -0
  172. package/dist/lib/sqlite/index.d.ts.map +1 -0
  173. package/dist/lib/sqlite/index.js +12 -0
  174. package/dist/lib/sqlite/sqlite-async-writer.d.ts +24 -0
  175. package/dist/lib/sqlite/sqlite-async-writer.d.ts.map +1 -0
  176. package/dist/lib/sqlite/sqlite-async-writer.js +65 -0
  177. package/dist/lib/sqlite/sqlite-common.d.ts +37 -0
  178. package/dist/lib/sqlite/sqlite-common.d.ts.map +1 -0
  179. package/dist/lib/sqlite/sqlite-common.js +207 -0
  180. package/dist/lib/sqlite/sqlite-d1.d.ts +25 -0
  181. package/dist/lib/sqlite/sqlite-d1.d.ts.map +1 -0
  182. package/dist/lib/sqlite/sqlite-d1.js +67 -0
  183. package/dist/lib/sqlite/sqlite-db.d.ts +29 -0
  184. package/dist/lib/sqlite/sqlite-db.d.ts.map +1 -0
  185. package/dist/lib/sqlite/sqlite-db.js +1 -0
  186. package/dist/lib/sqlite/sqlite-node.d.ts +16 -0
  187. package/dist/lib/sqlite/sqlite-node.d.ts.map +1 -0
  188. package/dist/lib/sqlite/sqlite-node.js +68 -0
  189. package/dist/lib/sqlite/sqlite-writer.d.ts +39 -0
  190. package/dist/lib/sqlite/sqlite-writer.d.ts.map +1 -0
  191. package/dist/lib/sqlite/sqlite-writer.js +78 -0
  192. package/dist/lib/testing/bun-harness.d.ts +150 -0
  193. package/dist/lib/testing/bun-harness.d.ts.map +1 -0
  194. package/dist/lib/testing/bun-harness.js +729 -0
  195. package/dist/lib/testing/extractFacts.d.ts +73 -0
  196. package/dist/lib/testing/extractFacts.d.ts.map +1 -0
  197. package/dist/lib/testing/extractFacts.js +237 -0
  198. package/dist/lib/testing/facts.d.ts +235 -0
  199. package/dist/lib/testing/facts.d.ts.map +1 -0
  200. package/dist/lib/testing/facts.js +209 -0
  201. package/dist/lib/testing/index.d.ts +58 -0
  202. package/dist/lib/testing/index.d.ts.map +1 -0
  203. package/dist/lib/testing/index.js +74 -0
  204. package/dist/lib/testing/queryable-span.d.ts +39 -0
  205. package/dist/lib/testing/queryable-span.d.ts.map +1 -0
  206. package/dist/lib/testing/queryable-span.js +58 -0
  207. package/dist/lib/testing/span-query.d.ts +21 -0
  208. package/dist/lib/testing/span-query.d.ts.map +1 -0
  209. package/dist/lib/testing/span-query.js +47 -0
  210. package/dist/lib/testing/stdio-replay.d.ts +4 -0
  211. package/dist/lib/testing/stdio-replay.d.ts.map +1 -0
  212. package/dist/lib/testing/stdio-replay.js +42 -0
  213. package/dist/lib/testing/trace-query.d.ts +59 -0
  214. package/dist/lib/testing/trace-query.d.ts.map +1 -0
  215. package/dist/lib/testing/trace-query.js +462 -0
  216. package/dist/lib/testing/vitest-harness.d.ts +135 -0
  217. package/dist/lib/testing/vitest-harness.d.ts.map +1 -0
  218. package/dist/lib/testing/vitest-harness.js +486 -0
  219. package/dist/lib/threadId.d.ts +58 -0
  220. package/dist/lib/threadId.d.ts.map +1 -0
  221. package/dist/lib/threadId.js +123 -0
  222. package/dist/lib/traceContext.d.ts +116 -0
  223. package/dist/lib/traceContext.d.ts.map +1 -0
  224. package/dist/lib/traceContext.js +37 -0
  225. package/dist/lib/traceId.d.ts +78 -0
  226. package/dist/lib/traceId.d.ts.map +1 -0
  227. package/dist/lib/traceId.js +87 -0
  228. package/dist/lib/traceRoot.d.ts +133 -0
  229. package/dist/lib/traceRoot.d.ts.map +1 -0
  230. package/dist/lib/traceRoot.es.d.ts +75 -0
  231. package/dist/lib/traceRoot.es.d.ts.map +1 -0
  232. package/dist/lib/traceRoot.es.js +129 -0
  233. package/dist/lib/traceRoot.js +19 -0
  234. package/dist/lib/traceRoot.node.d.ts +77 -0
  235. package/dist/lib/traceRoot.node.d.ts.map +1 -0
  236. package/dist/lib/traceRoot.node.js +133 -0
  237. package/dist/lib/traceRoot.universal.d.ts +3 -0
  238. package/dist/lib/traceRoot.universal.d.ts.map +1 -0
  239. package/dist/lib/traceRoot.universal.js +17 -0
  240. package/dist/lib/tracer.d.ts +296 -0
  241. package/dist/lib/tracer.d.ts.map +1 -0
  242. package/dist/lib/tracer.js +346 -0
  243. package/dist/lib/tracers/ArrayQueueTracer.d.ts +56 -0
  244. package/dist/lib/tracers/ArrayQueueTracer.d.ts.map +1 -0
  245. package/dist/lib/tracers/ArrayQueueTracer.js +67 -0
  246. package/dist/lib/tracers/CompositeTracer.d.ts +24 -0
  247. package/dist/lib/tracers/CompositeTracer.d.ts.map +1 -0
  248. package/dist/lib/tracers/CompositeTracer.js +57 -0
  249. package/dist/lib/tracers/NoOpTracer.d.ts +58 -0
  250. package/dist/lib/tracers/NoOpTracer.d.ts.map +1 -0
  251. package/dist/lib/tracers/NoOpTracer.js +41 -0
  252. package/dist/lib/tracers/SQLiteTracer.d.ts +42 -0
  253. package/dist/lib/tracers/SQLiteTracer.d.ts.map +1 -0
  254. package/dist/lib/tracers/SQLiteTracer.js +84 -0
  255. package/dist/lib/tracers/StdioTracer.d.ts +83 -0
  256. package/dist/lib/tracers/StdioTracer.d.ts.map +1 -0
  257. package/dist/lib/tracers/StdioTracer.js +270 -0
  258. package/dist/lib/tracers/TestTracer.d.ts +95 -0
  259. package/dist/lib/tracers/TestTracer.d.ts.map +1 -0
  260. package/dist/lib/tracers/TestTracer.js +87 -0
  261. package/dist/lib/tracers/index.d.ts +12 -0
  262. package/dist/lib/tracers/index.d.ts.map +1 -0
  263. package/dist/lib/tracers/index.js +11 -0
  264. package/dist/lib/types.d.ts +366 -0
  265. package/dist/lib/types.d.ts.map +1 -0
  266. package/dist/lib/types.js +1 -0
  267. package/dist/lib/utf8Cache.d.ts +111 -0
  268. package/dist/lib/utf8Cache.d.ts.map +1 -0
  269. package/dist/lib/utf8Cache.js +177 -0
  270. package/dist/lib/wasm/WasmBufferStrategy.d.ts +88 -0
  271. package/dist/lib/wasm/WasmBufferStrategy.d.ts.map +1 -0
  272. package/dist/lib/wasm/WasmBufferStrategy.js +138 -0
  273. package/dist/lib/wasm/wasmAllocator.d.ts +109 -0
  274. package/dist/lib/wasm/wasmAllocator.d.ts.map +1 -0
  275. package/dist/lib/wasm/wasmAllocator.js +227 -0
  276. package/dist/lib/wasm/wasmSpanBuffer.d.ts +123 -0
  277. package/dist/lib/wasm/wasmSpanBuffer.d.ts.map +1 -0
  278. package/dist/lib/wasm/wasmSpanBuffer.js +772 -0
  279. package/dist/lib/wasm/wasmTraceRoot.d.ts +167 -0
  280. package/dist/lib/wasm/wasmTraceRoot.d.ts.map +1 -0
  281. package/dist/lib/wasm/wasmTraceRoot.js +264 -0
  282. package/dist/node.d.ts +7 -0
  283. package/dist/node.d.ts.map +1 -0
  284. package/dist/node.js +8 -0
  285. package/dist/testing.d.ts +18 -0
  286. package/dist/testing.d.ts.map +1 -0
  287. package/dist/testing.js +17 -0
  288. package/package.json +193 -0
  289. package/src/bun/preload.ts +11 -0
  290. package/src/bun/trace-preload.ts +14 -0
  291. package/src/es.ts +11 -0
  292. package/src/index.ts +194 -0
  293. package/src/lib/JsBufferStrategy.ts +102 -0
  294. package/src/lib/__tests__/arrow-builder-integration/arrow-conversion.test.ts +485 -0
  295. package/src/lib/__tests__/arrow-builder-integration/binary-arrow-conversion.test.ts +390 -0
  296. package/src/lib/__tests__/arrow-builder-integration/binary-comparison.test.ts +647 -0
  297. package/src/lib/__tests__/arrow-builder-integration/binary-format-compliance.test.ts +292 -0
  298. package/src/lib/__tests__/arrow-builder-integration/buffer-chaining.test.ts +354 -0
  299. package/src/lib/__tests__/arrow-builder-integration/foundation.test.ts +127 -0
  300. package/src/lib/__tests__/arrow-builder-integration/integration.test.ts +392 -0
  301. package/src/lib/__tests__/arrow-builder-integration/lazy-columns.test.ts +389 -0
  302. package/src/lib/__tests__/arrow-conversion-algorithms.test.ts +54 -0
  303. package/src/lib/__tests__/arrow-test-helpers.ts +71 -0
  304. package/src/lib/__tests__/binary-e2e.test.ts +203 -0
  305. package/src/lib/__tests__/buffer-overflow-op-api.test.ts +608 -0
  306. package/src/lib/__tests__/buffer-overflow.test.ts +612 -0
  307. package/src/lib/__tests__/capacity-tuning.test.ts +544 -0
  308. package/src/lib/__tests__/effective-schema.test.ts +439 -0
  309. package/src/lib/__tests__/flechette.test.ts +42 -0
  310. package/src/lib/__tests__/flushScheduler.test.ts +537 -0
  311. package/src/lib/__tests__/integration.test.ts +600 -0
  312. package/src/lib/__tests__/library.test.ts +934 -0
  313. package/src/lib/__tests__/nested-library-tasks.test.ts +849 -0
  314. package/src/lib/__tests__/op-context-binding.test.ts +135 -0
  315. package/src/lib/__tests__/op-metadata.test.ts +198 -0
  316. package/src/lib/__tests__/op-type-safety.test.ts +71 -0
  317. package/src/lib/__tests__/package-exports.test.ts +57 -0
  318. package/src/lib/__tests__/remapped-buffer-view-integration.test.ts +319 -0
  319. package/src/lib/__tests__/remapped-buffer-view.test.ts +635 -0
  320. package/src/lib/__tests__/scope-attributes.test.ts +348 -0
  321. package/src/lib/__tests__/span-lifecycle.test.ts +680 -0
  322. package/src/lib/__tests__/sync-async-trace.test.ts +435 -0
  323. package/src/lib/__tests__/test-helpers.ts +318 -0
  324. package/src/lib/__tests__/timestamp.test.ts +259 -0
  325. package/src/lib/__tests__/trace-archive-primitives.test.ts +98 -0
  326. package/src/lib/__tests__/traceContext-type-enforcement.test.ts +271 -0
  327. package/src/lib/__tests__/tracer.test.ts +211 -0
  328. package/src/lib/__tests__/type-narrowing.test.ts +137 -0
  329. package/src/lib/archive/chunkCompaction.ts +44 -0
  330. package/src/lib/archive/chunkEnvelope.ts +79 -0
  331. package/src/lib/archive/chunkRouting.ts +70 -0
  332. package/src/lib/archive/chunkStats.ts +25 -0
  333. package/src/lib/archive/index.ts +4 -0
  334. package/src/lib/arrow/capacityStats.ts +340 -0
  335. package/src/lib/arrow/dictionaries.ts +159 -0
  336. package/src/lib/arrow/flechette.ts +114 -0
  337. package/src/lib/arrow/utils.ts +126 -0
  338. package/src/lib/buffer/Nanoseconds.ts +131 -0
  339. package/src/lib/bufferStrategy.ts +106 -0
  340. package/src/lib/capacityTuning.ts +102 -0
  341. package/src/lib/codegen/__tests__/__snapshots__/evaluatorGenerator.test.ts.snap +160 -0
  342. package/src/lib/codegen/__tests__/__snapshots__/scopeGenerator.test.ts.snap +196 -0
  343. package/src/lib/codegen/__tests__/__snapshots__/spanLoggerGenerator.test.ts.snap +1965 -0
  344. package/src/lib/codegen/__tests__/evaluatorGenerator.test.ts +516 -0
  345. package/src/lib/codegen/__tests__/nullBitmap.test.ts +207 -0
  346. package/src/lib/codegen/__tests__/spanLoggerGenerator.test.ts +237 -0
  347. package/src/lib/codegen/evaluatorGenerator.ts +309 -0
  348. package/src/lib/codegen/fixedPositionWriterGenerator.ts +444 -0
  349. package/src/lib/codegen/spanLoggerGenerator.ts +715 -0
  350. package/src/lib/convertToArrow.ts +1805 -0
  351. package/src/lib/defineOpContext.ts +398 -0
  352. package/src/lib/errors/Blocked.ts +165 -0
  353. package/src/lib/errors/CodeError.ts +132 -0
  354. package/src/lib/errors/RetriesExhausted.ts +78 -0
  355. package/src/lib/errors/Transient.ts +168 -0
  356. package/src/lib/errors/__tests__/Blocked-config.test.ts +152 -0
  357. package/src/lib/errors/__tests__/Transient.test.ts +129 -0
  358. package/src/lib/errors/__tests__/retry-policy.test.ts +85 -0
  359. package/src/lib/errors/index.ts +24 -0
  360. package/src/lib/errors/retry-policy.ts +87 -0
  361. package/src/lib/flushScheduler.ts +509 -0
  362. package/src/lib/library.ts +682 -0
  363. package/src/lib/logApi.ts +70 -0
  364. package/src/lib/logBinding.ts +67 -0
  365. package/src/lib/op.ts +103 -0
  366. package/src/lib/opContext/__tests__/retry.test.ts +764 -0
  367. package/src/lib/opContext/contextTypes.ts +130 -0
  368. package/src/lib/opContext/createOpGroup.ts +456 -0
  369. package/src/lib/opContext/defineOp.ts +281 -0
  370. package/src/lib/opContext/featureFlagTypes.ts +54 -0
  371. package/src/lib/opContext/index.ts +16 -0
  372. package/src/lib/opContext/opGroupTypes.ts +342 -0
  373. package/src/lib/opContext/opTypes.ts +80 -0
  374. package/src/lib/opContext/spanContextTypes.ts +398 -0
  375. package/src/lib/opContext/types.ts +403 -0
  376. package/src/lib/result.ts +550 -0
  377. package/src/lib/schema/LogSchema.ts +153 -0
  378. package/src/lib/schema/__tests__/defineLogSchema.test.ts +342 -0
  379. package/src/lib/schema/__tests__/featureFlags.test.ts +443 -0
  380. package/src/lib/schema/builder.ts +201 -0
  381. package/src/lib/schema/defineFeatureFlags.ts +91 -0
  382. package/src/lib/schema/defineLogSchema.ts +291 -0
  383. package/src/lib/schema/evaluator.ts +404 -0
  384. package/src/lib/schema/extend.ts +69 -0
  385. package/src/lib/schema/systemSchema.ts +339 -0
  386. package/src/lib/schema/typeGuards.ts +163 -0
  387. package/src/lib/schema/types.ts +265 -0
  388. package/src/lib/spanBuffer.ts +571 -0
  389. package/src/lib/spanBufferHelpers.ts +73 -0
  390. package/src/lib/spanBufferStats.ts +40 -0
  391. package/src/lib/spanContext.ts +1566 -0
  392. package/src/lib/sqlite/__tests__/sqlite-common.test.ts +89 -0
  393. package/src/lib/sqlite/index.ts +26 -0
  394. package/src/lib/sqlite/sqlite-async-writer.ts +101 -0
  395. package/src/lib/sqlite/sqlite-common.ts +309 -0
  396. package/src/lib/sqlite/sqlite-d1.ts +104 -0
  397. package/src/lib/sqlite/sqlite-db.ts +32 -0
  398. package/src/lib/sqlite/sqlite-node.ts +83 -0
  399. package/src/lib/sqlite/sqlite-writer.ts +128 -0
  400. package/src/lib/testing/TRACE-TESTING.md +100 -0
  401. package/src/lib/testing/__tests__/bun-harness.test.ts +108 -0
  402. package/src/lib/testing/__tests__/extractFacts.test.ts +279 -0
  403. package/src/lib/testing/__tests__/facts.test.ts +324 -0
  404. package/src/lib/testing/__tests__/vitest-harness.test.ts +32 -0
  405. package/src/lib/testing/bun-harness.ts +990 -0
  406. package/src/lib/testing/extractFacts.ts +362 -0
  407. package/src/lib/testing/facts.ts +470 -0
  408. package/src/lib/testing/index.ts +141 -0
  409. package/src/lib/testing/queryable-span.ts +108 -0
  410. package/src/lib/testing/span-query.ts +65 -0
  411. package/src/lib/testing/stdio-replay.ts +50 -0
  412. package/src/lib/testing/trace-query.ts +329 -0
  413. package/src/lib/testing/vitest-harness.ts +691 -0
  414. package/src/lib/threadId.ts +135 -0
  415. package/src/lib/traceContext.ts +182 -0
  416. package/src/lib/traceId.ts +142 -0
  417. package/src/lib/traceRoot.es.ts +157 -0
  418. package/src/lib/traceRoot.node.ts +170 -0
  419. package/src/lib/traceRoot.ts +154 -0
  420. package/src/lib/traceRoot.universal.ts +22 -0
  421. package/src/lib/tracer.ts +896 -0
  422. package/src/lib/tracers/ArrayQueueTracer.ts +76 -0
  423. package/src/lib/tracers/CompositeTracer.ts +76 -0
  424. package/src/lib/tracers/NoOpTracer.ts +73 -0
  425. package/src/lib/tracers/SQLiteTracer.ts +115 -0
  426. package/src/lib/tracers/StdioTracer.ts +380 -0
  427. package/src/lib/tracers/TestTracer.ts +146 -0
  428. package/src/lib/tracers/__tests__/ArrayQueueTracer.test.ts +184 -0
  429. package/src/lib/tracers/__tests__/NoOpTracer.test.ts +204 -0
  430. package/src/lib/tracers/__tests__/StdioTracer.test.ts +313 -0
  431. package/src/lib/tracers/__tests__/TestTracer.test.ts +200 -0
  432. package/src/lib/tracers/index.ts +12 -0
  433. package/src/lib/types.ts +498 -0
  434. package/src/lib/utf8Cache.ts +201 -0
  435. package/src/lib/wasm/WasmBufferStrategy.ts +219 -0
  436. package/src/lib/wasm/__tests__/WasmBufferStrategy.test.ts +256 -0
  437. package/src/lib/wasm/__tests__/wasm-integration.test.ts +476 -0
  438. package/src/lib/wasm/__tests__/wasmAllocator.test.ts +699 -0
  439. package/src/lib/wasm/__tests__/wasmSpanBuffer.test.ts +449 -0
  440. package/src/lib/wasm/__tests__/wasmTraceRoot.test.ts +390 -0
  441. package/src/lib/wasm/__tests__/wasmTracer.test.ts.disabled +444 -0
  442. package/src/lib/wasm/allocator.zig +945 -0
  443. package/src/lib/wasm/wasmAllocator.ts +469 -0
  444. package/src/lib/wasm/wasmSpanBuffer.ts +1014 -0
  445. package/src/lib/wasm/wasmTraceRoot.ts +315 -0
  446. package/src/node.ts +10 -0
  447. package/src/testing.ts +18 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Retries exhausted error - returned when a Blocked error has exceeded max attempts.
3
+ *
4
+ * When an Op repeatedly returns `Blocked` and the retry config's `maxAttempts`
5
+ * is exhausted, the retry layer converts the final failure to `RetriesExhausted`.
6
+ *
7
+ * Unlike `Blocked`, this represents a permanent failure that callers must handle
8
+ * (e.g., compensate, alert, escalate, return error to caller).
9
+ *
10
+ * @example
11
+ * ```typescript
12
+ * import { defineOpContext, S, Err } from '@smoothbricks/lmao';
13
+ * import { Blocked } from '@smoothbricks/lmao/errors/Blocked';
14
+ * import { RetriesExhausted } from '@smoothbricks/lmao/errors/RetriesExhausted';
15
+ *
16
+ * const { defineOp } = defineOpContext({
17
+ * logSchema: { service: S.category() },
18
+ * ctx: { env: null as Env },
19
+ * });
20
+ *
21
+ * // Op that may be blocked by external service
22
+ * const callPaymentApi = defineOp('callPaymentApi', async (ctx, amount: number) => {
23
+ * const health = await checkHealth('payment-api');
24
+ * if (!health.available) {
25
+ * return new Err(Blocked.service('payment-api'));
26
+ * }
27
+ * const result = await ctx.deps.http.post('/pay', { amount });
28
+ * return ctx.ok(result);
29
+ * });
30
+ *
31
+ * // Caller handles permanent failure after retries exhausted
32
+ * const result = await trace('checkout', checkoutOp);
33
+ * if (result.isErr(RetriesExhausted)) {
34
+ * ctx.log.error(`Payment failed after ${result.error.attempts} attempts`);
35
+ * return ctx.err('PAYMENT_UNAVAILABLE', { service: result.error.reason });
36
+ * }
37
+ * ```
38
+ */
39
+
40
+ import type { TaggedError } from '../result.js';
41
+ import { type BlockedReason, getBlockedReasonName } from './Blocked.js';
42
+
43
+ type RetriesExhaustedView = {
44
+ _tag: 'RetriesExhausted';
45
+ reason: BlockedReason;
46
+ attempts: number;
47
+ maxAttempts: number;
48
+ };
49
+
50
+ export class RetriesExhausted extends Error implements TaggedError<'RetriesExhausted'> {
51
+ static readonly _tag = 'RetriesExhausted' as const;
52
+
53
+ get _tag(): 'RetriesExhausted' {
54
+ return 'RetriesExhausted';
55
+ }
56
+
57
+ constructor(
58
+ /** The original blocked reason */
59
+ readonly reason: BlockedReason,
60
+ /** How many attempts were made */
61
+ readonly attempts: number,
62
+ /** Max attempts that was configured (the limit that was hit) */
63
+ readonly maxAttempts: number,
64
+ ) {
65
+ super(`RetriesExhausted: ${getBlockedReasonName(reason)} after ${attempts} attempts`);
66
+ this.name = 'RetriesExhausted';
67
+ }
68
+
69
+ /** Clean output for console.log in Node.js */
70
+ [Symbol.for('nodejs.util.inspect.custom')](): RetriesExhaustedView {
71
+ return { _tag: this._tag, reason: this.reason, attempts: this.attempts, maxAttempts: this.maxAttempts };
72
+ }
73
+
74
+ /** Clean output for JSON.stringify */
75
+ toJSON(): RetriesExhaustedView {
76
+ return { _tag: this._tag, reason: this.reason, attempts: this.attempts, maxAttempts: this.maxAttempts };
77
+ }
78
+ }
@@ -0,0 +1,168 @@
1
+ /**
2
+ * TransientError - typed transient error codes with embedded retry policy.
3
+ *
4
+ * Use the `Transient()` factory to define transient error codes WITH default retry policy.
5
+ * Op class checks `instanceof TransientError` and reads `error.policy` for retry config.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { Transient, exponentialBackoff, fixedDelay } from '@smoothbricks/lmao/errors/Transient';
10
+ *
11
+ * // Define error with default exponential backoff (5 attempts)
12
+ * const SERVICE_UNAVAILABLE = Transient<{ service: string }>('SERVICE_UNAVAILABLE', exponentialBackoff(5));
13
+ *
14
+ * // Define error with fixed delay for rate limiting
15
+ * const RATE_LIMITED = Transient<{ retryAfter?: number }>('RATE_LIMITED', fixedDelay(3, 5000));
16
+ *
17
+ * // Usage - data only, uses default policy
18
+ * ctx.err(SERVICE_UNAVAILABLE({ service: 'api' }));
19
+ *
20
+ * // Override policy for this specific call (e.g., use Retry-After header)
21
+ * ctx.err(RATE_LIMITED({ retryAfter: 60000 }, fixedDelay(1, 60000)));
22
+ *
23
+ * // Op class detects transient and reads policy
24
+ * if (result.error instanceof TransientError) {
25
+ * const { maxAttempts, backoff, baseDelayMs } = result.error.policy;
26
+ * // Execute retry loop based on policy
27
+ * }
28
+ * ```
29
+ */
30
+
31
+ import type { TaggedErrorConstructor } from '../result.js';
32
+ import { CodeError } from './CodeError.js';
33
+ import { mergePolicy, type RetryPolicy } from './retry-policy.js';
34
+
35
+ /**
36
+ * Transient error instance - triggers retry in Op class.
37
+ *
38
+ * Extends CodeError to inherit code/data pattern while adding:
39
+ * - `instanceof TransientError` checks for retry classification
40
+ * - `policy` field carrying merged retry configuration
41
+ *
42
+ * @typeParam C - The error code string literal type (also serves as _tag)
43
+ * @typeParam D - The data payload type
44
+ */
45
+ export class TransientError<C extends string, D = void> extends CodeError<C, D> {
46
+ /**
47
+ * Merged retry policy (defaultPolicy + per-call override).
48
+ * Op class reads this to configure retry loop.
49
+ */
50
+ readonly policy: RetryPolicy;
51
+
52
+ constructor(code: C, data: D, policy: RetryPolicy) {
53
+ super(code, data);
54
+ this.name = 'TransientError';
55
+ this.policy = policy;
56
+ }
57
+
58
+ override toJSON() {
59
+ return {
60
+ ...super.toJSON(),
61
+ policy: this.policy,
62
+ };
63
+ }
64
+ }
65
+
66
+ /**
67
+ * Constructor function for a specific transient error code.
68
+ * Has static `_tag` for isErr() and `defaultPolicy` for introspection.
69
+ */
70
+ export interface TransientConstructor<C extends string, D = void> extends TaggedErrorConstructor<TransientError<C, D>> {
71
+ /** Create transient error with data and optional policy override */
72
+ (data: D, policyOverride?: Partial<RetryPolicy>): TransientError<C, D>;
73
+ /** Error code (same as _tag) */
74
+ readonly _tag: C;
75
+ /** Default retry policy for this error type */
76
+ readonly defaultPolicy: RetryPolicy;
77
+ }
78
+
79
+ /**
80
+ * Constructor function for transient error codes with no data.
81
+ */
82
+ export interface TransientConstructorVoid<C extends string> extends TaggedErrorConstructor<TransientError<C, void>> {
83
+ /** Create transient error with optional policy override */
84
+ (policyOverride?: Partial<RetryPolicy>): TransientError<C, void>;
85
+ /** Error code (same as _tag) */
86
+ readonly _tag: C;
87
+ /** Default retry policy for this error type */
88
+ readonly defaultPolicy: RetryPolicy;
89
+ }
90
+
91
+ type TransientFactoryReturn<C extends string, D> = [unknown] extends [D]
92
+ ? TransientConstructor<C, D>
93
+ : undefined extends D
94
+ ? TransientConstructorVoid<C>
95
+ : TransientConstructor<C, D>;
96
+
97
+ /**
98
+ * Define a typed transient error code with default retry policy.
99
+ *
100
+ * Creates errors that extend TransientError, enabling:
101
+ * - `instanceof TransientError` for retry triggering
102
+ * - `result.isErr(CODE)` for specific code discrimination
103
+ * - `error.policy` for retry configuration
104
+ *
105
+ * @param code - The error code string (becomes _tag for discrimination)
106
+ * @param defaultPolicy - Default retry policy for this error type
107
+ * @returns A constructor function that creates TransientError instances
108
+ *
109
+ * @example
110
+ * ```typescript
111
+ * // With typed data and exponential backoff
112
+ * const NETWORK_ERROR = Transient<{ service: string }>('NETWORK_ERROR', exponentialBackoff(5));
113
+ * ctx.err(NETWORK_ERROR({ service: 'payment-api' }));
114
+ *
115
+ * // Without data, linear backoff
116
+ * const TIMEOUT = Transient('TIMEOUT', linearBackoff(3));
117
+ * ctx.err(TIMEOUT());
118
+ *
119
+ * // Override policy per-call
120
+ * ctx.err(NETWORK_ERROR({ service: 'api' }, fixedDelay(1, 30000)));
121
+ *
122
+ * // Op class handles retry
123
+ * if (result.error instanceof TransientError) {
124
+ * const { policy } = result.error;
125
+ * // Retry loop using policy.maxAttempts, policy.backoff, etc.
126
+ * }
127
+ * ```
128
+ */
129
+ export function Transient<C extends string>(code: C, defaultPolicy: RetryPolicy): TransientConstructorVoid<C>;
130
+ export function Transient<D, C extends string = string>(
131
+ code: C,
132
+ defaultPolicy: RetryPolicy,
133
+ ): TransientFactoryReturn<C, D>;
134
+ export function Transient(
135
+ code: string,
136
+ defaultPolicy: RetryPolicy,
137
+ ): TransientConstructorVoid<string> | TransientConstructor<string, unknown> {
138
+ function createTransientError(policyOverride?: Partial<RetryPolicy>): TransientError<string, void>;
139
+ function createTransientError(data: unknown, policyOverride?: Partial<RetryPolicy>): TransientError<string, unknown>;
140
+ function createTransientError(dataOrOverride?: unknown, maybeOverride?: Partial<RetryPolicy>) {
141
+ const override =
142
+ maybeOverride !== undefined ? maybeOverride : isRetryPolicyLike(dataOrOverride) ? dataOrOverride : undefined;
143
+
144
+ const data = maybeOverride !== undefined || override !== undefined ? undefined : dataOrOverride;
145
+ const mergedPolicy = mergePolicy(defaultPolicy, override);
146
+ return new TransientError(code, data, mergedPolicy);
147
+ }
148
+
149
+ return Object.assign(createTransientError, {
150
+ _tag: code,
151
+ defaultPolicy,
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Type guard to check if value looks like a RetryPolicy (partial).
157
+ * Used to disambiguate void data + override from actual data.
158
+ */
159
+ function isRetryPolicyLike(value: unknown): value is Partial<RetryPolicy> {
160
+ if (typeof value !== 'object' || value === null) return false;
161
+ // Check for RetryPolicy-specific keys — `in` accepts `object`, no cast needed
162
+ return (
163
+ 'backoff' in value || 'maxAttempts' in value || 'baseDelayMs' in value || 'maxDelayMs' in value || 'jitter' in value
164
+ );
165
+ }
166
+
167
+ // Re-export policy helpers for convenience
168
+ export { exponentialBackoff, fixedDelay, linearBackoff, mergePolicy, type RetryPolicy } from './retry-policy.js';
@@ -0,0 +1,152 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { Blocked, type BlockedConfig } from '../Blocked.js';
3
+
4
+ describe('Blocked with BlockedConfig', () => {
5
+ describe('Blocked.service', () => {
6
+ it('should work with no config', () => {
7
+ const err = Blocked.service('payment-api');
8
+ expect(err.reason).toEqual({ type: 'service', name: 'payment-api' });
9
+ expect(err.blockedConfig).toBeUndefined();
10
+ });
11
+
12
+ it('should work with BlockedConfig (nextRetry closure)', () => {
13
+ const nextRetry = (attempt: number) => 5000 * 2 ** (attempt - 1);
14
+ const config: BlockedConfig = { maxAttempts: 5, nextRetry };
15
+ const err = Blocked.service('payment-api', config);
16
+ expect(err.reason).toEqual({ type: 'service', name: 'payment-api' });
17
+ expect(err.blockedConfig).toEqual(config);
18
+ expect(err.blockedConfig?.nextRetry).toBe(nextRetry);
19
+ });
20
+
21
+ it('should work with BlockedConfig that has only maxAttempts', () => {
22
+ const config: BlockedConfig = { maxAttempts: 3 };
23
+ const err = Blocked.service('payment-api', config);
24
+ expect(err.blockedConfig).toEqual(config);
25
+ });
26
+
27
+ it('should work with BlockedConfig that has only nextRetry', () => {
28
+ const nextRetry = () => 1000;
29
+ const config: BlockedConfig = { nextRetry };
30
+ const err = Blocked.service('payment-api', config);
31
+ expect(err.blockedConfig).toEqual(config);
32
+ expect(err.blockedConfig?.nextRetry?.(1)).toBe(1000);
33
+ });
34
+ });
35
+
36
+ describe('Blocked.ended', () => {
37
+ it('should work with BlockedConfig', () => {
38
+ const config: BlockedConfig = { maxAttempts: 10 };
39
+ const err = Blocked.ended('ax-123', config);
40
+ expect(err.reason).toEqual({ type: 'ended', target: 'ax-123' });
41
+ expect(err.blockedConfig).toEqual(config);
42
+ });
43
+ });
44
+
45
+ describe('Blocked.index', () => {
46
+ it('should work with BlockedConfig', () => {
47
+ const nextRetry = (attempt: number) => 1000 * attempt;
48
+ const config: BlockedConfig = { maxAttempts: 5, nextRetry };
49
+ const err = Blocked.index('orders-index', config);
50
+ expect(err.reason).toEqual({ type: 'index', indexName: 'orders-index' });
51
+ expect(err.blockedConfig).toEqual(config);
52
+ });
53
+ });
54
+
55
+ describe('.blockedConfig getter', () => {
56
+ it('should return BlockedConfig when given BlockedConfig', () => {
57
+ const config: BlockedConfig = { maxAttempts: 3, nextRetry: () => 500 };
58
+ const err = Blocked.service('api', config);
59
+ expect(err.blockedConfig).toBe(config);
60
+ });
61
+
62
+ it('should return undefined when no config', () => {
63
+ const err = Blocked.service('api');
64
+ expect(err.blockedConfig).toBeUndefined();
65
+ });
66
+ });
67
+
68
+ describe('serialization', () => {
69
+ it('should include blockedConfig in toJSON', () => {
70
+ const config: BlockedConfig = { maxAttempts: 3, nextRetry: () => 1000 };
71
+ const err = Blocked.service('api', config);
72
+ const json = err.toJSON();
73
+ expect(json).toEqual({
74
+ _tag: 'Blocked',
75
+ reason: { type: 'service', name: 'api' },
76
+ blockedConfig: { maxAttempts: 3, nextRetry: '[closure]' },
77
+ });
78
+ });
79
+
80
+ it('should omit blockedConfig in toJSON when no config', () => {
81
+ const err = Blocked.service('api');
82
+ const json = err.toJSON();
83
+ expect(json).toEqual({
84
+ _tag: 'Blocked',
85
+ reason: { type: 'service', name: 'api' },
86
+ });
87
+ });
88
+
89
+ it('should include blockedConfig in inspect', () => {
90
+ const config: BlockedConfig = { maxAttempts: 3, nextRetry: () => 1000 };
91
+ const err = Blocked.service('api', config);
92
+ const inspectSymbol = Symbol.for('nodejs.util.inspect.custom');
93
+ const inspectFn = Reflect.get(err, inspectSymbol);
94
+ if (typeof inspectFn !== 'function') {
95
+ throw new Error('Expected Blocked inspect hook to be defined');
96
+ }
97
+
98
+ const inspected = inspectFn.call(err);
99
+ expect(inspected).toEqual({
100
+ _tag: 'Blocked',
101
+ reason: { type: 'service', name: 'api' },
102
+ blockedConfig: config,
103
+ });
104
+ });
105
+ });
106
+
107
+ describe('nextRetry closure captures context', () => {
108
+ it('should use captured Retry-After value on first attempt', () => {
109
+ const retryAfterMs = 30000;
110
+ const config: BlockedConfig = {
111
+ maxAttempts: 5,
112
+ nextRetry: (attempt) => {
113
+ if (attempt === 1 && retryAfterMs > 0) return retryAfterMs;
114
+ return 5000 * 2 ** (attempt - 1);
115
+ },
116
+ };
117
+
118
+ const err = Blocked.service('payment-api', config);
119
+ const nextRetry = err.blockedConfig?.nextRetry;
120
+ if (!nextRetry) {
121
+ throw new Error('Expected blockedConfig.nextRetry to be defined');
122
+ }
123
+
124
+ expect(nextRetry(1)).toBe(30000);
125
+ expect(nextRetry(2)).toBe(10000);
126
+ expect(nextRetry(3)).toBe(20000);
127
+ });
128
+ });
129
+
130
+ describe('Error properties', () => {
131
+ it('should be an instance of Error', () => {
132
+ const err = Blocked.service('api');
133
+ expect(err).toBeInstanceOf(Error);
134
+ expect(err).toBeInstanceOf(Blocked);
135
+ });
136
+
137
+ it('should have correct message', () => {
138
+ expect(Blocked.service('payment-api').message).toBe('Blocked: payment-api');
139
+ expect(Blocked.ended('ax-123').message).toBe('Blocked: ax-123');
140
+ expect(Blocked.index('orders').message).toBe('Blocked: orders');
141
+ });
142
+
143
+ it('should have name "Blocked"', () => {
144
+ expect(Blocked.service('api').name).toBe('Blocked');
145
+ });
146
+
147
+ it('should have _tag "Blocked"', () => {
148
+ expect(Blocked.service('api')._tag).toBe('Blocked');
149
+ expect(Blocked._tag).toBe('Blocked');
150
+ });
151
+ });
152
+ });
@@ -0,0 +1,129 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { CodeError } from '../CodeError.js';
3
+ import { exponentialBackoff, fixedDelay, linearBackoff, Transient, TransientError } from '../Transient.js';
4
+
5
+ describe('TransientError', () => {
6
+ describe('class', () => {
7
+ it('should extend CodeError', () => {
8
+ const policy = linearBackoff(3);
9
+ const error = new TransientError('TEST_CODE', { foo: 'bar' }, policy);
10
+ expect(error).toBeInstanceOf(CodeError);
11
+ expect(error).toBeInstanceOf(TransientError);
12
+ expect(error).toBeInstanceOf(Error);
13
+ });
14
+
15
+ it('should have name TransientError', () => {
16
+ const error = new TransientError('TEST', {}, linearBackoff(3));
17
+ expect(error.name).toBe('TransientError');
18
+ });
19
+
20
+ it('should carry policy', () => {
21
+ const policy = exponentialBackoff(5);
22
+ const error = new TransientError('NETWORK', { service: 'api' }, policy);
23
+ expect(error.policy).toBe(policy);
24
+ expect(error.policy.maxAttempts).toBe(5);
25
+ expect(error.policy.backoff).toBe('exponential');
26
+ });
27
+
28
+ it('should include policy in toJSON', () => {
29
+ const policy = fixedDelay(2, 1000);
30
+ const error = new TransientError('RATE_LIMITED', { ms: 1000 }, policy);
31
+ const json = error.toJSON();
32
+ expect(json).toEqual({
33
+ code: 'RATE_LIMITED',
34
+ data: { ms: 1000 },
35
+ policy: {
36
+ backoff: 'fixed',
37
+ maxAttempts: 2,
38
+ baseDelayMs: 1000,
39
+ jitter: false,
40
+ },
41
+ });
42
+ });
43
+ });
44
+
45
+ describe('Transient() factory', () => {
46
+ it('should create TransientError with default policy', () => {
47
+ const SERVICE_UNAVAILABLE = Transient<{ status: number }>('SERVICE_UNAVAILABLE', exponentialBackoff(5));
48
+ const error = SERVICE_UNAVAILABLE({ status: 503 });
49
+
50
+ expect(error).toBeInstanceOf(TransientError);
51
+ expect(error.code).toBe('SERVICE_UNAVAILABLE');
52
+ expect(error.data).toEqual({ status: 503 });
53
+ expect(error.policy.maxAttempts).toBe(5);
54
+ expect(error.policy.backoff).toBe('exponential');
55
+ });
56
+
57
+ it('should have static _tag property', () => {
58
+ const NETWORK_ERROR = Transient<{ service: string }>('NETWORK_ERROR', linearBackoff(3));
59
+ expect(NETWORK_ERROR._tag).toBe('NETWORK_ERROR');
60
+ });
61
+
62
+ it('should have static defaultPolicy property', () => {
63
+ const policy = exponentialBackoff(5);
64
+ const TIMEOUT = Transient('TIMEOUT', policy);
65
+ expect(TIMEOUT.defaultPolicy).toBe(policy);
66
+ });
67
+
68
+ it('should allow policy override per-call', () => {
69
+ const SERVICE_UNAVAILABLE = Transient<{ status: number }>('SERVICE_UNAVAILABLE', exponentialBackoff(5));
70
+
71
+ // Use default
72
+ const error1 = SERVICE_UNAVAILABLE({ status: 503 });
73
+ expect(error1.policy.maxAttempts).toBe(5);
74
+ expect(error1.policy.backoff).toBe('exponential');
75
+
76
+ // Override maxAttempts
77
+ const error2 = SERVICE_UNAVAILABLE({ status: 503 }, { maxAttempts: 2 });
78
+ expect(error2.policy.maxAttempts).toBe(2);
79
+ expect(error2.policy.backoff).toBe('exponential'); // Unchanged
80
+
81
+ // Override entire policy
82
+ const error3 = SERVICE_UNAVAILABLE({ status: 503 }, fixedDelay(1, 60000));
83
+ expect(error3.policy.maxAttempts).toBe(1);
84
+ expect(error3.policy.backoff).toBe('fixed');
85
+ expect(error3.policy.baseDelayMs).toBe(60000);
86
+ });
87
+
88
+ it('should work with void data', () => {
89
+ const TIMEOUT = Transient('TIMEOUT', linearBackoff(3));
90
+
91
+ // No args - use default policy
92
+ const error1 = TIMEOUT();
93
+ expect(error1.code).toBe('TIMEOUT');
94
+ expect(error1.data).toBeUndefined();
95
+ expect(error1.policy.maxAttempts).toBe(3);
96
+
97
+ // Policy override only (void data)
98
+ const error2 = TIMEOUT({ maxAttempts: 1 });
99
+ expect(error2.data).toBeUndefined();
100
+ expect(error2.policy.maxAttempts).toBe(1);
101
+ });
102
+
103
+ it('should enable instanceof checks for retry classification', () => {
104
+ const SERVICE_DOWN = Transient<{ service: string }>('SERVICE_DOWN', exponentialBackoff(5));
105
+ const error = SERVICE_DOWN({ service: 'payment' });
106
+
107
+ // This is the key use case - Op class uses this check
108
+ expect(error instanceof TransientError).toBe(true);
109
+ expect(error instanceof CodeError).toBe(true);
110
+ });
111
+
112
+ it('should distinguish from regular CodeError', async () => {
113
+ const { Code } = await import('../CodeError.js');
114
+
115
+ const TRANSIENT_ERR = Transient<{ reason: string }>('SOME_ERROR', linearBackoff(3));
116
+ const REGULAR_ERR = Code<{ reason: string }>('SOME_ERROR');
117
+
118
+ const transientError = TRANSIENT_ERR({ reason: 'network' });
119
+ const regularError = REGULAR_ERR({ reason: 'validation' });
120
+
121
+ // Same code, different instanceof
122
+ expect(transientError.code).toBe('SOME_ERROR');
123
+ expect(regularError.code).toBe('SOME_ERROR');
124
+
125
+ expect(transientError instanceof TransientError).toBe(true);
126
+ expect(regularError instanceof TransientError).toBe(false);
127
+ });
128
+ });
129
+ });
@@ -0,0 +1,85 @@
1
+ import { describe, expect, it } from 'bun:test';
2
+ import { exponentialBackoff, fixedDelay, linearBackoff, mergePolicy } from '../retry-policy.js';
3
+
4
+ describe('RetryPolicy helpers', () => {
5
+ describe('linearBackoff', () => {
6
+ it('should create linear policy with defaults', () => {
7
+ const policy = linearBackoff(3);
8
+ expect(policy).toEqual({
9
+ backoff: 'linear',
10
+ maxAttempts: 3,
11
+ baseDelayMs: 100,
12
+ jitter: true,
13
+ });
14
+ });
15
+
16
+ it('should accept custom baseDelayMs', () => {
17
+ const policy = linearBackoff(5, 200);
18
+ expect(policy.maxAttempts).toBe(5);
19
+ expect(policy.baseDelayMs).toBe(200);
20
+ });
21
+ });
22
+
23
+ describe('exponentialBackoff', () => {
24
+ it('should create exponential policy with defaults', () => {
25
+ const policy = exponentialBackoff(5);
26
+ expect(policy).toEqual({
27
+ backoff: 'exponential',
28
+ maxAttempts: 5,
29
+ baseDelayMs: 100,
30
+ jitter: true,
31
+ });
32
+ });
33
+
34
+ it('should accept custom baseDelayMs', () => {
35
+ const policy = exponentialBackoff(3, 50);
36
+ expect(policy.maxAttempts).toBe(3);
37
+ expect(policy.baseDelayMs).toBe(50);
38
+ });
39
+ });
40
+
41
+ describe('fixedDelay', () => {
42
+ it('should create fixed policy with defaults', () => {
43
+ const policy = fixedDelay(3);
44
+ expect(policy).toEqual({
45
+ backoff: 'fixed',
46
+ maxAttempts: 3,
47
+ baseDelayMs: 1000,
48
+ jitter: false,
49
+ });
50
+ });
51
+
52
+ it('should accept custom delayMs', () => {
53
+ const policy = fixedDelay(1, 60000);
54
+ expect(policy.maxAttempts).toBe(1);
55
+ expect(policy.baseDelayMs).toBe(60000);
56
+ });
57
+ });
58
+
59
+ describe('mergePolicy', () => {
60
+ it('should return base when no override', () => {
61
+ const base = linearBackoff(3);
62
+ expect(mergePolicy(base)).toBe(base);
63
+ expect(mergePolicy(base, undefined)).toBe(base);
64
+ });
65
+
66
+ it('should merge override fields', () => {
67
+ const base = exponentialBackoff(5);
68
+ const merged = mergePolicy(base, { maxAttempts: 3 });
69
+ expect(merged.maxAttempts).toBe(3);
70
+ expect(merged.backoff).toBe('exponential');
71
+ expect(merged.baseDelayMs).toBe(100);
72
+ });
73
+
74
+ it('should override multiple fields', () => {
75
+ const base = linearBackoff(5, 100);
76
+ const merged = mergePolicy(base, { maxAttempts: 2, baseDelayMs: 500, jitter: false });
77
+ expect(merged).toEqual({
78
+ backoff: 'linear',
79
+ maxAttempts: 2,
80
+ baseDelayMs: 500,
81
+ jitter: false,
82
+ });
83
+ });
84
+ });
85
+ });
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Error types and utilities for LMAO.
3
+ *
4
+ * @example
5
+ * ```typescript
6
+ * import { Code, CodeError, Transient, TransientError, Blocked, exponentialBackoff } from '@smoothbricks/lmao/errors';
7
+ * ```
8
+ */
9
+
10
+ export * from './Blocked.js';
11
+ // Existing exports
12
+ export * from './CodeError.js';
13
+ export * from './RetriesExhausted.js';
14
+
15
+ // Phase 19 exports - TransientError uses RetryPolicy from retry-policy.ts
16
+ // Export with different name to avoid conflict with other retry configs
17
+ export {
18
+ exponentialBackoff,
19
+ fixedDelay,
20
+ linearBackoff,
21
+ mergePolicy,
22
+ type RetryPolicy as TransientRetryPolicy,
23
+ } from './retry-policy.js';
24
+ export { Transient, type TransientConstructor, type TransientConstructorVoid, TransientError } from './Transient.js';