@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,42 @@
1
+ import type { OpContextBinding } from '../opContext/types.js';
2
+ import type { AsyncSQLiteDatabase, SyncSQLiteDatabase } from '../sqlite/sqlite-db.js';
3
+ import { Tracer, type TracerOptions } from '../tracer.js';
4
+ import type { SpanBuffer } from '../types.js';
5
+ export interface SQLiteTracerOptions<T extends import('../schema/LogSchema.js').LogSchema = import('../schema/LogSchema.js').LogSchema> extends TracerOptions<T> {
6
+ db: SyncSQLiteDatabase;
7
+ }
8
+ export interface SQLiteAsyncTracerOptions<T extends import('../schema/LogSchema.js').LogSchema = import('../schema/LogSchema.js').LogSchema> extends TracerOptions<T> {
9
+ db: AsyncSQLiteDatabase | Promise<AsyncSQLiteDatabase>;
10
+ }
11
+ /**
12
+ * Tracer that persists completed root traces to SQLite synchronously.
13
+ */
14
+ export declare class SQLiteTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
15
+ private readonly writer;
16
+ constructor(binding: B, options: SQLiteTracerOptions<B['logBinding']['logSchema']>);
17
+ onTraceStart(_rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
18
+ onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
19
+ onSpanStart(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
20
+ onSpanEnd(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
21
+ onStatsWillResetFor(_buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
22
+ close(): Promise<void>;
23
+ }
24
+ /**
25
+ * Tracer that persists completed root traces to SQLite asynchronously.
26
+ *
27
+ * onTraceEnd starts a background write pipeline; flush() awaits pipeline completion.
28
+ */
29
+ export declare class SQLiteAsyncTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
30
+ private readonly writerPromise;
31
+ private pendingWrites;
32
+ private pendingErrors;
33
+ constructor(binding: B, options: SQLiteAsyncTracerOptions<B['logBinding']['logSchema']>);
34
+ onTraceStart(_rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
35
+ onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
36
+ onSpanStart(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
37
+ onSpanEnd(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
38
+ onStatsWillResetFor(_buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
39
+ flush(): Promise<void>;
40
+ close(): Promise<void>;
41
+ }
42
+ //# sourceMappingURL=SQLiteTracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SQLiteTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/SQLiteTracer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,mBAAmB,CAClC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,EAAE,EAAE,kBAAkB,CAAC;CACxB;AAED,MAAM,WAAW,wBAAwB,CACvC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,EAAE,EAAE,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CACxD;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAKlF,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAItE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIvE,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAItE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAED;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IAC7F,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAkC;IAChE,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,aAAa,CAAiB;gBAE1B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAKvF,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAWtE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIvE,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAI7D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAY/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
@@ -0,0 +1,84 @@
1
+ import { SQLiteAsyncTraceWriter } from '../sqlite/sqlite-async-writer.js';
2
+ import { SQLiteTraceWriter } from '../sqlite/sqlite-writer.js';
3
+ import { Tracer } from '../tracer.js';
4
+ /**
5
+ * Tracer that persists completed root traces to SQLite synchronously.
6
+ */
7
+ export class SQLiteTracer extends Tracer {
8
+ writer;
9
+ constructor(binding, options) {
10
+ super(binding, options);
11
+ this.writer = new SQLiteTraceWriter(options.db);
12
+ }
13
+ onTraceStart(_rootBuffer) {
14
+ // No-op
15
+ }
16
+ onTraceEnd(rootBuffer) {
17
+ this.writer.flush(rootBuffer);
18
+ }
19
+ onSpanStart(_childBuffer) {
20
+ // No-op
21
+ }
22
+ onSpanEnd(_childBuffer) {
23
+ // No-op
24
+ }
25
+ onStatsWillResetFor(_buffer) {
26
+ // No-op
27
+ }
28
+ async close() {
29
+ this.writer.close();
30
+ }
31
+ }
32
+ /**
33
+ * Tracer that persists completed root traces to SQLite asynchronously.
34
+ *
35
+ * onTraceEnd starts a background write pipeline; flush() awaits pipeline completion.
36
+ */
37
+ export class SQLiteAsyncTracer extends Tracer {
38
+ writerPromise;
39
+ pendingWrites = Promise.resolve();
40
+ pendingErrors = [];
41
+ constructor(binding, options) {
42
+ super(binding, options);
43
+ this.writerPromise = Promise.resolve(options.db).then((db) => new SQLiteAsyncTraceWriter(db));
44
+ }
45
+ onTraceStart(_rootBuffer) {
46
+ // No-op
47
+ }
48
+ onTraceEnd(rootBuffer) {
49
+ this.pendingWrites = this.pendingWrites.then(async () => {
50
+ try {
51
+ const writer = await this.writerPromise;
52
+ await writer.flush(rootBuffer);
53
+ }
54
+ catch (error) {
55
+ this.pendingErrors.push(error);
56
+ }
57
+ });
58
+ }
59
+ onSpanStart(_childBuffer) {
60
+ // No-op
61
+ }
62
+ onSpanEnd(_childBuffer) {
63
+ // No-op
64
+ }
65
+ onStatsWillResetFor(_buffer) {
66
+ // No-op
67
+ }
68
+ async flush() {
69
+ await this.pendingWrites;
70
+ if (this.pendingErrors.length > 0) {
71
+ const errors = this.pendingErrors;
72
+ this.pendingErrors = [];
73
+ if (errors.length === 1) {
74
+ throw errors[0];
75
+ }
76
+ throw new AggregateError(errors, `SQLiteAsyncTracer flush failed for ${errors.length} trace writes`);
77
+ }
78
+ }
79
+ async close() {
80
+ await this.flush();
81
+ const writer = await this.writerPromise;
82
+ await writer.close();
83
+ }
84
+ }
@@ -0,0 +1,83 @@
1
+ /**
2
+ * StdioTracer - A tracer that prints spans to stdout/stderr
3
+ *
4
+ * Features:
5
+ * - Color-coded trace IDs based on trace_id for visual separation of concurrent traces
6
+ * - Per-trace indent tracking using Map<TraceId, number> for correct nesting
7
+ * - Human-readable timestamps (ISO 8601) and durations
8
+ * - Tree-style output with ├─ for start and └─ for end
9
+ * - Exceptions written to stderr
10
+ *
11
+ * Useful for development/debugging to see span execution in real-time.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { createTraceRoot } from '@smoothbricks/lmao/node';
16
+ * import { JsBufferStrategy } from '@smoothbricks/lmao';
17
+ *
18
+ * const ctx = defineOpContext({ logSchema: mySchema });
19
+ * const { trace } = new StdioTracer(ctx, {
20
+ * bufferStrategy: new JsBufferStrategy(),
21
+ * createTraceRoot,
22
+ * });
23
+ *
24
+ * await trace('fetch-user', fetchOp);
25
+ *
26
+ * // Output:
27
+ * // [2025-12-25T10:30:45.123Z] [123456] fetch-user
28
+ * // [2025-12-25T10:30:45.125Z] [123456] ├─ db-query
29
+ * // [2025-12-25T10:30:45.225Z] [123456] └─ db-query [OK] (100.00ms)
30
+ * // [2025-12-25T10:30:45.226Z] [123456] fetch-user (103.00ms) ========
31
+ * ```
32
+ */
33
+ import type { OpContextBinding } from '../opContext/types.js';
34
+ import type { TracerOptions } from '../tracer.js';
35
+ import { Tracer } from '../tracer.js';
36
+ import type { AnySpanBuffer, SpanBuffer } from '../types.js';
37
+ export interface StdioWritable {
38
+ write(chunk: string): boolean;
39
+ }
40
+ /**
41
+ * Options for StdioTracer
42
+ */
43
+ export interface StdioTracerOptions<T extends import('../schema/LogSchema.js').LogSchema = import('../schema/LogSchema.js').LogSchema> extends TracerOptions<T> {
44
+ /** Output stream (defaults to process.stdout) */
45
+ out?: StdioWritable;
46
+ /** Error stream (defaults to process.stderr) */
47
+ err?: StdioWritable;
48
+ /** Enable ANSI colors (defaults to true) */
49
+ colorEnabled?: boolean;
50
+ }
51
+ /**
52
+ * Tracer that prints spans to stdout/stderr with colored, indented output.
53
+ *
54
+ * Features:
55
+ * - Color-coded trace IDs for visual separation of concurrent traces
56
+ * - Per-trace indent tracking (concurrent-safe via Map)
57
+ * - Tree-style output (├─ for start, └─ for end)
58
+ * - Human-readable timestamps and durations
59
+ * - Exceptions go to stderr
60
+ */
61
+ export declare class StdioTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
62
+ /**
63
+ * Per-trace indent levels for concurrent-safe nesting.
64
+ * Key is trace_id string representation, value is current indent level.
65
+ */
66
+ private readonly indents;
67
+ private readonly out;
68
+ private readonly err;
69
+ private readonly colorEnabled;
70
+ constructor(binding: B, options: StdioTracerOptions<B['logBinding']['logSchema']>);
71
+ private getIndent;
72
+ private incrementIndent;
73
+ private decrementIndent;
74
+ private color;
75
+ private reset;
76
+ private printLogRows;
77
+ onTraceStart(rootBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
78
+ onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
79
+ onSpanStart(childBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
80
+ onSpanEnd(childBuffer: SpanBuffer<B['logBinding']['logSchema']> | AnySpanBuffer): void;
81
+ onStatsWillResetFor(_buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
82
+ }
83
+ //# sourceMappingURL=StdioTracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StdioTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/StdioTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAY9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE7D,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;CAC/B;AA+HD;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,CAAC,SAAS,OAAO,wBAAwB,EAAE,SAAS,GAAG,OAAO,wBAAwB,EAAE,SAAS,CACjG,SAAQ,aAAa,CAAC,CAAC,CAAC;IACxB,iDAAiD;IACjD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,gDAAgD;IAChD,GAAG,CAAC,EAAE,aAAa,CAAC;IACpB,4CAA4C;IAC5C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAMD;;;;;;;;;GASG;AACH,qBAAa,WAAW,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACvF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA6B;IAErD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IACpC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;gBAE3B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAWjF,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,KAAK;IAIb,OAAO,CAAC,YAAY;IAoCpB,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IASxF,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IAuBtF,WAAW,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IAUxF,SAAS,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,aAAa,GAAG,IAAI;IAwBtF,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;CAiB7E"}
@@ -0,0 +1,270 @@
1
+ import { ENTRY_TYPE_DEBUG, ENTRY_TYPE_ERROR, ENTRY_TYPE_INFO, ENTRY_TYPE_SPAN_ERR, ENTRY_TYPE_SPAN_EXCEPTION, ENTRY_TYPE_SPAN_OK, ENTRY_TYPE_TRACE, ENTRY_TYPE_WARN, } from '../schema/systemSchema.js';
2
+ import { Tracer } from '../tracer.js';
3
+ // ============================================================================
4
+ // Formatting Helpers
5
+ // ============================================================================
6
+ /**
7
+ * Format nanosecond timestamp to ISO 8601 string with millisecond precision.
8
+ */
9
+ function formatTimestamp(nanos) {
10
+ const millis = Number(nanos / 1000000n);
11
+ return new Date(millis).toISOString();
12
+ }
13
+ /**
14
+ * Format duration in nanoseconds to human-readable string.
15
+ */
16
+ function formatDuration(nanos) {
17
+ const n = Number(nanos);
18
+ if (n >= 1_000_000_000) {
19
+ return `${(n / 1_000_000_000).toFixed(2)}s`;
20
+ }
21
+ if (n >= 1_000_000) {
22
+ return `${(n / 1_000_000).toFixed(2)}ms`;
23
+ }
24
+ if (n >= 1_000) {
25
+ return `${(n / 1_000).toFixed(2)}µs`;
26
+ }
27
+ return `${n}ns`;
28
+ }
29
+ /**
30
+ * ANSI color codes for visual trace separation.
31
+ * Each trace gets a consistent color based on trace_id hash.
32
+ */
33
+ const COLORS = [
34
+ '\u001b[31m', // Red
35
+ '\u001b[32m', // Green
36
+ '\u001b[33m', // Yellow
37
+ '\u001b[34m', // Blue
38
+ '\u001b[35m', // Magenta
39
+ '\u001b[36m', // Cyan
40
+ '\u001b[91m', // Bright Red
41
+ '\u001b[92m', // Bright Green
42
+ '\u001b[93m', // Bright Yellow
43
+ '\u001b[94m', // Bright Blue
44
+ '\u001b[95m', // Bright Magenta
45
+ '\u001b[96m', // Bright Cyan
46
+ ];
47
+ const RESET = '\u001b[0m';
48
+ /**
49
+ * Get consistent color for a trace_id.
50
+ * Uses modulo arithmetic to map 128-bit trace_id to one of the colors.
51
+ */
52
+ function getTraceColor(traceId) {
53
+ // Convert TraceId (string representation) to a number for coloring
54
+ // Use simple hash of the string to pick a color
55
+ let hash = 0;
56
+ const str = String(traceId);
57
+ for (let i = 0; i < str.length; i++) {
58
+ const char = str.charCodeAt(i);
59
+ // Simple hash function
60
+ hash = (hash << 5) - hash + char;
61
+ hash = hash & hash;
62
+ }
63
+ const index = Math.abs(hash) % COLORS.length;
64
+ return COLORS[index];
65
+ }
66
+ /**
67
+ * Get status string from entry type.
68
+ */
69
+ function getStatus(entryType) {
70
+ switch (entryType) {
71
+ case ENTRY_TYPE_SPAN_OK:
72
+ return 'OK';
73
+ case ENTRY_TYPE_SPAN_ERR:
74
+ return 'ERR';
75
+ case ENTRY_TYPE_SPAN_EXCEPTION:
76
+ return 'EXCEPTION';
77
+ default:
78
+ return 'UNKNOWN';
79
+ }
80
+ }
81
+ function getLogLevel(entryType) {
82
+ switch (entryType) {
83
+ case ENTRY_TYPE_TRACE:
84
+ return 'TRACE';
85
+ case ENTRY_TYPE_DEBUG:
86
+ return 'DEBUG';
87
+ case ENTRY_TYPE_INFO:
88
+ return 'INFO';
89
+ case ENTRY_TYPE_WARN:
90
+ return 'WARN';
91
+ case ENTRY_TYPE_ERROR:
92
+ return 'ERROR';
93
+ default:
94
+ return null;
95
+ }
96
+ }
97
+ function formatTemplateMessage(buffer, row, template) {
98
+ return template.replace(/\{\{([A-Za-z0-9_]+)\}\}/g, (_full, key) => {
99
+ const values = Reflect.get(buffer, `${key}_values`);
100
+ if (values == null)
101
+ return `{{${key}}}`;
102
+ if (Array.isArray(values)) {
103
+ const value = values[row];
104
+ return value === null || value === undefined ? `{{${key}}}` : String(value);
105
+ }
106
+ if (ArrayBuffer.isView(values)) {
107
+ const value = Reflect.get(values, row);
108
+ return value === null || value === undefined ? `{{${key}}}` : String(value);
109
+ }
110
+ return `{{${key}}}`;
111
+ });
112
+ }
113
+ // ============================================================================
114
+ // StdioTracer
115
+ // ============================================================================
116
+ /**
117
+ * Tracer that prints spans to stdout/stderr with colored, indented output.
118
+ *
119
+ * Features:
120
+ * - Color-coded trace IDs for visual separation of concurrent traces
121
+ * - Per-trace indent tracking (concurrent-safe via Map)
122
+ * - Tree-style output (├─ for start, └─ for end)
123
+ * - Human-readable timestamps and durations
124
+ * - Exceptions go to stderr
125
+ */
126
+ export class StdioTracer extends Tracer {
127
+ /**
128
+ * Per-trace indent levels for concurrent-safe nesting.
129
+ * Key is trace_id string representation, value is current indent level.
130
+ */
131
+ indents = new Map();
132
+ out;
133
+ err;
134
+ colorEnabled;
135
+ constructor(binding, options) {
136
+ super(binding, options);
137
+ this.out = options.out ?? process.stdout;
138
+ this.err = options.err ?? process.stderr;
139
+ this.colorEnabled = options.colorEnabled ?? true;
140
+ }
141
+ // --------------------------------------------------------------------------
142
+ // Indent Management
143
+ // --------------------------------------------------------------------------
144
+ getIndent(traceId) {
145
+ const key = String(traceId);
146
+ return this.indents.get(key) ?? 0;
147
+ }
148
+ incrementIndent(traceId) {
149
+ const key = String(traceId);
150
+ this.indents.set(key, this.getIndent(traceId) + 1);
151
+ }
152
+ decrementIndent(traceId) {
153
+ const key = String(traceId);
154
+ const current = this.getIndent(traceId);
155
+ if (current <= 1) {
156
+ this.indents.delete(key); // Cleanup when trace ends
157
+ }
158
+ else {
159
+ this.indents.set(key, current - 1);
160
+ }
161
+ }
162
+ // --------------------------------------------------------------------------
163
+ // Color Helpers
164
+ // --------------------------------------------------------------------------
165
+ color(traceId) {
166
+ return this.colorEnabled ? getTraceColor(traceId) : '';
167
+ }
168
+ reset() {
169
+ return this.colorEnabled ? RESET : '';
170
+ }
171
+ printLogRows(buffer, indent) {
172
+ let current = buffer;
173
+ let isRootSegment = true;
174
+ while (current) {
175
+ const start = isRootSegment ? 2 : 0;
176
+ const end = current._writeIndex;
177
+ for (let i = start; i < end; i++) {
178
+ const level = getLogLevel(current.entry_type[i]);
179
+ if (!level)
180
+ continue;
181
+ const template = current.message_values[i] ?? '';
182
+ const message = formatTemplateMessage(current, i, template);
183
+ const ts = formatTimestamp(current.timestamp[i]);
184
+ const traceId = current.trace_id;
185
+ const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ` +
186
+ `${' '.repeat(indent)}· ${level} ${message}\n`;
187
+ if (level === 'ERROR') {
188
+ this.err.write(line);
189
+ }
190
+ else {
191
+ this.out.write(line);
192
+ }
193
+ }
194
+ current = current._overflow ?? null;
195
+ isRootSegment = false;
196
+ }
197
+ }
198
+ // --------------------------------------------------------------------------
199
+ // Lifecycle Hooks
200
+ // --------------------------------------------------------------------------
201
+ onTraceStart(rootBuffer) {
202
+ const traceId = rootBuffer.trace_id;
203
+ const name = rootBuffer.message_values[0];
204
+ const ts = formatTimestamp(rootBuffer.timestamp[0]);
205
+ this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name}\n`);
206
+ this.incrementIndent(traceId);
207
+ }
208
+ onTraceEnd(rootBuffer) {
209
+ const traceId = rootBuffer.trace_id;
210
+ this.printLogRows(rootBuffer, 1);
211
+ this.decrementIndent(traceId);
212
+ const name = rootBuffer.message_values[0];
213
+ const startTs = rootBuffer.timestamp[0];
214
+ const endTs = rootBuffer.timestamp[1];
215
+ const duration = formatDuration(endTs - startTs);
216
+ const entryType = rootBuffer.entry_type[1];
217
+ const status = getStatus(entryType);
218
+ const ts = formatTimestamp(endTs);
219
+ const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${name} [${status}] (${duration}) ${'='.repeat(40)}\n`;
220
+ // Write exceptions to stderr
221
+ if (entryType === ENTRY_TYPE_SPAN_EXCEPTION) {
222
+ this.err.write(line);
223
+ }
224
+ else {
225
+ this.out.write(line);
226
+ }
227
+ }
228
+ onSpanStart(childBuffer) {
229
+ const traceId = childBuffer.trace_id;
230
+ const indent = this.getIndent(traceId);
231
+ const name = childBuffer.message_values[0];
232
+ const ts = formatTimestamp(childBuffer.timestamp[0]);
233
+ this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}├─ ${name}\n`);
234
+ this.incrementIndent(traceId);
235
+ }
236
+ onSpanEnd(childBuffer) {
237
+ const traceId = childBuffer.trace_id;
238
+ this.decrementIndent(traceId);
239
+ const indent = this.getIndent(traceId);
240
+ this.printLogRows(childBuffer, indent + 1);
241
+ const name = childBuffer.message_values[0];
242
+ const startTs = childBuffer.timestamp[0];
243
+ const endTs = childBuffer.timestamp[1];
244
+ const duration = formatDuration(endTs - startTs);
245
+ const entryType = childBuffer.entry_type[1];
246
+ const status = getStatus(entryType);
247
+ const ts = formatTimestamp(endTs);
248
+ const line = `[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ${' '.repeat(indent)}└─ ${name} [${status}] (${duration})\n`;
249
+ // Write exceptions to stderr
250
+ if (entryType === ENTRY_TYPE_SPAN_EXCEPTION) {
251
+ this.err.write(line);
252
+ }
253
+ else {
254
+ this.out.write(line);
255
+ }
256
+ }
257
+ onStatsWillResetFor(_buffer) {
258
+ const stats = _buffer._stats;
259
+ // Compute utilization = totalWrites / (spansCreated * usableRowsPerSpan)
260
+ const usableRowsPerSpan = stats.capacity - 2;
261
+ const utilization = stats.spansCreated > 0
262
+ ? ((stats.totalWrites / (stats.spansCreated * usableRowsPerSpan)) * 100).toFixed(1)
263
+ : '0.0';
264
+ const traceId = _buffer.trace_id;
265
+ const ts = formatTimestamp(_buffer.timestamp[0]);
266
+ this.out.write(`[${ts}] ${this.color(traceId)}[${traceId}]${this.reset()} ` +
267
+ `[CAPACITY] writes=${stats.totalWrites} spans=${stats.spansCreated} utilization=${utilization}% ` +
268
+ `capacity=${stats.capacity}\n`);
269
+ }
270
+ }
@@ -0,0 +1,95 @@
1
+ /**
2
+ * TestTracer - A tracer that accumulates completed root trace buffers for test inspection.
3
+ *
4
+ * Child spans are accessible via the buffer's `_children` tree - no need to track them separately.
5
+ * This is the primary tracer for tests that need to inspect trace output, convert to Arrow tables,
6
+ * or verify buffer contents.
7
+ *
8
+ * @example
9
+ * ```typescript
10
+ * import { createTraceRoot } from '@smoothbricks/lmao/node';
11
+ * import { JsBufferStrategy } from '@smoothbricks/lmao';
12
+ *
13
+ * const ctx = defineOpContext({ logSchema });
14
+ * const tracer = new TestTracer(ctx, {
15
+ * bufferStrategy: new JsBufferStrategy(),
16
+ * createTraceRoot,
17
+ * });
18
+ *
19
+ * await tracer.trace('my-op', myOp);
20
+ *
21
+ * // Inspect buffers
22
+ * expect(tracer.rootBuffers).toHaveLength(1);
23
+ *
24
+ * // Convert to Arrow using strategy
25
+ * const table = await tracer.bufferStrategy.toArrowTable(tracer.rootBuffers[0]);
26
+ * ```
27
+ *
28
+ * @module tracers/TestTracer
29
+ */
30
+ import type { OpContextBinding } from '../opContext/types.js';
31
+ import type { LogSchema } from '../schema/LogSchema.js';
32
+ import { Tracer } from '../tracer.js';
33
+ import type { SpanBuffer } from '../types.js';
34
+ /**
35
+ * Snapshot of buffer stats captured before reset during capacity tuning.
36
+ */
37
+ export interface StatsSnapshot<T extends LogSchema = LogSchema> {
38
+ buffer: SpanBuffer<T>;
39
+ totalWrites: number;
40
+ spansCreated: number;
41
+ capacity: number;
42
+ }
43
+ /**
44
+ * Test tracer that accumulates root buffers for inspection.
45
+ *
46
+ * Collects all completed root trace buffers in `rootBuffers` array.
47
+ * Child spans are accessible via the buffer's `_children` tree -
48
+ * no need to track them separately.
49
+ *
50
+ * Also tracks capacity tuning events via `statsSnapshots` to verify
51
+ * that `onStatsWillResetFor` is called before stats are reset.
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * const ctx = defineOpContext({ logSchema });
56
+ * const tracer = new TestTracer(ctx);
57
+ * const { trace } = tracer;
58
+ *
59
+ * await trace('my-op', myOp);
60
+ *
61
+ * // Inspect buffer
62
+ * expect(tracer.rootBuffers).toHaveLength(1);
63
+ * expect(tracer.rootBuffers[0].message_values[0]).toBe('my-op');
64
+ *
65
+ * // Convert to Arrow for detailed inspection
66
+ * const table = convertSpanTreeToArrowTable(tracer.rootBuffers[0]);
67
+ * expect(table.numRows).toBe(2); // span-start + span-ok
68
+ *
69
+ * // Verify capacity tuning was captured
70
+ * expect(tracer.statsSnapshots.length).toBeGreaterThan(0);
71
+ * ```
72
+ */
73
+ export declare class TestTracer<B extends OpContextBinding = OpContextBinding> extends Tracer<B> {
74
+ /**
75
+ * All completed root trace buffers.
76
+ * Child spans are accessible via each buffer's `_children` tree.
77
+ */
78
+ readonly rootBuffers: SpanBuffer<B['logBinding']['logSchema']>[];
79
+ /**
80
+ * Stats snapshots captured before reset during capacity tuning.
81
+ * Used to verify onStatsWillResetFor hook is called correctly.
82
+ */
83
+ readonly statsSnapshots: StatsSnapshot<B['logBinding']['logSchema']>[];
84
+ onTraceStart(_rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
85
+ onTraceEnd(rootBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
86
+ onSpanStart(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
87
+ onSpanEnd(_childBuffer: SpanBuffer<B['logBinding']['logSchema']>): void;
88
+ onStatsWillResetFor(buffer: SpanBuffer<B['logBinding']['logSchema']>): void;
89
+ /**
90
+ * Clear all collected buffers and stats snapshots.
91
+ * Useful for cleanup between tests.
92
+ */
93
+ clear(): void;
94
+ }
95
+ //# sourceMappingURL=TestTracer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestTracer.d.ts","sourceRoot":"","sources":["../../../src/lib/tracers/TestTracer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAU9C;;GAEG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,SAAS,GAAG,SAAS;IAC5D,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,qBAAa,UAAU,CAAC,CAAC,SAAS,gBAAgB,GAAG,gBAAgB,CAAE,SAAQ,MAAM,CAAC,CAAC,CAAC;IACtF;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAEtE;;;OAGG;IACH,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,CAAM;IAM5E,YAAY,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,UAAU,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAKtE,WAAW,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIzE,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAIvE,mBAAmB,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI;IAe3E;;;OAGG;IACH,KAAK,IAAI,IAAI;CASd"}
@@ -0,0 +1,87 @@
1
+ import { Tracer } from '../tracer.js';
2
+ function isResettableBufferStrategy(value) {
3
+ return typeof value === 'object' && value !== null && typeof Reflect.get(value, 'reset') === 'function';
4
+ }
5
+ /**
6
+ * Test tracer that accumulates root buffers for inspection.
7
+ *
8
+ * Collects all completed root trace buffers in `rootBuffers` array.
9
+ * Child spans are accessible via the buffer's `_children` tree -
10
+ * no need to track them separately.
11
+ *
12
+ * Also tracks capacity tuning events via `statsSnapshots` to verify
13
+ * that `onStatsWillResetFor` is called before stats are reset.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * const ctx = defineOpContext({ logSchema });
18
+ * const tracer = new TestTracer(ctx);
19
+ * const { trace } = tracer;
20
+ *
21
+ * await trace('my-op', myOp);
22
+ *
23
+ * // Inspect buffer
24
+ * expect(tracer.rootBuffers).toHaveLength(1);
25
+ * expect(tracer.rootBuffers[0].message_values[0]).toBe('my-op');
26
+ *
27
+ * // Convert to Arrow for detailed inspection
28
+ * const table = convertSpanTreeToArrowTable(tracer.rootBuffers[0]);
29
+ * expect(table.numRows).toBe(2); // span-start + span-ok
30
+ *
31
+ * // Verify capacity tuning was captured
32
+ * expect(tracer.statsSnapshots.length).toBeGreaterThan(0);
33
+ * ```
34
+ */
35
+ export class TestTracer extends Tracer {
36
+ /**
37
+ * All completed root trace buffers.
38
+ * Child spans are accessible via each buffer's `_children` tree.
39
+ */
40
+ rootBuffers = [];
41
+ /**
42
+ * Stats snapshots captured before reset during capacity tuning.
43
+ * Used to verify onStatsWillResetFor hook is called correctly.
44
+ */
45
+ statsSnapshots = [];
46
+ // ===========================================================================
47
+ // Lifecycle hook implementations
48
+ // ===========================================================================
49
+ onTraceStart(_rootBuffer) {
50
+ // No-op - we collect on end, not start
51
+ }
52
+ onTraceEnd(rootBuffer) {
53
+ // Collect the root buffer when trace completes
54
+ this.rootBuffers.push(rootBuffer);
55
+ }
56
+ onSpanStart(_childBuffer) {
57
+ // No-op - children are in tree, accessed via rootBuffer._children
58
+ }
59
+ onSpanEnd(_childBuffer) {
60
+ // No-op - children are in tree, accessed via rootBuffer._children
61
+ }
62
+ onStatsWillResetFor(buffer) {
63
+ // Capture stats snapshot before they're reset
64
+ const stats = buffer._stats;
65
+ this.statsSnapshots.push({
66
+ buffer,
67
+ totalWrites: stats.totalWrites,
68
+ spansCreated: stats.spansCreated,
69
+ capacity: stats.capacity,
70
+ });
71
+ }
72
+ // ===========================================================================
73
+ // Test utilities
74
+ // ===========================================================================
75
+ /**
76
+ * Clear all collected buffers and stats snapshots.
77
+ * Useful for cleanup between tests.
78
+ */
79
+ clear() {
80
+ this.rootBuffers.length = 0;
81
+ this.statsSnapshots.length = 0;
82
+ // Reset the buffer strategy if it supports it (e.g., WasmBufferStrategy)
83
+ if (isResettableBufferStrategy(this.bufferStrategy)) {
84
+ this.bufferStrategy.reset();
85
+ }
86
+ }
87
+ }