@tracepanel/js 0.4.1 → 0.6.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 (81) hide show
  1. package/README.md +224 -12
  2. package/dist/agent.d.ts +5 -1
  3. package/dist/agent.js +12 -3
  4. package/dist/agent.js.map +1 -1
  5. package/dist/aws.d.ts +27 -0
  6. package/dist/aws.js +368 -0
  7. package/dist/aws.js.map +1 -0
  8. package/dist/bun.js +6 -82
  9. package/dist/bun.js.map +1 -1
  10. package/dist/calls.d.ts +5 -0
  11. package/dist/calls.js +7 -0
  12. package/dist/calls.js.map +1 -1
  13. package/dist/config.d.ts +7 -0
  14. package/dist/config.js +2 -0
  15. package/dist/config.js.map +1 -1
  16. package/dist/explain.d.ts +5 -0
  17. package/dist/explain.js +56 -7
  18. package/dist/explain.js.map +1 -1
  19. package/dist/fastify.d.ts +2 -0
  20. package/dist/fastify.js +100 -0
  21. package/dist/fastify.js.map +1 -0
  22. package/dist/frameworks.js +3 -0
  23. package/dist/frameworks.js.map +1 -1
  24. package/dist/hono.d.ts +2 -0
  25. package/dist/hono.js +63 -0
  26. package/dist/hono.js.map +1 -0
  27. package/dist/koa.d.ts +2 -0
  28. package/dist/koa.js +119 -0
  29. package/dist/koa.js.map +1 -0
  30. package/dist/llm.d.ts +20 -0
  31. package/dist/llm.js +632 -0
  32. package/dist/llm.js.map +1 -0
  33. package/dist/memory.d.ts +69 -0
  34. package/dist/memory.js +203 -0
  35. package/dist/memory.js.map +1 -0
  36. package/dist/model.d.ts +22 -1
  37. package/dist/model.js.map +1 -1
  38. package/dist/next.js +4 -4
  39. package/dist/next.js.map +1 -1
  40. package/dist/processor.d.ts +40 -4
  41. package/dist/processor.js +156 -29
  42. package/dist/processor.js.map +1 -1
  43. package/dist/profile.d.ts +34 -8
  44. package/dist/profile.js +98 -13
  45. package/dist/profile.js.map +1 -1
  46. package/dist/queries.d.ts +20 -0
  47. package/dist/queries.js +75 -0
  48. package/dist/queries.js.map +1 -0
  49. package/dist/respond.d.ts +12 -0
  50. package/dist/respond.js +85 -0
  51. package/dist/respond.js.map +1 -0
  52. package/dist/setup.js +22 -5
  53. package/dist/setup.js.map +1 -1
  54. package/dist/sql.d.ts +1 -0
  55. package/dist/sql.js +11 -2
  56. package/dist/sql.js.map +1 -1
  57. package/dist/sqlite.d.ts +13 -0
  58. package/dist/sqlite.js +291 -0
  59. package/dist/sqlite.js.map +1 -0
  60. package/dist/stack.d.ts +3 -1
  61. package/dist/stack.js +30 -6
  62. package/dist/stack.js.map +1 -1
  63. package/dist/testing.d.ts +128 -0
  64. package/dist/testing.js +362 -0
  65. package/dist/testing.js.map +1 -0
  66. package/dist/transactions.d.ts +11 -1
  67. package/dist/transactions.js +70 -34
  68. package/dist/transactions.js.map +1 -1
  69. package/dist/view.d.ts +17 -0
  70. package/dist/view.js +71 -0
  71. package/dist/view.js.map +1 -0
  72. package/dist/vitest-setup.d.ts +1 -0
  73. package/dist/vitest-setup.js +63 -0
  74. package/dist/vitest-setup.js.map +1 -0
  75. package/dist/vitest.d.ts +57 -0
  76. package/dist/vitest.js +130 -0
  77. package/dist/vitest.js.map +1 -0
  78. package/dist/widget.d.ts +16 -0
  79. package/dist/widget.js +33 -1
  80. package/dist/widget.js.map +1 -1
  81. package/package.json +69 -4
@@ -0,0 +1,362 @@
1
+ // Tests that hold the app to what Tracepanel finds: the queries a block makes, the issues the agent finds in a test.
2
+ // What a test runner's integration (vitest.ts) builds on, as the Python SDK's pytest plugin builds on its testing.py.
3
+ //
4
+ // A test runs as a trace of its own, kind `test`, named after the test. A request the test makes of the app in its
5
+ // process (supertest, fetch to a server it started) is an `http.client` span of that trace, and the app's trace of
6
+ // the request is a trace of its own that the request's traceparent links to it, as a call between two apps is. A
7
+ // test's queries are its own and those of the requests it made, and the agent's findings in all of those traces are
8
+ // the test's.
9
+ import { context, trace as otel, ROOT_CONTEXT, SpanStatusCode } from "@opentelemetry/api";
10
+ // What the agent finds (its schema/trace.schema.json): the kinds a test can fail on.
11
+ export const KINDS = [
12
+ "n+1",
13
+ "duplicates",
14
+ "slow-sql",
15
+ "slow-http",
16
+ "slow-call",
17
+ "error",
18
+ "long-transaction",
19
+ "in-transaction",
20
+ "htmx",
21
+ "queue-wait",
22
+ "blocking-call",
23
+ "large-result",
24
+ ];
25
+ /** What fails a test unless the settings say otherwise. */
26
+ export const DEFAULT_FAIL_ON = ["n+1", "duplicates"];
27
+ // How long to wait for the agent to store a test's traces, and how often to ask.
28
+ const STORED_WAIT_MS = 5000;
29
+ const POLL_MS = 10;
30
+ // How long to wait for the traces of the requests a test made to be sent: one whose response never ended isn't.
31
+ const SETTLE_MS = 2000;
32
+ // A failure lists this many queries, and says how many more there were.
33
+ const MAX_LISTED = 20;
34
+ // A statement longer than this is cut in a failure's message.
35
+ const MAX_STATEMENT = 300;
36
+ /** A test's own rules gone wrong (a kind misspelled), or a helper used outside a test: the test fails with it. */
37
+ export class UsageError extends Error {
38
+ name = "TracepanelUsageError";
39
+ }
40
+ /** The kinds named: a list of them, or one; an unknown kind is a typo, and an error. */
41
+ export function kinds(value, where) {
42
+ const names = typeof value === "string" ? [value] : Array.isArray(value) ? value : undefined;
43
+ if (names === undefined || !names.every((name) => typeof name === "string")) {
44
+ throw new UsageError(`${where}: a kind or a list of kinds, got ${JSON.stringify(value)}`);
45
+ }
46
+ const unknown = [...new Set(names.filter((name) => !KINDS.includes(name)))].sort();
47
+ if (unknown.length > 0) {
48
+ throw new UsageError(`${where}: unknown kind ${unknown.join(", ")} (the kinds: ${KINDS.join(", ")})`);
49
+ }
50
+ return new Set(names);
51
+ }
52
+ // ---------- the queries ----------
53
+ export function queries(spans) {
54
+ return spans.filter((span) => span.kind === "sql");
55
+ }
56
+ function statementOf(span) {
57
+ const text = String(span.attrs["db.statement"] || span.name)
58
+ .split(/\s+/)
59
+ .filter(Boolean)
60
+ .join(" ");
61
+ return text.length <= MAX_STATEMENT ? text : `${text.slice(0, MAX_STATEMENT)}…`;
62
+ }
63
+ /** Queries as a failure lists them: the statement, and where the project's code made it. */
64
+ export function listed(spans) {
65
+ const lines = spans.slice(0, MAX_LISTED).map((span) => {
66
+ const where = span.attrs["code.origin"];
67
+ return ` ${statementOf(span)}${where ? `\n at ${where}` : ""}`;
68
+ });
69
+ if (spans.length > MAX_LISTED)
70
+ lines.push(` … and ${spans.length - MAX_LISTED} more`);
71
+ return lines.join("\n");
72
+ }
73
+ export function tooMany(made, limit) {
74
+ return `${made.length} queries, at most ${limit} expected:\n${listed(made)}`;
75
+ }
76
+ /** An assertion's failure as a test runner shows it: the message, without this SDK's frames. */
77
+ export function failure(message, name = "AssertionError") {
78
+ const error = new Error(message);
79
+ error.name = name;
80
+ error.stack = `${name}: ${message}`;
81
+ return error;
82
+ }
83
+ /** The finding as a failure lists it; the trace it is in unless it is the test's own (`test`, its id). */
84
+ export function describe(finding, test) {
85
+ const lines = [finding.title];
86
+ if (finding.query)
87
+ lines.push(` ${finding.query}`);
88
+ if (finding.culprit)
89
+ lines.push(` at ${finding.culprit}`);
90
+ if (finding.traceId !== test)
91
+ lines.push(` in ${finding.traceName} → ${finding.url}`);
92
+ if (finding.hint)
93
+ lines.push(` ${finding.hint}`);
94
+ return lines.join("\n");
95
+ }
96
+ export function traceUrl(console, traceId) {
97
+ return `${console.replace(/\/+$/, "")}/#/t/${traceId}`;
98
+ }
99
+ /** Outside any trace: the calls to the agent's console are the test's bookkeeping, not its work. */
100
+ function untraced(fn) {
101
+ return context.with(ROOT_CONTEXT, fn);
102
+ }
103
+ /** The agent's console API, where a test's traces are read back with what the agent found in them. */
104
+ export class Console {
105
+ url;
106
+ constructor(url) {
107
+ this.url = url;
108
+ }
109
+ async get(path, query) {
110
+ const address = `${this.url.replace(/\/+$/, "")}/api/${path}${query ? `?${new URLSearchParams(query)}` : ""}`;
111
+ return untraced(async () => {
112
+ const answer = await fetch(address, { signal: AbortSignal.timeout(STORED_WAIT_MS) });
113
+ if (answer.status === 404)
114
+ return null;
115
+ if (!answer.ok)
116
+ throw new Error(`tracepanel: the agent's console answered ${answer.status} for ${address}`);
117
+ return answer.json();
118
+ });
119
+ }
120
+ /** The traces' summaries once the agent has stored them all (it writes in a thread of its own), by id. */
121
+ async stored(ids, timeoutMs = STORED_WAIT_MS) {
122
+ const deadline = performance.now() + timeoutMs;
123
+ for (;;) {
124
+ const answer = (await this.get("traces", { ids: ids.join(","), limit: String(ids.length) }));
125
+ const found = new Map((answer?.traces ?? []).map((row) => [row.id, row]));
126
+ if (found.size >= ids.length || performance.now() >= deadline)
127
+ return found;
128
+ await new Promise((done) => setTimeout(done, POLL_MS));
129
+ }
130
+ }
131
+ /** What the agent found in these traces, the oldest trace's first. */
132
+ async findings(traces) {
133
+ if (traces.length === 0)
134
+ return [];
135
+ const spans = new Map(traces.flatMap((trace) => trace.spans.map((span) => [span.id, span])));
136
+ const stored = await this.stored(traces.map((trace) => trace.id));
137
+ const found = [];
138
+ for (const trace of [...traces].sort((a, b) => a.start - b.start)) {
139
+ if (!stored.get(trace.id)?.issues)
140
+ continue;
141
+ const document = ((await this.get(`traces/${trace.id}`)) ?? {});
142
+ for (const issue of document.issues ?? []) {
143
+ const first = (issue.span_ids ?? []).map((id) => spans.get(id)).find((span) => span !== undefined);
144
+ found.push({
145
+ kind: issue.kind,
146
+ title: issue.title,
147
+ culprit: issue.culprit ?? null,
148
+ hint: issue.hint ?? null,
149
+ count: issue.count ?? 1,
150
+ query: first?.kind === "sql" ? statementOf(first) : null,
151
+ traceId: trace.id,
152
+ traceName: trace.name,
153
+ url: traceUrl(this.url, trace.id),
154
+ });
155
+ }
156
+ }
157
+ return found;
158
+ }
159
+ }
160
+ // ---------- a test's trace ----------
161
+ const HOLDER = Symbol.for("tracepanel.testing");
162
+ function holder() {
163
+ const global = globalThis;
164
+ global[HOLDER] ??= { running: new Map() };
165
+ return global[HOLDER];
166
+ }
167
+ /** Whether a test is running: what else completes now (a request in a beforeAll) is not a test's. */
168
+ export function running() {
169
+ return holder().running.size > 0;
170
+ }
171
+ /** The test whose trace is current: the one running this code, or the one whose request the app is serving. */
172
+ export function currentTest() {
173
+ const span = otel.getActiveSpan();
174
+ return span ? holder().running.get(span.spanContext().traceId) : undefined;
175
+ }
176
+ /**
177
+ * The agent's sink with the tests' traces taken aside: each goes out at once, as its test waits for what the agent
178
+ * found in it; what completes while no test runs (a request a beforeAll made) isn't sent at all, nor is anything
179
+ * without an agent (`send`: there is one).
180
+ */
181
+ export class TestSink {
182
+ sink;
183
+ send;
184
+ constructor(sink, send) {
185
+ this.sink = sink;
186
+ this.send = send;
187
+ }
188
+ submit(trace) {
189
+ const test = holder().running.get(String(trace.attrs["w3c.trace_id"] ?? ""));
190
+ if (test)
191
+ test.completed(trace);
192
+ if (!this.send || (trace.kind !== "test" && !running()))
193
+ return;
194
+ this.sink.submit(trace);
195
+ this.sink.flushNow?.();
196
+ }
197
+ submitEvent(event) {
198
+ if (this.send)
199
+ this.sink.submitEvent?.(event);
200
+ }
201
+ }
202
+ /** A test run as a trace: what a test runner's integration records, and what testTrace() gives a test. */
203
+ export class TracedTest {
204
+ name;
205
+ attrs;
206
+ processor;
207
+ console;
208
+ /** The test's own trace, once it is sent. */
209
+ trace;
210
+ /** The app's traces of the requests the test made. */
211
+ served = [];
212
+ root;
213
+ constructor(name, attrs, processor,
214
+ /** The agent's console, or undefined without an agent. */
215
+ console) {
216
+ this.name = name;
217
+ this.attrs = attrs;
218
+ this.processor = processor;
219
+ this.console = console;
220
+ }
221
+ /** Runs the test as the trace: `run` runs it, `failed` says after it whether it failed (and with what). */
222
+ async record(run, failed) {
223
+ const tracer = otel.getTracer("tracepanel");
224
+ const attributes = { ...this.attrs, "tracepanel.kind": "test", "tracepanel.name": this.name };
225
+ try {
226
+ await tracer.startActiveSpan(this.name, { attributes }, async (root) => {
227
+ this.root = root;
228
+ holder().running.set(this.traceId, this);
229
+ try {
230
+ await run();
231
+ }
232
+ finally {
233
+ const errors = failed();
234
+ for (const error of errors)
235
+ root.recordException(exception(error));
236
+ if (errors.length > 0)
237
+ root.setStatus({ code: SpanStatusCode.ERROR });
238
+ root.end();
239
+ }
240
+ });
241
+ // The test's trace goes out a moment after its root span ends, with the spans that ended meanwhile; its
242
+ // requests' traces, once their responses have.
243
+ await this.settle(false);
244
+ }
245
+ finally {
246
+ holder().running.delete(this.traceId);
247
+ }
248
+ }
249
+ get traceId() {
250
+ return this.root?.spanContext().traceId ?? "";
251
+ }
252
+ /** A trace of this test's sent: its own, or the app's of a request it made. */
253
+ completed(trace) {
254
+ if (trace.kind === "test")
255
+ this.trace = trace;
256
+ else
257
+ this.served.push(trace);
258
+ }
259
+ /**
260
+ * Waits for the traces of the requests the test made to be sent; `running`: the test's own trace still is, else
261
+ * it is waited for too.
262
+ */
263
+ async settle(running = true) {
264
+ const except = running ? this.root?.spanContext().spanId : undefined;
265
+ const deadline = performance.now() + SETTLE_MS;
266
+ while (this.processor.building(this.traceId, except).length > 0 && performance.now() < deadline) {
267
+ await untraced(() => new Promise((done) => setTimeout(done, 5)));
268
+ }
269
+ }
270
+ /** The test's own spans so far. */
271
+ ownSpans() {
272
+ if (this.trace)
273
+ return this.trace.spans;
274
+ const spanId = this.root?.spanContext().spanId;
275
+ return (spanId ? this.processor.openTrace(spanId)?.spans : undefined) ?? [];
276
+ }
277
+ /** The test's trace and those of its requests, as far as they are recorded. */
278
+ get traces() {
279
+ return [...(this.trace ? [this.trace] : []), ...this.served];
280
+ }
281
+ /** The traces of the requests the test made, those whose trace isn't sent yet included (their spans so far). */
282
+ requests() {
283
+ return [...this.served, ...this.processor.building(this.traceId, this.root?.spanContext().spanId)];
284
+ }
285
+ /** The queries the test made so far, its requests' included. */
286
+ get sql() {
287
+ return [...queries(this.ownSpans()), ...this.requests().flatMap((trace) => queries(trace.spans))];
288
+ }
289
+ get queries() {
290
+ return this.sql.length;
291
+ }
292
+ /**
293
+ * What the agent found so far: in the requests the test made; its own trace's once the test has ended. Empty
294
+ * without an agent.
295
+ */
296
+ async issues() {
297
+ if (!this.console)
298
+ return [];
299
+ await this.settle(this.trace === undefined);
300
+ return this.console.findings(this.trace ? this.traces : this.served);
301
+ }
302
+ /** The test's trace in the agent's console. */
303
+ get url() {
304
+ const id = this.trace?.id ?? this.ownId();
305
+ return this.console && id ? traceUrl(this.console.url, id) : undefined;
306
+ }
307
+ ownId() {
308
+ const spanId = this.root?.spanContext().spanId;
309
+ return spanId ? this.processor.openTrace(spanId)?.id : undefined;
310
+ }
311
+ }
312
+ /** A test runner's error as an exception on the test's root span: the trace's error. */
313
+ function exception(error) {
314
+ if (error && typeof error === "object") {
315
+ const { name, message, stack } = error;
316
+ return {
317
+ name: typeof name === "string" && name ? name : "Error",
318
+ message: typeof message === "string" ? message : String(error),
319
+ ...(typeof stack === "string" ? { stack } : {}),
320
+ };
321
+ }
322
+ return { name: "Error", message: String(error) };
323
+ }
324
+ /** What the test did against its rules: a failure's message each, none when it held to them. */
325
+ export async function problems(run, rules, allowedHow) {
326
+ const found = [];
327
+ if (rules.maxQueries !== undefined && run.queries > rules.maxQueries)
328
+ found.push(tooMany(run.sql, rules.maxQueries));
329
+ if (rules.failOn.size > 0 && run.console) {
330
+ const failing = (await run.console.findings(run.traces)).filter((finding) => rules.failOn.has(finding.kind));
331
+ if (failing.length > 0) {
332
+ const listedFindings = failing.map((finding) => describe(finding, run.trace?.id)).join("\n\n");
333
+ const allow = [...new Set(failing.map((finding) => finding.kind))]
334
+ .sort()
335
+ .map((kind) => `"${kind}"`)
336
+ .join(", ");
337
+ found.push(`tracepanel found ${failing.length} ${failing.length === 1 ? "issue" : "issues"} in this test:\n\n` +
338
+ `${listedFindings}\n\nThe test's trace: ${run.url}\n${allowedHow(allow)}`);
339
+ }
340
+ }
341
+ return found;
342
+ }
343
+ /**
344
+ * Fails (an AssertionError) when `fn` makes more than `limit` SQL queries, those of the requests it makes included.
345
+ *
346
+ * await maxQueries(3, () => request(app).get("/posts"));
347
+ *
348
+ * It counts in the current test's trace.
349
+ */
350
+ export async function maxQueries(limit, fn) {
351
+ const test = currentTest();
352
+ if (!test) {
353
+ throw new UsageError("maxQueries() counts the queries of a test's trace, and none is running: add tracepanel() to the plugins of the Vitest config");
354
+ }
355
+ const before = new Set(test.sql.map((span) => span.id));
356
+ const result = await fn();
357
+ const made = test.sql.filter((span) => !before.has(span.id));
358
+ if (made.length > limit)
359
+ throw failure(tooMany(made, limit));
360
+ return result;
361
+ }
362
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,20 @@ import { InstrumentationBase, InstrumentationNodeModuleDefinition } from "@opent
2
2
  type Any = any;
3
3
  /** Statements that only begin or end a transaction or a savepoint: the transaction span stands for them. */
4
4
  export declare const CONTROL: RegExp;
5
- interface Driver {
5
+ export interface Driver {
6
6
  client: string;
7
7
  system: string;
8
8
  }
9
+ /**
10
+ * A statement a driver runs in the app's call (SQLite's): in the connection's transaction, which BEGIN opens and
11
+ * COMMIT or ROLLBACK ends as it returns.
12
+ */
13
+ export declare function statementIn<T>(connection: Any, driver: Driver, text: string, call: () => T): T;
14
+ /**
15
+ * A function the driver runs in a transaction of its own making (better-sqlite3's db.transaction()): a transaction
16
+ * span around it, a savepoint inside another one; committed unless it throws.
17
+ */
18
+ export declare function within<T>(connection: Any, driver: Driver, call: () => T): T;
9
19
  /** Wraps `query` (and mysql2's `execute`) on a connection prototype. */
10
20
  export declare function wrapQuery(proto: Any, method: string, driver: Driver): void;
11
21
  /** A connection back in its pool with a transaction still open: the transaction is over for the app. */
@@ -1,9 +1,11 @@
1
- // Transactions as the Python SDK records them: a `transaction` span from BEGIN (or START TRANSACTION) on a pg client
2
- // or a mysql2 connection to its COMMIT or ROLLBACK, a nested `savepoint` span for each SAVEPOINT. What the app does
1
+ // Transactions as the Python SDK records them: a `transaction` span from BEGIN (or START TRANSACTION) on a pg client,
2
+ // a mysql2 connection or a SQLite database (sqlite.ts) to its COMMIT or ROLLBACK, a nested `savepoint` span for each
3
+ // SAVEPOINT. What the app does
3
4
  // meanwhile goes inside: the statements on that connection, and the calls it makes from where it began (an HTTP
4
5
  // call, a job enqueued), which is what the agent's long-transaction and in-transaction issues look at.
5
6
  import { context, SpanKind, trace } from "@opentelemetry/api";
6
7
  import { InstrumentationBase, InstrumentationNodeModuleDefinition, InstrumentationNodeModuleFile, } from "@opentelemetry/instrumentation";
8
+ import { enter, QUERY_ORIGIN } from "./queries.js";
7
9
  const BEGIN = /^\s*(BEGIN|START\s+TRANSACTION)\b/i;
8
10
  const COMMIT = /^\s*(COMMIT|END)\b/i;
9
11
  const ROLLBACK = /^\s*(ROLLBACK|ABORT)\b/i;
@@ -15,14 +17,6 @@ export const CONTROL = /^\s*(BEGIN|START\s+TRANSACTION|COMMIT|END|ROLLBACK|ABORT
15
17
  const OPEN = Symbol.for("tracepanel.transactions");
16
18
  const MARK = Symbol.for("tracepanel.transactions.wrapped");
17
19
  const tracer = trace.getTracer("tracepanel-transactions");
18
- /**
19
- * The app's context from here on, as `await client.query("BEGIN")` returns: what the global context manager's
20
- * attach() does (AsyncLocalStorage's enterWith). A context manager without it leaves the app's context as it is.
21
- */
22
- function enter(target) {
23
- const manager = context._getContextManager?.();
24
- manager?.attach?.(target);
25
- }
26
20
  function textOf(query) {
27
21
  if (typeof query === "string")
28
22
  return query;
@@ -97,6 +91,71 @@ function after(result, done) {
97
91
  done();
98
92
  }
99
93
  }
94
+ /**
95
+ * Where a statement runs, by its text: BEGIN or SAVEPOINT opens a span and runs in it, any other in the connection's
96
+ * innermost transaction; COMMIT, ROLLBACK and RELEASE close what they end (`ending`, to end once it ran).
97
+ */
98
+ function place(connection, driver, text) {
99
+ let ending = [];
100
+ let run;
101
+ try {
102
+ if (BEGIN.test(text)) {
103
+ run = open(connection, driver, false)?.inside;
104
+ }
105
+ else if (SAVEPOINT.test(text)) {
106
+ run = open(connection, driver, true)?.inside;
107
+ }
108
+ else {
109
+ // The statement runs inside the connection's innermost transaction, whichever context it came from, made
110
+ // where the app's ORM call it came from was (queries.ts).
111
+ const inside = connection?.[OPEN]?.at(-1)?.inside;
112
+ const made = context.active().getValue(QUERY_ORIGIN);
113
+ run = inside && made ? inside.setValue(QUERY_ORIGIN, made) : inside;
114
+ if (ROLLBACK_TO.test(text) || RELEASE.test(text)) {
115
+ ending = close(connection, ROLLBACK_TO.test(text) ? "rollback" : "commit", true);
116
+ }
117
+ else if (COMMIT.test(text) || ROLLBACK.test(text)) {
118
+ ending = close(connection, COMMIT.test(text) ? "commit" : "rollback", false);
119
+ }
120
+ }
121
+ }
122
+ catch {
123
+ // Never in the way of the app's query.
124
+ }
125
+ return { run, ending };
126
+ }
127
+ /**
128
+ * A statement a driver runs in the app's call (SQLite's): in the connection's transaction, which BEGIN opens and
129
+ * COMMIT or ROLLBACK ends as it returns.
130
+ */
131
+ export function statementIn(connection, driver, text, call) {
132
+ const { run, ending } = place(connection, driver, text);
133
+ try {
134
+ return run ? context.with(run, call) : call();
135
+ }
136
+ finally {
137
+ end(ending);
138
+ }
139
+ }
140
+ /**
141
+ * A function the driver runs in a transaction of its own making (better-sqlite3's db.transaction()): a transaction
142
+ * span around it, a savepoint inside another one; committed unless it throws.
143
+ */
144
+ export function within(connection, driver, call) {
145
+ const entry = open(connection, driver, stack(connection).length > 0);
146
+ if (!entry)
147
+ return call();
148
+ let outcome = "rollback";
149
+ try {
150
+ const result = context.with(entry.inside, call);
151
+ outcome = "commit";
152
+ return result;
153
+ }
154
+ finally {
155
+ // Only this one: the transaction it is in goes on.
156
+ end(close(connection, outcome, true));
157
+ }
158
+ }
100
159
  /** Whether a wrapper is calling the statement through: the ones it calls in turn pass it on. */
101
160
  let calling = false;
102
161
  /** Wraps `query` (and mysql2's `execute`) on a connection prototype. */
@@ -108,30 +167,7 @@ export function wrapQuery(proto, method, driver) {
108
167
  // Another of these wrappers further in (the module hooked twice) leaves the statement to this one.
109
168
  if (calling)
110
169
  return original.apply(this, args);
111
- const text = textOf(args[0]);
112
- let ending = [];
113
- let run;
114
- try {
115
- if (BEGIN.test(text)) {
116
- run = open(this, driver, false)?.inside;
117
- }
118
- else if (SAVEPOINT.test(text)) {
119
- run = open(this, driver, true)?.inside;
120
- }
121
- else {
122
- // The statement runs inside the connection's innermost transaction, whichever context it came from.
123
- run = this?.[OPEN]?.at(-1)?.inside;
124
- if (ROLLBACK_TO.test(text) || RELEASE.test(text)) {
125
- ending = close(this, ROLLBACK_TO.test(text) ? "rollback" : "commit", true);
126
- }
127
- else if (COMMIT.test(text) || ROLLBACK.test(text)) {
128
- ending = close(this, COMMIT.test(text) ? "commit" : "rollback", false);
129
- }
130
- }
131
- }
132
- catch {
133
- // Never in the way of the app's query.
134
- }
170
+ const { run, ending } = place(this, driver, textOf(args[0]));
135
171
  const call = () => {
136
172
  calling = true;
137
173
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transactions.js","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"AAAA,sHAAsH;AACtH,qHAAqH;AACrH,+BAA+B;AAC/B,gHAAgH;AAChH,uGAAuG;AAEvG,OAAO,EAAgB,OAAO,EAAa,QAAQ,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,EACL,mBAAmB,EACnB,mCAAmC,EACnC,6BAA6B,GAC9B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAKnD,MAAM,KAAK,GAAG,oCAAoC,CAAC;AACnD,MAAM,MAAM,GAAG,qBAAqB,CAAC;AACrC,MAAM,QAAQ,GAAG,yBAAyB,CAAC;AAC3C,MAAM,SAAS,GAAG,kBAAkB,CAAC;AACrC,MAAM,OAAO,GAAG,gCAAgC,CAAC;AACjD,MAAM,WAAW,GAAG,+CAA+C,CAAC;AACpE,4GAA4G;AAC5G,MAAM,CAAC,MAAM,OAAO,GAAG,gFAAgF,CAAC;AAExG,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AACnD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;AAe3D,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;AAE1D,SAAS,MAAM,CAAC,KAAc;IAC5B,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,KAA0C,CAAC;QACjE,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;IAC1C,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,KAAK,CAAC,UAAe;IAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAClG,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,IAAI,CAAC,UAAe,EAAE,MAAc,EAAE,SAAkB;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC;IACjC,sGAAsG;IACtG,IAAI,CAAC,KAAK,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QACtG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACtE,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,CAC3B,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,aAAa,UAAU,EACpD;QACE,IAAI,EAAE,QAAQ,CAAC,QAAQ;QACvB,UAAU,EAAE;YACV,sBAAsB,EAAE,aAAa;YACrC,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,UAAU,EAAE,SAAS;YACrB,0BAA0B,EAAE,SAAS;SACtC;KACF,EACD,MAAM,CACP,CAAC;IACF,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;IACpE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACpB,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+FAA+F;AAC/F,SAAS,KAAK,CAAC,UAAe,EAAE,OAA8B,EAAE,aAAsB;IACpF,MAAM,MAAM,GAAW,UAAU,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;IAChD,MAAM,MAAM,GAAW,EAAE,CAAC;IAC1B,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,EAAU,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,aAAa;YAAE,MAAM;IAC3B,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,SAAS,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI;QAAE,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,GAAG,CAAC,OAAe;IAC1B,KAAK,MAAM,KAAK,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAChD,CAAC;AAED,mGAAmG;AACnG,SAAS,KAAK,CAAC,MAAW,EAAE,IAAgB;IAC1C,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1B,CAAC;SAAM,IAAI,MAAM,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACvD,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACzB,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC;SAAM,CAAC;QACN,IAAI,EAAE,CAAC;IACT,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAS,KAAK,CAAC,UAAe,EAAE,MAAc,EAAE,IAAY;IAC1D,IAAI,MAAM,GAAW,EAAE,CAAC;IACxB,IAAI,GAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAChD,CAAC;aAAM,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,GAAG,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,yGAAyG;YACzG,0DAA0D;YAC1D,MAAM,MAAM,GAAI,UAAU,EAAE,CAAC,IAAI,CAAwB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;YAC1E,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YACrD,GAAG,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YACpE,IAAI,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACjD,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACnF,CAAC;iBAAM,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAC/E,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,uCAAuC;IACzC,CAAC;IACD,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAI,UAAe,EAAE,MAAc,EAAE,IAAY,EAAE,IAAa;IACzF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAChD,CAAC;YAAS,CAAC;QACT,GAAG,CAAC,MAAM,CAAC,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAI,UAAe,EAAE,MAAc,EAAE,IAAa;IACtE,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACrE,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,EAAE,CAAC;IAC1B,IAAI,OAAO,GAA0B,UAAU,CAAC;IAChD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,GAAG,QAAQ,CAAC;QACnB,OAAO,MAAM,CAAC;IAChB,CAAC;YAAS,CAAC;QACT,mDAAmD;QACnD,GAAG,CAAC,KAAK,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;AACH,CAAC;AAED,gGAAgG;AAChG,IAAI,OAAO,GAAG,KAAK,CAAC;AAEpB,wEAAwE;AACxE,MAAM,UAAU,SAAS,CAAC,KAAU,EAAE,MAAc,EAAE,MAAc;IAClE,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7D,MAAM,OAAO,GAAG,UAAqB,GAAG,IAAe;QACrD,mGAAmG;QACnG,IAAI,OAAO;YAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC/C,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC;gBACH,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YACpC,CAAC;oBAAS,CAAC;gBACT,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;QACH,CAAC,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,GAAG,KAAK,UAAU,CAAC,CAAC;QACtE,MAAM,IAAI,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,UAAU,IAAI,CAAC,EAAE,CAAC;YACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAuC,CAAC;YACxE,IAAI,CAAC,UAAU,CAAC,GAAG,UAAyB,GAAG,OAAkB;gBAC/D,IAAI,EAAE,CAAC;gBACP,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACvC,CAAC,CAAC;QACJ,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtD,IAAI,UAAU,GAAG,CAAC;YAAE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,wGAAwG;AACxG,MAAM,UAAU,WAAW,CAAC,KAAU,EAAE,MAAc,EAAE,YAAiD;IACvG,MAAM,QAAQ,GAAG,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;IACjC,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO;IAC7D,MAAM,OAAO,GAAG,UAAqB,GAAG,IAAe;QACrD,IAAI,CAAC;YACH,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC;QAAC,MAAM,CAAC;YACP,yCAAyC;QAC3C,CAAC;QACD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;IACF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,KAAK,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,2FAA2F;AAC3F,MAAM,UAAU,QAAQ,CAAC,OAAY;IACnC,OAAO,OAAO,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;AAChF,CAAC;AAED,iFAAiF;AACjF,MAAM,IAAI,GAAG,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,CAAC;AAEvC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;AAClD,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AAEpD,MAAM,OAAO,2BAA4B,SAAQ,mBAAmB;IAClE;QACE,KAAK,CAAC,yBAAyB,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAES,IAAI;QACZ,OAAO;YACL,IAAI,mCAAmC,CACrC,IAAI,EACJ,CAAC,KAAK,CAAC,EACP,CAAC,OAAY,EAAE,EAAE;gBACf,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC5D,OAAO,OAAO,CAAC;YACjB,CAAC,EACD,IAAI,EACJ;gBACE,wGAAwG;gBACxG,6GAA6G;gBAC7G,IAAI,6BAA6B,CAC/B,kBAAkB,EAClB,CAAC,KAAK,CAAC,EACP,CAAC,OAAY,EAAE,EAAE;oBACf,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;oBAC3C,cAAc,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBACpD,OAAO,OAAO,CAAC;gBACjB,CAAC,EACD,IAAI,CACL;aACF,CACF;YACD,IAAI,mCAAmC,CAAC,SAAS,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAY,EAAE,EAAE;gBAC3E,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;gBAChF,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;YACF,IAAI,mCAAmC,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,OAAY,EAAE,EAAE,CAAC,OAAO,EAAE,SAAS,EAAE;gBAC/F,IAAI,6BAA6B,CAC/B,0BAA0B,EAC1B,CAAC,KAAK,CAAC,EACP,CAAC,OAAY,EAAE,EAAE;oBACf,yDAAyD;oBACzD,MAAM,KAAK,GAAG,OAAO,EAAE,SAAS,CAAC;oBACjC,MAAM,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;oBAC5F,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC;oBAChC,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;oBAClC,OAAO,OAAO,CAAC;gBACjB,CAAC,EACD,IAAI,CACL;gBACD,IAAI,6BAA6B,CAC/B,+BAA+B,EAC/B,CAAC,KAAK,CAAC,EACP,CAAC,OAAY,EAAE,EAAE;oBACf,WAAW,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC;oBACvE,OAAO,OAAO,CAAC;gBACjB,CAAC,EACD,IAAI,CACL;aACF,CAAC;SACH,CAAC;IACJ,CAAC;CACF"}
package/dist/view.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import { type Span } from "@opentelemetry/api";
2
+ /** What tells the processor a span is a route's handler. */
3
+ export declare const VIEW = "view";
4
+ /** The status a framework answers an error with: its own statusCode or status (http-errors, Hono's), else 500. */
5
+ export declare function statusOf(error: unknown): number;
6
+ /**
7
+ * An error the request ends with, on a span: once, and only when the framework answers it with 500 or above.
8
+ * `status`: what it answered, where the app's error handler decides (Hono's onError).
9
+ */
10
+ export declare function recordError(span: Span, error: unknown, status?: number): void;
11
+ /** Whether a handler's span recorded this error already. */
12
+ export declare function wasRecorded(error: unknown): boolean;
13
+ /**
14
+ * `run` in a span for the route's handler, named by its route. `origin`: the app's line that added the route, when
15
+ * it is known. An error `run` throws is recorded and thrown on.
16
+ */
17
+ export declare function inView<T>(route: string, origin: string | null, run: (span: Span) => T): T;