@wizeworks/lens-node 0.3.0-alpha.2 → 0.3.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/dist/adapters/elasticsearch.d.ts +21 -0
  2. package/dist/adapters/elasticsearch.d.ts.map +1 -0
  3. package/dist/adapters/elasticsearch.js +93 -0
  4. package/dist/adapters/elasticsearch.js.map +1 -0
  5. package/dist/adapters/ioredis.d.ts +4 -0
  6. package/dist/adapters/ioredis.d.ts.map +1 -0
  7. package/dist/adapters/ioredis.js +60 -0
  8. package/dist/adapters/ioredis.js.map +1 -0
  9. package/dist/adapters/mongodb-shape.d.ts +16 -0
  10. package/dist/adapters/mongodb-shape.d.ts.map +1 -0
  11. package/dist/adapters/mongodb-shape.js +81 -0
  12. package/dist/adapters/mongodb-shape.js.map +1 -0
  13. package/dist/adapters/mongodb.d.ts +4 -0
  14. package/dist/adapters/mongodb.d.ts.map +1 -0
  15. package/dist/adapters/mongodb.js +95 -0
  16. package/dist/adapters/mongodb.js.map +1 -0
  17. package/dist/adapters/nosql.d.ts +14 -0
  18. package/dist/adapters/nosql.d.ts.map +1 -0
  19. package/dist/adapters/nosql.js +61 -0
  20. package/dist/adapters/nosql.js.map +1 -0
  21. package/dist/adapters/redis-shape.d.ts +31 -0
  22. package/dist/adapters/redis-shape.d.ts.map +1 -0
  23. package/dist/adapters/redis-shape.js +80 -0
  24. package/dist/adapters/redis-shape.js.map +1 -0
  25. package/dist/adapters/redis.d.ts +4 -0
  26. package/dist/adapters/redis.d.ts.map +1 -0
  27. package/dist/adapters/redis.js +93 -0
  28. package/dist/adapters/redis.js.map +1 -0
  29. package/dist/adapters/registry.d.ts +2 -0
  30. package/dist/adapters/registry.d.ts.map +1 -1
  31. package/dist/adapters/registry.js +2 -0
  32. package/dist/adapters/registry.js.map +1 -1
  33. package/dist/api.d.ts +5 -1
  34. package/dist/api.d.ts.map +1 -1
  35. package/dist/api.js +25 -7
  36. package/dist/api.js.map +1 -1
  37. package/dist/auto/config.d.ts +14 -0
  38. package/dist/auto/config.d.ts.map +1 -0
  39. package/dist/auto/config.js +51 -0
  40. package/dist/auto/config.js.map +1 -0
  41. package/dist/auto/esm-loader.d.ts +10 -0
  42. package/dist/auto/esm-loader.d.ts.map +1 -0
  43. package/dist/auto/esm-loader.js +10 -0
  44. package/dist/auto/esm-loader.js.map +1 -0
  45. package/dist/auto/esm-source.d.ts +15 -0
  46. package/dist/auto/esm-source.d.ts.map +1 -0
  47. package/dist/auto/esm-source.js +23 -0
  48. package/dist/auto/esm-source.js.map +1 -0
  49. package/dist/auto/frameworks.d.ts +3 -0
  50. package/dist/auto/frameworks.d.ts.map +1 -0
  51. package/dist/auto/frameworks.js +112 -0
  52. package/dist/auto/frameworks.js.map +1 -0
  53. package/dist/auto/handle.d.ts +7 -0
  54. package/dist/auto/handle.d.ts.map +1 -0
  55. package/dist/auto/handle.js +47 -0
  56. package/dist/auto/handle.js.map +1 -0
  57. package/dist/auto/hono.d.ts +3 -0
  58. package/dist/auto/hono.d.ts.map +1 -0
  59. package/dist/auto/hono.js +43 -0
  60. package/dist/auto/hono.js.map +1 -0
  61. package/dist/auto/http.d.ts +18 -0
  62. package/dist/auto/http.d.ts.map +1 -0
  63. package/dist/auto/http.js +77 -0
  64. package/dist/auto/http.js.map +1 -0
  65. package/dist/auto/install.d.ts +5 -0
  66. package/dist/auto/install.d.ts.map +1 -0
  67. package/dist/auto/install.js +26 -0
  68. package/dist/auto/install.js.map +1 -0
  69. package/dist/auto/libraries.d.ts +3 -0
  70. package/dist/auto/libraries.d.ts.map +1 -0
  71. package/dist/auto/libraries.js +108 -0
  72. package/dist/auto/libraries.js.map +1 -0
  73. package/dist/auto/module-hooks.d.ts +14 -0
  74. package/dist/auto/module-hooks.d.ts.map +1 -0
  75. package/dist/auto/module-hooks.js +90 -0
  76. package/dist/auto/module-hooks.js.map +1 -0
  77. package/dist/auto/nest.d.ts +7 -0
  78. package/dist/auto/nest.d.ts.map +1 -0
  79. package/dist/auto/nest.js +26 -0
  80. package/dist/auto/nest.js.map +1 -0
  81. package/dist/auto/owner.d.ts +19 -0
  82. package/dist/auto/owner.d.ts.map +1 -0
  83. package/dist/auto/owner.js +52 -0
  84. package/dist/auto/owner.js.map +1 -0
  85. package/dist/auto/prisma.d.ts +3 -0
  86. package/dist/auto/prisma.d.ts.map +1 -0
  87. package/dist/auto/prisma.js +55 -0
  88. package/dist/auto/prisma.js.map +1 -0
  89. package/dist/auto/sqlite.d.ts +3 -0
  90. package/dist/auto/sqlite.d.ts.map +1 -0
  91. package/dist/auto/sqlite.js +31 -0
  92. package/dist/auto/sqlite.js.map +1 -0
  93. package/dist/auto/state.d.ts +14 -0
  94. package/dist/auto/state.d.ts.map +1 -0
  95. package/dist/auto/state.js +16 -0
  96. package/dist/auto/state.js.map +1 -0
  97. package/dist/auto.d.ts +2 -0
  98. package/dist/auto.d.ts.map +1 -0
  99. package/dist/auto.js +4 -0
  100. package/dist/auto.js.map +1 -0
  101. package/dist/capture.d.ts +3 -1
  102. package/dist/capture.d.ts.map +1 -1
  103. package/dist/capture.js +4 -4
  104. package/dist/capture.js.map +1 -1
  105. package/dist/client-attributes.d.ts +19 -0
  106. package/dist/client-attributes.d.ts.map +1 -0
  107. package/dist/client-attributes.js +56 -0
  108. package/dist/client-attributes.js.map +1 -0
  109. package/dist/client-spans.d.ts +6 -4
  110. package/dist/client-spans.d.ts.map +1 -1
  111. package/dist/client-spans.js +20 -9
  112. package/dist/client-spans.js.map +1 -1
  113. package/dist/db.js +1 -1
  114. package/dist/db.js.map +1 -1
  115. package/dist/frameworks/fastify.d.ts.map +1 -1
  116. package/dist/frameworks/fastify.js +4 -2
  117. package/dist/frameworks/fastify.js.map +1 -1
  118. package/dist/frameworks/hono.d.ts +16 -0
  119. package/dist/frameworks/hono.d.ts.map +1 -1
  120. package/dist/frameworks/hono.js +4 -4
  121. package/dist/frameworks/hono.js.map +1 -1
  122. package/dist/frameworks/koa.d.ts +2 -0
  123. package/dist/frameworks/koa.d.ts.map +1 -1
  124. package/dist/frameworks/koa.js +4 -4
  125. package/dist/frameworks/koa.js.map +1 -1
  126. package/dist/frameworks/nest-errors.d.ts +10 -0
  127. package/dist/frameworks/nest-errors.d.ts.map +1 -0
  128. package/dist/frameworks/nest-errors.js +75 -0
  129. package/dist/frameworks/nest-errors.js.map +1 -0
  130. package/dist/frameworks/nest-route.d.ts +31 -0
  131. package/dist/frameworks/nest-route.d.ts.map +1 -0
  132. package/dist/frameworks/nest-route.js +58 -0
  133. package/dist/frameworks/nest-route.js.map +1 -0
  134. package/dist/frameworks/nest.d.ts +16 -0
  135. package/dist/frameworks/nest.d.ts.map +1 -0
  136. package/dist/frameworks/nest.js +73 -0
  137. package/dist/frameworks/nest.js.map +1 -0
  138. package/dist/frameworks/node-server.d.ts +3 -0
  139. package/dist/frameworks/node-server.d.ts.map +1 -1
  140. package/dist/frameworks/node-server.js +5 -3
  141. package/dist/frameworks/node-server.js.map +1 -1
  142. package/dist/graphql/document.d.ts +13 -0
  143. package/dist/graphql/document.d.ts.map +1 -0
  144. package/dist/graphql/document.js +62 -0
  145. package/dist/graphql/document.js.map +1 -0
  146. package/dist/graphql/index.d.ts +11 -0
  147. package/dist/graphql/index.d.ts.map +1 -0
  148. package/dist/graphql/index.js +83 -0
  149. package/dist/graphql/index.js.map +1 -0
  150. package/dist/graphql/operation.d.ts +37 -0
  151. package/dist/graphql/operation.d.ts.map +1 -0
  152. package/dist/graphql/operation.js +58 -0
  153. package/dist/graphql/operation.js.map +1 -0
  154. package/dist/graphql/resolvers.d.ts +5 -0
  155. package/dist/graphql/resolvers.d.ts.map +1 -0
  156. package/dist/graphql/resolvers.js +79 -0
  157. package/dist/graphql/resolvers.js.map +1 -0
  158. package/dist/graphql/shared.d.ts +14 -0
  159. package/dist/graphql/shared.d.ts.map +1 -0
  160. package/dist/graphql/shared.js +21 -0
  161. package/dist/graphql/shared.js.map +1 -0
  162. package/dist/http-client.d.ts +8 -0
  163. package/dist/http-client.d.ts.map +1 -0
  164. package/dist/http-client.js +132 -0
  165. package/dist/http-client.js.map +1 -0
  166. package/dist/hub-connect.d.ts +2 -0
  167. package/dist/hub-connect.d.ts.map +1 -1
  168. package/dist/hub-connect.js +3 -1
  169. package/dist/hub-connect.js.map +1 -1
  170. package/dist/index.d.ts +12 -0
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +9 -0
  173. package/dist/index.js.map +1 -1
  174. package/dist/info.d.ts +2 -0
  175. package/dist/info.d.ts.map +1 -1
  176. package/dist/info.js +1 -1
  177. package/dist/info.js.map +1 -1
  178. package/dist/kit.d.ts +3 -1
  179. package/dist/kit.d.ts.map +1 -1
  180. package/dist/kit.js +1 -0
  181. package/dist/kit.js.map +1 -1
  182. package/dist/logger.d.ts +4 -4
  183. package/dist/logger.d.ts.map +1 -1
  184. package/dist/logger.js +11 -7
  185. package/dist/logger.js.map +1 -1
  186. package/dist/logs/bunyan.d.ts +1 -1
  187. package/dist/logs/bunyan.d.ts.map +1 -1
  188. package/dist/logs/bunyan.js +2 -3
  189. package/dist/logs/bunyan.js.map +1 -1
  190. package/dist/logs/consola.d.ts +1 -1
  191. package/dist/logs/consola.d.ts.map +1 -1
  192. package/dist/logs/consola.js +1 -1
  193. package/dist/logs/consola.js.map +1 -1
  194. package/dist/logs/console.d.ts +1 -1
  195. package/dist/logs/console.d.ts.map +1 -1
  196. package/dist/logs/console.js +5 -3
  197. package/dist/logs/console.js.map +1 -1
  198. package/dist/logs/otel.d.ts.map +1 -1
  199. package/dist/logs/otel.js +1 -3
  200. package/dist/logs/otel.js.map +1 -1
  201. package/dist/logs/pino.d.ts +1 -1
  202. package/dist/logs/pino.d.ts.map +1 -1
  203. package/dist/logs/pino.js +2 -3
  204. package/dist/logs/pino.js.map +1 -1
  205. package/dist/logs/winston.d.ts +1 -1
  206. package/dist/logs/winston.d.ts.map +1 -1
  207. package/dist/logs/winston.js +2 -3
  208. package/dist/logs/winston.js.map +1 -1
  209. package/dist/loose-logs.d.ts +13 -0
  210. package/dist/loose-logs.d.ts.map +1 -0
  211. package/dist/loose-logs.js +21 -0
  212. package/dist/loose-logs.js.map +1 -0
  213. package/dist/mcp-find.d.ts +2 -2
  214. package/dist/mcp-find.d.ts.map +1 -1
  215. package/dist/mcp-find.js +68 -26
  216. package/dist/mcp-find.js.map +1 -1
  217. package/dist/mcp-memory.d.ts +7 -0
  218. package/dist/mcp-memory.d.ts.map +1 -0
  219. package/dist/mcp-memory.js +10 -0
  220. package/dist/mcp-memory.js.map +1 -0
  221. package/dist/mcp-metrics.d.ts +2 -2
  222. package/dist/mcp-metrics.d.ts.map +1 -1
  223. package/dist/mcp-metrics.js +11 -9
  224. package/dist/mcp-metrics.js.map +1 -1
  225. package/dist/mcp-overview.d.ts +5 -0
  226. package/dist/mcp-overview.d.ts.map +1 -0
  227. package/dist/mcp-overview.js +71 -0
  228. package/dist/mcp-overview.js.map +1 -0
  229. package/dist/mcp-page.d.ts +28 -0
  230. package/dist/mcp-page.d.ts.map +1 -0
  231. package/dist/mcp-page.js +77 -0
  232. package/dist/mcp-page.js.map +1 -0
  233. package/dist/mcp-problems.d.ts +5 -0
  234. package/dist/mcp-problems.d.ts.map +1 -0
  235. package/dist/mcp-problems.js +56 -0
  236. package/dist/mcp-problems.js.map +1 -0
  237. package/dist/mcp-projects.d.ts +11 -0
  238. package/dist/mcp-projects.d.ts.map +1 -0
  239. package/dist/mcp-projects.js +54 -0
  240. package/dist/mcp-projects.js.map +1 -0
  241. package/dist/mcp-search.d.ts +5 -0
  242. package/dist/mcp-search.d.ts.map +1 -0
  243. package/dist/mcp-search.js +53 -0
  244. package/dist/mcp-search.js.map +1 -0
  245. package/dist/mcp-shared.d.ts +83 -4
  246. package/dist/mcp-shared.d.ts.map +1 -1
  247. package/dist/mcp-shared.js +3 -0
  248. package/dist/mcp-shared.js.map +1 -1
  249. package/dist/mcp-store.d.ts +27 -0
  250. package/dist/mcp-store.d.ts.map +1 -0
  251. package/dist/mcp-store.js +56 -0
  252. package/dist/mcp-store.js.map +1 -0
  253. package/dist/mcp-tags.d.ts +8 -0
  254. package/dist/mcp-tags.d.ts.map +1 -0
  255. package/dist/mcp-tags.js +22 -0
  256. package/dist/mcp-tags.js.map +1 -0
  257. package/dist/mcp-traces.d.ts +2 -2
  258. package/dist/mcp-traces.d.ts.map +1 -1
  259. package/dist/mcp-traces.js +37 -25
  260. package/dist/mcp-traces.js.map +1 -1
  261. package/dist/mcp-traffic.d.ts +5 -0
  262. package/dist/mcp-traffic.d.ts.map +1 -0
  263. package/dist/mcp-traffic.js +87 -0
  264. package/dist/mcp-traffic.js.map +1 -0
  265. package/dist/mcp.d.ts +7 -4
  266. package/dist/mcp.d.ts.map +1 -1
  267. package/dist/mcp.js +27 -8
  268. package/dist/mcp.js.map +1 -1
  269. package/dist/messaging/bullmq.d.ts +4 -0
  270. package/dist/messaging/bullmq.d.ts.map +1 -0
  271. package/dist/messaging/bullmq.js +137 -0
  272. package/dist/messaging/bullmq.js.map +1 -0
  273. package/dist/messaging/shared.d.ts +10 -4
  274. package/dist/messaging/shared.d.ts.map +1 -1
  275. package/dist/messaging/shared.js +13 -4
  276. package/dist/messaging/shared.js.map +1 -1
  277. package/dist/messaging/sqs-message.d.ts +35 -0
  278. package/dist/messaging/sqs-message.d.ts.map +1 -0
  279. package/dist/messaging/sqs-message.js +66 -0
  280. package/dist/messaging/sqs-message.js.map +1 -0
  281. package/dist/messaging/sqs.d.ts +4 -0
  282. package/dist/messaging/sqs.d.ts.map +1 -0
  283. package/dist/messaging/sqs.js +104 -0
  284. package/dist/messaging/sqs.js.map +1 -0
  285. package/dist/processor.d.ts +2 -1
  286. package/dist/processor.d.ts.map +1 -1
  287. package/dist/processor.js +8 -3
  288. package/dist/processor.js.map +1 -1
  289. package/dist/request-capture.d.ts +7 -1
  290. package/dist/request-capture.d.ts.map +1 -1
  291. package/dist/request-capture.js +14 -1
  292. package/dist/request-capture.js.map +1 -1
  293. package/dist/request-naming.d.ts +8 -0
  294. package/dist/request-naming.d.ts.map +1 -0
  295. package/dist/request-naming.js +29 -0
  296. package/dist/request-naming.js.map +1 -0
  297. package/dist/sampling.d.ts.map +1 -1
  298. package/dist/sampling.js +2 -2
  299. package/dist/sampling.js.map +1 -1
  300. package/dist/search-api.d.ts +8 -0
  301. package/dist/search-api.d.ts.map +1 -0
  302. package/dist/search-api.js +21 -0
  303. package/dist/search-api.js.map +1 -0
  304. package/dist/sourcemaps.d.ts +15 -0
  305. package/dist/sourcemaps.d.ts.map +1 -0
  306. package/dist/sourcemaps.js +68 -0
  307. package/dist/sourcemaps.js.map +1 -0
  308. package/dist/spans.d.ts +3 -0
  309. package/dist/spans.d.ts.map +1 -1
  310. package/dist/spans.js +9 -1
  311. package/dist/spans.js.map +1 -1
  312. package/dist/store-entries.d.ts +34 -0
  313. package/dist/store-entries.d.ts.map +1 -0
  314. package/dist/store-entries.js +70 -0
  315. package/dist/store-entries.js.map +1 -0
  316. package/dist/store.d.ts +4 -1
  317. package/dist/store.d.ts.map +1 -1
  318. package/dist/store.js +19 -22
  319. package/dist/store.js.map +1 -1
  320. package/dist/tags-api.d.ts +9 -0
  321. package/dist/tags-api.d.ts.map +1 -0
  322. package/dist/tags-api.js +16 -0
  323. package/dist/tags-api.js.map +1 -0
  324. package/dist/tracing.d.ts +6 -0
  325. package/dist/tracing.d.ts.map +1 -1
  326. package/dist/tracing.js +11 -7
  327. package/dist/tracing.js.map +1 -1
  328. package/dist/types.d.ts +16 -2
  329. package/dist/types.d.ts.map +1 -1
  330. package/dist/ui.d.ts.map +1 -1
  331. package/dist/ui.js +3 -2
  332. package/dist/ui.js.map +1 -1
  333. package/dist/wizelens.d.ts +3 -1
  334. package/dist/wizelens.d.ts.map +1 -1
  335. package/dist/wizelens.js +29 -13
  336. package/dist/wizelens.js.map +1 -1
  337. package/package.json +14 -4
@@ -0,0 +1,21 @@
1
+ import type { WizeLens } from "../types.js";
2
+ interface EsRequest {
3
+ method?: string;
4
+ path?: string;
5
+ body?: unknown;
6
+ bulkBody?: unknown;
7
+ querystring?: unknown;
8
+ meta?: {
9
+ name?: string;
10
+ };
11
+ }
12
+ /** The path with ids as `?` and no query string: "/orders/_doc/?" for "/orders/_doc/42". Numbers in the index name are `?` too. */
13
+ export declare function esPathShape(path: string | undefined): string;
14
+ /** The API name: the client's own (search, index, bulk...), else read from the method and path. */
15
+ export declare function esOperation(req: EsRequest): string;
16
+ /** Rows of a response: search hits, bulk items, mget docs, msearch responses, or documents changed by query. */
17
+ export declare function esRows(result: unknown): number | undefined;
18
+ /** Trace every Elasticsearch request (v8 client; v7 works too). Pass `@elastic/elasticsearch`, `@elastic/transport`, or a Client. Returns false when nothing was patched. */
19
+ export declare function instrumentElasticsearch(wizelens: WizeLens, target: unknown): boolean;
20
+ export {};
21
+ //# sourceMappingURL=elasticsearch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elasticsearch.d.ts","sourceRoot":"","sources":["../../src/adapters/elasticsearch.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,QAAQ,EAAE,MAAM,aAAa,CAAC;AAIxD,UAAU,SAAS;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1B;AAsBD,mIAAmI;AACnI,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ5D;AAKD,mGAAmG;AACnG,wBAAgB,WAAW,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,CAQlD;AAOD,gHAAgH;AAChH,wBAAgB,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAI1D;AA0CD,6KAA6K;AAC7K,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAMpF"}
@@ -0,0 +1,93 @@
1
+ import { ATTR_DB_FINGERPRINT } from "@wizeworks/lens-core";
2
+ import { fingerprint, isIdLike, runChecked, serverAttributes } from "./nosql.js";
3
+ import { dbSpansOf, patchMethod } from "./registry.js";
4
+ // After these, the next path part is a document id.
5
+ const DOC_APIS = new Set(["_doc", "_create", "_update", "_source", "_explain", "_termvectors"]);
6
+ const BULK_ACTIONS = new Set(["index", "create", "update", "delete"]);
7
+ const partsOf = (path) => (path ?? "/").split("?")[0].split("/");
8
+ /** The path with ids as `?` and no query string: "/orders/_doc/?" for "/orders/_doc/42". Numbers in the index name are `?` too. */
9
+ export function esPathShape(path) {
10
+ const parts = partsOf(path);
11
+ const shaped = parts.map((part, i) => {
12
+ if (part === "" || part.startsWith("_"))
13
+ return part;
14
+ if (i === 1)
15
+ return part.replace(/\d+/g, "?");
16
+ return DOC_APIS.has(parts[i - 1]) || isIdLike(part) ? "?" : part;
17
+ });
18
+ return shaped.join("/") || "/";
19
+ }
20
+ const DOC_OPS = { GET: "get", HEAD: "exists", DELETE: "delete" };
21
+ const INDEX_OPS = { PUT: "indices.create", DELETE: "indices.delete", HEAD: "indices.exists" };
22
+ /** The API name: the client's own (search, index, bulk...), else read from the method and path. */
23
+ export function esOperation(req) {
24
+ if (req.meta?.name)
25
+ return req.meta.name;
26
+ const method = (req.method ?? "GET").toUpperCase();
27
+ const parts = partsOf(req.path).filter(Boolean);
28
+ const api = parts.findLast((p) => p.startsWith("_"));
29
+ if (api === "_doc")
30
+ return DOC_OPS[method] ?? "index";
31
+ if (api)
32
+ return api.slice(1);
33
+ return parts.length === 0 ? "info" : (INDEX_OPS[method] ?? "indices.get");
34
+ }
35
+ const bodyOf = (result) => {
36
+ const r = result;
37
+ return (r && typeof r === "object" && "statusCode" in r && "body" in r ? r.body : r);
38
+ };
39
+ /** Rows of a response: search hits, bulk items, mget docs, msearch responses, or documents changed by query. */
40
+ export function esRows(result) {
41
+ const b = bodyOf(result);
42
+ if (!b || typeof b !== "object")
43
+ return undefined;
44
+ return b.hits?.hits?.length ?? b.items?.length ?? b.docs?.length ?? b.responses?.length ?? b.deleted ?? b.updated;
45
+ }
46
+ const bulkError = (result) => (bodyOf(result)?.errors === true ? new Error("Elasticsearch bulk request had failed items") : undefined);
47
+ const isAction = (line) => typeof line === "object" && line !== null && Object.keys(line).length === 1 && BULK_ACTIONS.has(Object.keys(line)[0]);
48
+ function callOf(transport, req) {
49
+ const method = (req.method ?? "GET").toUpperCase();
50
+ const first = partsOf(req.path)[1];
51
+ const index = first && !first.startsWith("_") ? first : undefined;
52
+ const url = transport.connectionPool?.connections?.[0]?.url;
53
+ const body = req.body ?? req.bulkBody;
54
+ const attributes = { ...serverAttributes(url?.hostname, url?.port), [ATTR_DB_FINGERPRINT]: fingerprint([method, req.path, req.querystring, body]) };
55
+ if (Array.isArray(body) && body.some(isAction))
56
+ attributes["db.operation.batch.size"] = body.filter(isAction).length;
57
+ const info = { system: "elasticsearch", adapter: "elasticsearch", operation: esOperation(req), namespace: index, collection: index, rowsOf: esRows, requireParent: true, attributes };
58
+ return { info, text: `${method} ${esPathShape(req.path)}` };
59
+ }
60
+ function traceRequest(proto, start) {
61
+ patchMethod(proto, "request", (original) => function (...args) {
62
+ const req = args[0];
63
+ if (!req || typeof req.path !== "string")
64
+ return original.apply(this, args);
65
+ const { info, text } = callOf(this, req);
66
+ return runChecked(start(info, text, undefined), args, (a) => original.apply(this, a), bulkError);
67
+ });
68
+ }
69
+ /** Transport prototypes: from the client module, the transport module, a Client, or a transport. */
70
+ function prototypesOf(target, depth = 0) {
71
+ const t = target;
72
+ if (!t || depth > 3)
73
+ return [];
74
+ if (typeof target === "function")
75
+ return typeof t.prototype?.request === "function" ? [t.prototype] : [];
76
+ const fromModule = [t.Transport, t.SniffingTransport, t.default].flatMap((m) => prototypesOf(m, depth + 1));
77
+ if (fromModule.length > 0)
78
+ return fromModule;
79
+ if (t.transport)
80
+ return prototypesOf(t.transport, depth + 1);
81
+ return typeof t.request === "function" && t.connectionPool ? [Object.getPrototypeOf(t)] : [];
82
+ }
83
+ /** Trace every Elasticsearch request (v8 client; v7 works too). Pass `@elastic/elasticsearch`, `@elastic/transport`, or a Client. Returns false when nothing was patched. */
84
+ export function instrumentElasticsearch(wizelens, target) {
85
+ const start = dbSpansOf(wizelens);
86
+ const protos = prototypesOf(target);
87
+ if (!start || protos.length === 0)
88
+ return false;
89
+ for (const proto of protos)
90
+ traceRequest(proto, start);
91
+ return true;
92
+ }
93
+ //# sourceMappingURL=elasticsearch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"elasticsearch.js","sourceRoot":"","sources":["../../src/adapters/elasticsearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WizeLens } from "../types.js";
2
+ /** Trace every ioredis command, pipeline, and MULTI. Pass the `ioredis` module (covers Redis, Cluster, and pipelines) or a client. Returns false when nothing was patched. */
3
+ export declare function instrumentIoRedis(wizelens: WizeLens, target: unknown): boolean;
4
+ //# sourceMappingURL=ioredis.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ioredis.d.ts","sourceRoot":"","sources":["../../src/adapters/ioredis.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAyE5C,8KAA8K;AAC9K,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAO9E"}
@@ -0,0 +1,60 @@
1
+ import { runTraced } from "../db.js";
2
+ import { runChecked } from "./nosql.js";
3
+ import { batchCall, commandCall, replyError } from "./redis-shape.js";
4
+ import { dbSpansOf, patchMethod } from "./registry.js";
5
+ // A command the offline queue or a cluster sends again is the same call: one span.
6
+ const traced = new WeakSet();
7
+ function connOf(client) {
8
+ const o = client?.options ?? {};
9
+ return { namespace: String(client?.condition?.select ?? o.db ?? 0), host: o.path ? undefined : o.host, port: o.port };
10
+ }
11
+ function traceSend(proto, start) {
12
+ patchMethod(proto, "sendCommand", (original) => function (...args) {
13
+ const command = args[0];
14
+ const stream = args[1];
15
+ if (!command?.name || stream?.isPipeline || traced.has(command))
16
+ return original.apply(this, args);
17
+ traced.add(command);
18
+ const { info, text } = commandCall("ioredis", { name: command.name, args: command.args ?? [] }, connOf(this));
19
+ return runTraced(start(info, text, undefined), [], () => original.apply(this, args));
20
+ });
21
+ }
22
+ function traceExec(proto, start) {
23
+ patchMethod(proto, "exec", (original) => function (...args) {
24
+ const queue = (this._queue ?? []).map((c) => ({ name: String(c.name ?? ""), args: c.args ?? [] }));
25
+ const kind = queue.some((c) => c.name.toLowerCase() === "multi") ? "MULTI" : "PIPELINE";
26
+ const cmds = queue.filter((c) => !["multi", "exec"].includes(c.name.toLowerCase()));
27
+ if (cmds.length === 0)
28
+ return original.apply(this, args);
29
+ const { info, text } = batchCall("ioredis", kind, cmds, connOf(this.redis));
30
+ return runChecked(start(info, text, undefined), [], () => original.apply(this, args), replyError);
31
+ });
32
+ }
33
+ const protoOf = (c) => (c?.prototype ? [c.prototype] : []);
34
+ /** Client prototypes (Redis, Cluster) and the Pipeline prototype, from the module, its default export, or a client. */
35
+ function targetsOf(target) {
36
+ const t = target;
37
+ if (typeof target === "function" && typeof t?.prototype?.sendCommand === "function") {
38
+ return { clients: [...protoOf(t), ...protoOf(t.Cluster)], pipelines: protoOf(t.Pipeline) };
39
+ }
40
+ if (t?.Redis || t?.default)
41
+ return targetsOf(t.Redis ?? t.default);
42
+ if (t && typeof t.sendCommand === "function") {
43
+ const made = typeof t.pipeline === "function" ? t.pipeline() : undefined;
44
+ return { clients: [Object.getPrototypeOf(t)], pipelines: made ? [Object.getPrototypeOf(made)] : [] };
45
+ }
46
+ return { clients: [], pipelines: [] };
47
+ }
48
+ /** Trace every ioredis command, pipeline, and MULTI. Pass the `ioredis` module (covers Redis, Cluster, and pipelines) or a client. Returns false when nothing was patched. */
49
+ export function instrumentIoRedis(wizelens, target) {
50
+ const start = dbSpansOf(wizelens);
51
+ const { clients, pipelines } = targetsOf(target);
52
+ if (!start || clients.length === 0)
53
+ return false;
54
+ for (const proto of clients)
55
+ traceSend(proto, start);
56
+ for (const proto of pipelines)
57
+ traceExec(proto, start);
58
+ return true;
59
+ }
60
+ //# sourceMappingURL=ioredis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ioredis.js","sourceRoot":"","sources":["../../src/adapters/ioredis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /** A field path with array indexes and id-like parts as `?`: "items.0.qty" is "items.?.qty". */
2
+ export declare const fieldShape: (field: string) => string;
3
+ /** A filter, update, or pipeline with every value as `?`: {"status":?,"total":{"$gt":?}}. Lists of values are one `?`. */
4
+ export declare function docShape(value: unknown, depth?: number): string;
5
+ /** The shapes a method's arguments show in the query text. */
6
+ type ShapeOf = (args: readonly unknown[]) => string[];
7
+ /** Collection methods that run at once. Inserted documents and replacements are never shown. */
8
+ export declare const MONGO_METHODS: Readonly<Record<string, ShapeOf>>;
9
+ /** Collection methods that return a cursor: the span starts when the cursor first fetches. */
10
+ export declare const MONGO_CURSORS: Readonly<Record<string, ShapeOf>>;
11
+ /** Rows of a result: documents in a list, the write counts, or 1 / 0 for one document. Plain counts are not rows. */
12
+ export declare function mongoRows(result: unknown): number | undefined;
13
+ /** Operations in a bulkWrite, for `db.operation.batch.size`. */
14
+ export declare const batchSizeOf: (method: string, args: readonly unknown[]) => number | undefined;
15
+ export {};
16
+ //# sourceMappingURL=mongodb-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb-shape.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb-shape.ts"],"names":[],"mappings":"AAUA,gGAAgG;AAChG,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,MAI7B,CAAC;AAEf,0HAA0H;AAC1H,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CAY1D;AAED,8DAA8D;AAC9D,KAAK,OAAO,GAAG,CAAC,IAAI,EAAE,SAAS,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;AAQtD,gGAAgG;AAChG,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAmB3D,CAAC;AAEF,8FAA8F;AAC9F,eAAO,MAAM,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAyC,CAAC;AAItG,qHAAqH;AACrH,wBAAgB,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAS7D;AAED,gEAAgE;AAChE,eAAO,MAAM,WAAW,WAAY,MAAM,QAAQ,SAAS,OAAO,EAAE,KAAG,MAAM,GAAG,SAA4F,CAAC"}
@@ -0,0 +1,81 @@
1
+ const MAX_DEPTH = 6;
2
+ const MAX_FIELDS = 30;
3
+ const MAX_ITEMS = 20;
4
+ function isPlain(value) {
5
+ if (typeof value !== "object" || value === null || "_bsontype" in value)
6
+ return false;
7
+ const proto = Object.getPrototypeOf(value);
8
+ return proto === Object.prototype || proto === null;
9
+ }
10
+ /** A field path with array indexes and id-like parts as `?`: "items.0.qty" is "items.?.qty". */
11
+ export const fieldShape = (field) => field
12
+ .split(".")
13
+ .map((part) => (/^\d+$/.test(part) || part.length >= 24 ? "?" : part))
14
+ .join(".");
15
+ /** A filter, update, or pipeline with every value as `?`: {"status":?,"total":{"$gt":?}}. Lists of values are one `?`. */
16
+ export function docShape(value, depth = 0) {
17
+ if (Array.isArray(value)) {
18
+ if (value.length === 0)
19
+ return "[]";
20
+ if (!value.every(isPlain))
21
+ return "?";
22
+ return `[${[...new Set(value.slice(0, MAX_ITEMS).map((v) => docShape(v, depth + 1)))].join(",")}]`;
23
+ }
24
+ if (!isPlain(value))
25
+ return "?";
26
+ if (depth >= MAX_DEPTH)
27
+ return "{…}";
28
+ const keys = Object.keys(value);
29
+ const fields = keys.slice(0, MAX_FIELDS).map((k) => `${JSON.stringify(fieldShape(k))}:${docShape(value[k], depth + 1)}`);
30
+ if (keys.length > MAX_FIELDS)
31
+ fields.push("…");
32
+ return `{${fields.join(",")}}`;
33
+ }
34
+ const filter = (a) => [docShape(a[0] ?? {})];
35
+ const filterAndUpdate = (a) => [docShape(a[0] ?? {}), docShape(a[1])];
36
+ const pipeline = (a) => [docShape(a[0] ?? [])];
37
+ const none = () => [];
38
+ const distinct = (a) => [typeof a[0] === "string" ? fieldShape(a[0]) : "?", docShape(a[1] ?? {})];
39
+ /** Collection methods that run at once. Inserted documents and replacements are never shown. */
40
+ export const MONGO_METHODS = {
41
+ findOne: filter,
42
+ countDocuments: filter,
43
+ count: filter,
44
+ deleteOne: filter,
45
+ deleteMany: filter,
46
+ findOneAndDelete: filter,
47
+ replaceOne: filter,
48
+ findOneAndReplace: filter,
49
+ updateOne: filterAndUpdate,
50
+ updateMany: filterAndUpdate,
51
+ findOneAndUpdate: filterAndUpdate,
52
+ insertOne: none,
53
+ insertMany: none,
54
+ bulkWrite: none,
55
+ estimatedDocumentCount: none,
56
+ distinct,
57
+ createIndex: filter,
58
+ drop: none,
59
+ };
60
+ /** Collection methods that return a cursor: the span starts when the cursor first fetches. */
61
+ export const MONGO_CURSORS = { find: filter, aggregate: pipeline };
62
+ const COUNTS = ["insertedCount", "modifiedCount", "upsertedCount", "deletedCount"];
63
+ /** Rows of a result: documents in a list, the write counts, or 1 / 0 for one document. Plain counts are not rows. */
64
+ export function mongoRows(result) {
65
+ if (Array.isArray(result))
66
+ return result.length;
67
+ if (result === null)
68
+ return 0;
69
+ if (typeof result !== "object")
70
+ return undefined;
71
+ const r = result;
72
+ const counts = COUNTS.map((k) => r[k]).filter((v) => typeof v === "number");
73
+ if (counts.length > 0)
74
+ return counts.reduce((t, n) => t + n, 0);
75
+ if ("ok" in r && "value" in r)
76
+ return r.value ? 1 : 0;
77
+ return 1;
78
+ }
79
+ /** Operations in a bulkWrite, for `db.operation.batch.size`. */
80
+ export const batchSizeOf = (method, args) => (method === "bulkWrite" && Array.isArray(args[0]) ? args[0].length : undefined);
81
+ //# sourceMappingURL=mongodb-shape.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb-shape.js","sourceRoot":"","sources":["../../src/adapters/mongodb-shape.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { WizeLens } from "../types.js";
2
+ /** Trace MongoDB collection calls (find, findOne, insert, update, delete, aggregate, count, bulkWrite...). Pass the `mongodb` module, a MongoClient, a Db, or a collection. Returns false when nothing was patched. */
3
+ export declare function instrumentMongoDb(wizelens: WizeLens, target: unknown): boolean;
4
+ //# sourceMappingURL=mongodb.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb.d.ts","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAc,QAAQ,EAAE,MAAM,aAAa,CAAC;AAsGxD,uNAAuN;AACvN,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CAO9E"}
@@ -0,0 +1,95 @@
1
+ import { ATTR_DB_FINGERPRINT } from "@wizeworks/lens-core";
2
+ import { runTraced } from "../db.js";
3
+ import { batchSizeOf, MONGO_CURSORS, MONGO_METHODS, mongoRows } from "./mongodb-shape.js";
4
+ import { clip, fingerprint, serverAttributes } from "./nosql.js";
5
+ import { dbSpansOf, patchMethod } from "./registry.js";
6
+ const CURSOR_METHODS = ["toArray", "next", "tryNext", "hasNext", "forEach"];
7
+ /** The values a call ran with, for the fingerprint: its arguments, and the cursor's options set by chaining. */
8
+ const valuesOf = (args, cursor) => [...args.filter((a) => typeof a !== "function"), cursor?.findOptions, cursor?.pipeline];
9
+ function callOf(coll, method, shapeOf, args, cursor) {
10
+ const collection = coll.collectionName ?? coll.s?.namespace?.collection ?? "";
11
+ const client = coll.client ?? coll.s?.db?.client ?? coll.s?.db?.s?.client;
12
+ const host = client?.options?.hosts?.[0];
13
+ const batch = batchSizeOf(method, args);
14
+ const attributes = { ...serverAttributes(host?.host, host?.port), [ATTR_DB_FINGERPRINT]: fingerprint([method, ...valuesOf(args, cursor)]) };
15
+ if (batch !== undefined)
16
+ attributes["db.operation.batch.size"] = batch;
17
+ const info = { system: "mongodb", adapter: "mongodb", operation: method, collection: collection || undefined, namespace: coll.dbName ?? coll.s?.namespace?.db, rowsOf: mongoRows, requireParent: true, attributes };
18
+ return { info, text: clip([method, collection, ...shapeOf(args)].filter(Boolean).join(" ")) };
19
+ }
20
+ function wrapOnce(target, name, open) {
21
+ const original = target[name];
22
+ if (typeof original !== "function")
23
+ return;
24
+ target[name] = function (...args) {
25
+ // forEach takes the per-document function last: it is not a done callback.
26
+ const callArgs = name === "forEach" ? [] : args;
27
+ return runTraced(open(), callArgs, (a) => original.apply(this, name === "forEach" ? args : a));
28
+ };
29
+ }
30
+ /** One span per cursor, around its first fetch: the whole toArray, or the first next or for-await step. */
31
+ function traceCursor(cursor, open) {
32
+ let opened = false;
33
+ const once = () => {
34
+ if (opened)
35
+ return null;
36
+ opened = true;
37
+ return open();
38
+ };
39
+ for (const name of CURSOR_METHODS)
40
+ wrapOnce(cursor, name, once);
41
+ const iterate = cursor[Symbol.asyncIterator];
42
+ if (typeof iterate !== "function")
43
+ return;
44
+ cursor[Symbol.asyncIterator] = function () {
45
+ const it = iterate.call(this);
46
+ wrapOnce(it, "next", once);
47
+ return it;
48
+ };
49
+ }
50
+ function traceMethods(proto, start) {
51
+ for (const [method, shapeOf] of Object.entries(MONGO_METHODS)) {
52
+ patchMethod(proto, method, (original) => function (...args) {
53
+ const { info, text } = callOf(this, method, shapeOf, args);
54
+ return runTraced(start(info, text, undefined), args, (a) => original.apply(this, a));
55
+ });
56
+ }
57
+ }
58
+ function traceCursors(proto, start) {
59
+ for (const [method, shapeOf] of Object.entries(MONGO_CURSORS)) {
60
+ patchMethod(proto, method, (original) => function (...args) {
61
+ const cursor = original.apply(this, args);
62
+ if (typeof cursor !== "object" || cursor === null)
63
+ return cursor;
64
+ traceCursor(cursor, () => {
65
+ const { info, text } = callOf(this, method, shapeOf, args, cursor);
66
+ return start(info, text, undefined);
67
+ });
68
+ return cursor;
69
+ });
70
+ }
71
+ }
72
+ /** The Collection prototype: from the module, a MongoClient, a Db, or a collection. Making a Db or collection object does no I/O. */
73
+ function prototypeOf(target) {
74
+ const t = target;
75
+ if (t?.Collection?.prototype)
76
+ return t.Collection.prototype;
77
+ if (t && typeof t.find === "function" && "collectionName" in t)
78
+ return Object.getPrototypeOf(t);
79
+ if (typeof t?.collection === "function")
80
+ return prototypeOf(t.collection("wizelens"));
81
+ if (typeof t?.db === "function")
82
+ return prototypeOf(t.db());
83
+ return t?.default ? prototypeOf(t.default) : null;
84
+ }
85
+ /** Trace MongoDB collection calls (find, findOne, insert, update, delete, aggregate, count, bulkWrite...). Pass the `mongodb` module, a MongoClient, a Db, or a collection. Returns false when nothing was patched. */
86
+ export function instrumentMongoDb(wizelens, target) {
87
+ const start = dbSpansOf(wizelens);
88
+ const proto = prototypeOf(target);
89
+ if (!start || !proto)
90
+ return false;
91
+ traceMethods(proto, start);
92
+ traceCursors(proto, start);
93
+ return true;
94
+ }
95
+ //# sourceMappingURL=mongodb.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mongodb.js","sourceRoot":"","sources":["../../src/adapters/mongodb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type DbSpan } from "../db.js";
2
+ /** A salted hash of the values a call ran with, so the same call with the same values can be found without storing them. */
3
+ export declare function fingerprint(parts: readonly unknown[]): string;
4
+ /** True for a key or path part that holds an id or a value: a digit, an email, or a long token. */
5
+ export declare const isIdLike: (part: string) => boolean;
6
+ /** `server.address` and `server.port` when the host is known. */
7
+ export declare function serverAttributes(host: unknown, port: unknown): Record<string, string | number>;
8
+ /** Cut long text, so one huge filter or pipeline does not fill the span. */
9
+ export declare const clip: (text: string, max?: number) => string;
10
+ /** Like runTraced, but a result that carries an error (a pipeline or bulk call with failed items) marks the span. */
11
+ export declare function runChecked(span: DbSpan | null, args: unknown[], invoke: (args: unknown[]) => unknown, errorOf: (result: unknown) => unknown): unknown;
12
+ /** The prototype that owns `name`, walking up from an instance. */
13
+ export declare function ownerOf(instance: object, name: string): object | null;
14
+ //# sourceMappingURL=nosql.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nosql.d.ts","sourceRoot":"","sources":["../../src/adapters/nosql.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAa,MAAM,UAAU,CAAC;AAgBlD,4HAA4H;AAC5H,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAQ7D;AAED,mGAAmG;AACnG,eAAO,MAAM,QAAQ,SAAU,MAAM,KAAG,OAAiD,CAAC;AAE1F,iEAAiE;AACjE,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAI9F;AAED,4EAA4E;AAC5E,eAAO,MAAM,IAAI,SAAU,MAAM,mBAAe,MAA+D,CAAC;AAEhH,qHAAqH;AACrH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,EAAE,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAWrJ;AAED,mEAAmE;AACnE,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKrE"}
@@ -0,0 +1,61 @@
1
+ import { createHmac, randomBytes } from "node:crypto";
2
+ import { runTraced } from "../db.js";
3
+ // Fingerprints only compare calls inside this process. The key is never stored or sent, so they cannot be reversed.
4
+ const KEY = randomBytes(32);
5
+ // Sessions and other driver objects are not values. Dropping them also avoids their cycles.
6
+ const replacer = (key, value) => (typeof value === "bigint" ? value.toString() : key === "session" ? undefined : value);
7
+ function jsonOf(value) {
8
+ try {
9
+ return JSON.stringify(value, replacer) ?? String(value);
10
+ }
11
+ catch {
12
+ return String(value);
13
+ }
14
+ }
15
+ /** A salted hash of the values a call ran with, so the same call with the same values can be found without storing them. */
16
+ export function fingerprint(parts) {
17
+ const hmac = createHmac("sha256", KEY);
18
+ for (const part of parts) {
19
+ if (part instanceof Uint8Array)
20
+ hmac.update(part);
21
+ else
22
+ hmac.update(typeof part === "string" ? part : jsonOf(part));
23
+ hmac.update("\u0000");
24
+ }
25
+ return hmac.digest("base64url").slice(0, 16);
26
+ }
27
+ /** True for a key or path part that holds an id or a value: a digit, an email, or a long token. */
28
+ export const isIdLike = (part) => /\d|@/.test(part) || part.length >= 24;
29
+ /** `server.address` and `server.port` when the host is known. */
30
+ export function serverAttributes(host, port) {
31
+ if (typeof host !== "string" || host === "")
32
+ return {};
33
+ const p = Number(port);
34
+ return Number.isInteger(p) && p > 0 ? { "server.address": host, "server.port": p } : { "server.address": host };
35
+ }
36
+ /** Cut long text, so one huge filter or pipeline does not fill the span. */
37
+ export const clip = (text, max = 1000) => (text.length > max ? `${text.slice(0, max)}…` : text);
38
+ /** Like runTraced, but a result that carries an error (a pipeline or bulk call with failed items) marks the span. */
39
+ export function runChecked(span, args, invoke, errorOf) {
40
+ const checked = span && {
41
+ ctx: span.ctx,
42
+ fail: span.fail,
43
+ end: (result) => {
44
+ const err = errorOf(result);
45
+ if (err)
46
+ span.fail(err);
47
+ else
48
+ span.end(result);
49
+ },
50
+ };
51
+ return runTraced(checked, args, invoke);
52
+ }
53
+ /** The prototype that owns `name`, walking up from an instance. */
54
+ export function ownerOf(instance, name) {
55
+ for (let p = Object.getPrototypeOf(instance); p; p = Object.getPrototypeOf(p)) {
56
+ if (Object.hasOwn(p, name))
57
+ return p;
58
+ }
59
+ return null;
60
+ }
61
+ //# sourceMappingURL=nosql.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nosql.js","sourceRoot":"","sources":["../../src/adapters/nosql.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { DbCallInfo } from "../types.js";
2
+ /** The key arguments of a command. Every other argument is a value and is dropped. */
3
+ export declare function keysOf(name: string, args: readonly unknown[]): unknown[];
4
+ /** A key with its ids, emails, and tokens as `?`: "user:123:cart" is "user:?:cart". */
5
+ export declare function keyShape(key: unknown): string;
6
+ /** `GET user:?`: the command and the shapes of its keys, never the values. */
7
+ export declare function commandText(name: string, args: readonly unknown[]): string;
8
+ /** Where a client sends its commands. */
9
+ export interface RedisConn {
10
+ namespace: string;
11
+ host?: string;
12
+ port?: number;
13
+ }
14
+ /** One queued command of a pipeline or transaction. */
15
+ export interface RedisCommand {
16
+ name: string;
17
+ args: readonly unknown[];
18
+ }
19
+ /** The span facts and query text of one command. */
20
+ export declare function commandCall(adapter: string, cmd: RedisCommand, conn: RedisConn): {
21
+ info: DbCallInfo;
22
+ text: string;
23
+ };
24
+ /** The span facts of a pipeline or MULTI: one span, the command count, and each distinct command shape. */
25
+ export declare function batchCall(adapter: string, kind: "PIPELINE" | "MULTI", cmds: readonly RedisCommand[], conn: RedisConn): {
26
+ info: DbCallInfo;
27
+ text: string;
28
+ };
29
+ /** The first failed reply of a pipeline: ioredis gives [err, value] pairs, node-redis gives the error itself. */
30
+ export declare function replyError(result: unknown): unknown;
31
+ //# sourceMappingURL=redis-shape.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-shape.d.ts","sourceRoot":"","sources":["../../src/adapters/redis-shape.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiB9C,sFAAsF;AACtF,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,EAAE,CAQxE;AAID,uFAAuF;AACvF,wBAAgB,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAI7C;AAED,8EAA8E;AAC9E,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,OAAO,EAAE,GAAG,MAAM,CAK1E;AAED,yCAAyC;AACzC,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,uDAAuD;AACvD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,SAAS,OAAO,EAAE,CAAC;CAC1B;AAWD,oDAAoD;AACpD,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAInH;AAED,2GAA2G;AAC3G,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,EAAE,IAAI,EAAE,SAAS,YAAY,EAAE,EAAE,IAAI,EAAE,SAAS,GAAG;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAMzJ;AAED,iHAAiH;AACjH,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAOnD"}