@beignet/devtools 0.0.1

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 (68) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +464 -0
  3. package/dist/access.d.ts +21 -0
  4. package/dist/access.d.ts.map +1 -0
  5. package/dist/access.js +20 -0
  6. package/dist/access.js.map +1 -0
  7. package/dist/audit.d.ts +10 -0
  8. package/dist/audit.d.ts.map +1 -0
  9. package/dist/audit.js +49 -0
  10. package/dist/audit.js.map +1 -0
  11. package/dist/events.d.ts +143 -0
  12. package/dist/events.d.ts.map +1 -0
  13. package/dist/events.js +20 -0
  14. package/dist/events.js.map +1 -0
  15. package/dist/index.d.ts +114 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +44 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/instrumentation.d.ts +74 -0
  20. package/dist/instrumentation.d.ts.map +1 -0
  21. package/dist/instrumentation.js +293 -0
  22. package/dist/instrumentation.js.map +1 -0
  23. package/dist/persistence.d.ts +30 -0
  24. package/dist/persistence.d.ts.map +1 -0
  25. package/dist/persistence.js +100 -0
  26. package/dist/persistence.js.map +1 -0
  27. package/dist/provider-instrumentation.d.ts +9 -0
  28. package/dist/provider-instrumentation.d.ts.map +1 -0
  29. package/dist/provider-instrumentation.js +25 -0
  30. package/dist/provider-instrumentation.js.map +1 -0
  31. package/dist/provider.d.ts +79 -0
  32. package/dist/provider.d.ts.map +1 -0
  33. package/dist/provider.js +293 -0
  34. package/dist/provider.js.map +1 -0
  35. package/dist/redaction.d.ts +5 -0
  36. package/dist/redaction.d.ts.map +1 -0
  37. package/dist/redaction.js +20 -0
  38. package/dist/redaction.js.map +1 -0
  39. package/dist/routes.d.ts +113 -0
  40. package/dist/routes.d.ts.map +1 -0
  41. package/dist/routes.js +247 -0
  42. package/dist/routes.js.map +1 -0
  43. package/dist/trace-context.d.ts +29 -0
  44. package/dist/trace-context.d.ts.map +1 -0
  45. package/dist/trace-context.js +74 -0
  46. package/dist/trace-context.js.map +1 -0
  47. package/dist/ui.d.ts +14 -0
  48. package/dist/ui.d.ts.map +1 -0
  49. package/dist/ui.js +795 -0
  50. package/dist/ui.js.map +1 -0
  51. package/dist/watchers.d.ts +22 -0
  52. package/dist/watchers.d.ts.map +1 -0
  53. package/dist/watchers.js +171 -0
  54. package/dist/watchers.js.map +1 -0
  55. package/package.json +66 -0
  56. package/src/access.ts +52 -0
  57. package/src/audit.ts +71 -0
  58. package/src/events.ts +193 -0
  59. package/src/index.ts +136 -0
  60. package/src/instrumentation.ts +451 -0
  61. package/src/persistence.ts +163 -0
  62. package/src/provider-instrumentation.ts +50 -0
  63. package/src/provider.ts +375 -0
  64. package/src/redaction.ts +26 -0
  65. package/src/routes.ts +317 -0
  66. package/src/trace-context.ts +115 -0
  67. package/src/ui.ts +807 -0
  68. package/src/watchers.ts +235 -0
@@ -0,0 +1,293 @@
1
+ import { createDevtoolsEvent } from "./provider";
2
+ import { createChildDevtoolsTraceContext, createDevtoolsTraceContext, parseTraceparent, } from "./trace-context";
3
+ function getContextRequestId(ctx) {
4
+ if (!ctx || typeof ctx !== "object")
5
+ return undefined;
6
+ const requestId = ctx.requestId;
7
+ return typeof requestId === "string" ? requestId : undefined;
8
+ }
9
+ function getContextDevtools(ctx) {
10
+ if (!ctx || typeof ctx !== "object")
11
+ return undefined;
12
+ const ports = ctx.ports;
13
+ return ports?.devtools;
14
+ }
15
+ function getContextTraceContext(ctx) {
16
+ if (!ctx || typeof ctx !== "object")
17
+ return undefined;
18
+ const context = ctx;
19
+ if (!context.traceId &&
20
+ !context.spanId &&
21
+ !context.parentSpanId &&
22
+ !context.traceparent) {
23
+ return undefined;
24
+ }
25
+ return {
26
+ traceId: context.traceId,
27
+ spanId: context.spanId,
28
+ parentSpanId: context.parentSpanId,
29
+ traceparent: context.traceparent,
30
+ };
31
+ }
32
+ function getErrorMessage(error) {
33
+ if (error instanceof Error)
34
+ return error.message;
35
+ if (typeof error === "string")
36
+ return error;
37
+ return "Unknown error";
38
+ }
39
+ function getErrorStack(error) {
40
+ return error instanceof Error ? error.stack : undefined;
41
+ }
42
+ function createRequestId() {
43
+ if (typeof crypto !== "undefined" && "randomUUID" in crypto) {
44
+ return crypto.randomUUID();
45
+ }
46
+ return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
47
+ }
48
+ function getPathname(req) {
49
+ try {
50
+ return new URL(req.url).pathname;
51
+ }
52
+ catch {
53
+ return req.url;
54
+ }
55
+ }
56
+ function isDevtoolsPath(pathname, basePath) {
57
+ const normalizedBase = basePath.replace(/\/+$/, "");
58
+ return (pathname === normalizedBase || pathname.startsWith(`${normalizedBase}/`));
59
+ }
60
+ function isWatcherEnabled(devtools, name) {
61
+ return devtools.isWatcherEnabled(name);
62
+ }
63
+ export function createDevtoolsHooks(options = {}) {
64
+ let devtools;
65
+ const basePath = options.basePath ?? "/api/devtools";
66
+ const requestIdHeader = options.requestIdHeader ?? "x-request-id";
67
+ const traceContextHeader = options.traceContextHeader ?? "traceparent";
68
+ const generatedRequestIds = new WeakMap();
69
+ const traceContexts = new WeakMap();
70
+ const resolveRequestId = (args) => {
71
+ const headerRequestId = requestIdHeader === false
72
+ ? undefined
73
+ : args.req.headers.get(requestIdHeader);
74
+ const existing = options.getRequestId?.(args) ??
75
+ getContextRequestId(args.ctx) ??
76
+ headerRequestId ??
77
+ generatedRequestIds.get(args.req);
78
+ if (existing)
79
+ return existing;
80
+ const requestId = createRequestId();
81
+ generatedRequestIds.set(args.req, requestId);
82
+ return requestId;
83
+ };
84
+ const resolveTraceContext = (args) => {
85
+ const configured = options.getTraceContext?.(args);
86
+ const configuredContext = typeof configured === "string" ? { traceparent: configured } : configured;
87
+ const contextTrace = getContextTraceContext(args.ctx);
88
+ const headerTraceparent = traceContextHeader === false
89
+ ? undefined
90
+ : args.req.headers.get(traceContextHeader);
91
+ const existing = configuredContext ?? contextTrace;
92
+ const existingTraceparent = existing?.traceparent ?? parseTraceparent(headerTraceparent)?.traceparent;
93
+ if (existing) {
94
+ const traceContext = createDevtoolsTraceContext({
95
+ ...existing,
96
+ traceparent: existingTraceparent,
97
+ });
98
+ traceContexts.set(args.req, traceContext);
99
+ return traceContext;
100
+ }
101
+ const cached = traceContexts.get(args.req);
102
+ if (cached)
103
+ return cached;
104
+ const traceContext = createDevtoolsTraceContext({
105
+ traceparent: existingTraceparent,
106
+ });
107
+ traceContexts.set(args.req, traceContext);
108
+ return traceContext;
109
+ };
110
+ const record = (event) => {
111
+ if (!devtools)
112
+ return;
113
+ const normalized = createDevtoolsEvent(event);
114
+ try {
115
+ devtools.record(options.redact ? options.redact(normalized) : normalized);
116
+ }
117
+ catch (error) {
118
+ devtools.record({
119
+ type: "error",
120
+ message: "Devtools hook redactor failed",
121
+ details: {
122
+ message: error instanceof Error ? error.message : String(error),
123
+ },
124
+ });
125
+ }
126
+ };
127
+ return {
128
+ name: "devtools",
129
+ onRequest: ({ ports }) => {
130
+ devtools = ports.devtools;
131
+ return undefined;
132
+ },
133
+ beforeHandle: ({ req, ctx }) => {
134
+ if (!ctx || typeof ctx !== "object" || Array.isArray(ctx)) {
135
+ return undefined;
136
+ }
137
+ const traceContext = resolveTraceContext({ req, ctx });
138
+ return {
139
+ ctx: {
140
+ ...ctx,
141
+ traceId: traceContext.traceId,
142
+ spanId: traceContext.spanId,
143
+ parentSpanId: traceContext.parentSpanId,
144
+ traceparent: traceContext.traceparent,
145
+ },
146
+ };
147
+ },
148
+ beforeSend: async ({ req, ctx, response }) => {
149
+ if (requestIdHeader === false && traceContextHeader === false) {
150
+ return undefined;
151
+ }
152
+ const requestId = resolveRequestId({ req, ctx, response });
153
+ const traceContext = resolveTraceContext({ req, ctx, response });
154
+ const headers = {
155
+ ...response.headers,
156
+ ...(requestIdHeader === false ? {} : { [requestIdHeader]: requestId }),
157
+ ...(traceContextHeader === false
158
+ ? {}
159
+ : { [traceContextHeader]: traceContext.traceparent }),
160
+ };
161
+ return {
162
+ ...response,
163
+ headers,
164
+ };
165
+ },
166
+ afterSend: async ({ req, ctx, contract, response, error, durationMs }) => {
167
+ if (!devtools)
168
+ return;
169
+ const path = getPathname(req);
170
+ if (isDevtoolsPath(path, basePath))
171
+ return;
172
+ const shouldCaptureRequest = isWatcherEnabled(devtools, "requests");
173
+ const shouldCaptureError = Boolean(error) && isWatcherEnabled(devtools, "errors");
174
+ if (!shouldCaptureRequest && !shouldCaptureError)
175
+ return;
176
+ if (options.shouldCapture &&
177
+ !options.shouldCapture({ req, ctx, contract, response, error })) {
178
+ return;
179
+ }
180
+ const requestId = resolveRequestId({ req, ctx, response });
181
+ const traceContext = resolveTraceContext({ req, ctx, response });
182
+ if (shouldCaptureRequest) {
183
+ record({
184
+ type: "request",
185
+ requestId,
186
+ traceId: traceContext.traceId,
187
+ spanId: traceContext.spanId,
188
+ parentSpanId: traceContext.parentSpanId,
189
+ traceparent: traceContext.traceparent,
190
+ method: req.method,
191
+ path,
192
+ contractName: contract.name,
193
+ status: response.status,
194
+ durationMs,
195
+ details: {
196
+ headers: Object.fromEntries(req.headers.entries()),
197
+ },
198
+ });
199
+ }
200
+ if (error && shouldCaptureError) {
201
+ record({
202
+ type: "error",
203
+ requestId,
204
+ traceId: traceContext.traceId,
205
+ spanId: traceContext.spanId,
206
+ parentSpanId: traceContext.parentSpanId,
207
+ traceparent: traceContext.traceparent,
208
+ message: getErrorMessage(error),
209
+ stack: getErrorStack(error),
210
+ contractName: contract.name,
211
+ });
212
+ }
213
+ },
214
+ };
215
+ }
216
+ export function createDevtoolsUseCaseObserver(options = {}) {
217
+ const logErrorEvents = options.logErrorEvents ?? true;
218
+ const activeTraceContexts = new Map();
219
+ return (event) => {
220
+ const devtools = options.getDevtools?.(event.ctx) ?? getContextDevtools(event.ctx);
221
+ if (!devtools)
222
+ return;
223
+ const requestId = options.getRequestId?.(event.ctx) ?? getContextRequestId(event.ctx);
224
+ const errorMessage = event.phase === "error" ? getErrorMessage(event.error) : undefined;
225
+ const shouldCaptureUseCase = isWatcherEnabled(devtools, "useCases");
226
+ const shouldCaptureError = event.phase === "error" &&
227
+ logErrorEvents &&
228
+ isWatcherEnabled(devtools, "errors");
229
+ if (!shouldCaptureUseCase && !shouldCaptureError)
230
+ return;
231
+ const parentTraceContext = getContextTraceContext(event.ctx);
232
+ const useCaseKey = [
233
+ requestId ?? "no-request",
234
+ parentTraceContext?.traceId ?? "no-trace",
235
+ event.kind,
236
+ event.name,
237
+ ].join(":");
238
+ const traceContext = event.phase === "start"
239
+ ? createChildDevtoolsTraceContext(parentTraceContext ?? {})
240
+ : (activeTraceContexts.get(useCaseKey) ??
241
+ createChildDevtoolsTraceContext(parentTraceContext ?? {}));
242
+ if (event.phase === "start") {
243
+ activeTraceContexts.set(useCaseKey, traceContext);
244
+ }
245
+ else {
246
+ activeTraceContexts.delete(useCaseKey);
247
+ }
248
+ const record = (input) => {
249
+ const normalized = createDevtoolsEvent(input);
250
+ try {
251
+ devtools.record(options.redact ? options.redact(normalized) : normalized);
252
+ }
253
+ catch (error) {
254
+ devtools.record({
255
+ type: "error",
256
+ message: "Devtools use case redactor failed",
257
+ details: {
258
+ message: error instanceof Error ? error.message : String(error),
259
+ },
260
+ });
261
+ }
262
+ };
263
+ if (shouldCaptureUseCase) {
264
+ record({
265
+ type: "usecase",
266
+ requestId,
267
+ traceId: traceContext.traceId,
268
+ spanId: traceContext.spanId,
269
+ parentSpanId: traceContext.parentSpanId,
270
+ traceparent: traceContext.traceparent,
271
+ name: event.name,
272
+ kind: event.kind,
273
+ phase: event.phase,
274
+ durationMs: event.durationMs,
275
+ error: errorMessage,
276
+ });
277
+ }
278
+ if (shouldCaptureError) {
279
+ record({
280
+ type: "error",
281
+ requestId,
282
+ traceId: traceContext.traceId,
283
+ spanId: traceContext.spanId,
284
+ parentSpanId: traceContext.parentSpanId,
285
+ traceparent: traceContext.traceparent,
286
+ message: errorMessage ?? "Use case failed",
287
+ stack: getErrorStack(event.error),
288
+ useCaseName: event.name,
289
+ });
290
+ }
291
+ };
292
+ }
293
+ //# sourceMappingURL=instrumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"instrumentation.js","sourceRoot":"","sources":["../src/instrumentation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { DevtoolsEvent } from "./events";
2
+ export interface DevtoolsEventStore {
3
+ name?: string;
4
+ load?(): DevtoolsEvent[] | Promise<DevtoolsEvent[]>;
5
+ append?(event: DevtoolsEvent, events: readonly DevtoolsEvent[]): void | Promise<void>;
6
+ clear?(): void | Promise<void>;
7
+ }
8
+ export interface FileDevtoolsStoreOptions {
9
+ /**
10
+ * JSONL file used for persisted devtools events.
11
+ *
12
+ * @default ".beignet/devtools/core/events.jsonl"
13
+ */
14
+ filePath?: string;
15
+ /**
16
+ * Maximum number of events to load and keep when compacting the file.
17
+ *
18
+ * @default 1000
19
+ */
20
+ maxEvents?: number;
21
+ /**
22
+ * Rewrite the JSONL file after this many appended events. Compaction keeps
23
+ * persistence bounded without making every record pay the rewrite cost.
24
+ *
25
+ * @default 50
26
+ */
27
+ compactEvery?: number;
28
+ }
29
+ export declare function createFileDevtoolsStore(options?: FileDevtoolsStoreOptions): DevtoolsEventStore;
30
+ //# sourceMappingURL=persistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.d.ts","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,IAAI,aAAa,EAAE,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IACpD,MAAM,CAAC,CACL,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,SAAS,aAAa,EAAE,GAC/B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,KAAK,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC;AAED,MAAM,WAAW,wBAAwB;IACvC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAgDD,wBAAgB,uBAAuB,CACrC,OAAO,GAAE,wBAA6B,GACrC,kBAAkB,CA8EpB"}
@@ -0,0 +1,100 @@
1
+ const DEFAULT_FILE_PATH = ".beignet/devtools/core/events.jsonl";
2
+ const DEFAULT_MAX_EVENTS = 1000;
3
+ const DEFAULT_COMPACT_EVERY = 50;
4
+ function isErrnoException(error) {
5
+ return (typeof error === "object" &&
6
+ error !== null &&
7
+ "code" in error &&
8
+ typeof error.code === "string");
9
+ }
10
+ function isDevtoolsEvent(value) {
11
+ return (typeof value === "object" &&
12
+ value !== null &&
13
+ "id" in value &&
14
+ "timestamp" in value &&
15
+ "type" in value);
16
+ }
17
+ function parseJsonLine(line) {
18
+ try {
19
+ const parsed = JSON.parse(line);
20
+ return isDevtoolsEvent(parsed) ? parsed : undefined;
21
+ }
22
+ catch {
23
+ return undefined;
24
+ }
25
+ }
26
+ async function loadNodeModules() {
27
+ const [fs, path] = await Promise.all([
28
+ import("node:fs/promises"),
29
+ import("node:path"),
30
+ ]);
31
+ return { fs, path };
32
+ }
33
+ export function createFileDevtoolsStore(options = {}) {
34
+ const filePath = options.filePath ?? DEFAULT_FILE_PATH;
35
+ const maxEvents = Math.max(1, options.maxEvents ?? DEFAULT_MAX_EVENTS);
36
+ const compactEvery = Math.max(1, options.compactEvery ?? DEFAULT_COMPACT_EVERY);
37
+ let appendCount = 0;
38
+ let queue = Promise.resolve();
39
+ async function ensureDirectory(fs, path) {
40
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
41
+ }
42
+ async function readEvents() {
43
+ const { fs } = await loadNodeModules();
44
+ let content;
45
+ try {
46
+ content = await fs.readFile(filePath, "utf8");
47
+ }
48
+ catch (error) {
49
+ if (isErrnoException(error) && error.code === "ENOENT")
50
+ return [];
51
+ throw error;
52
+ }
53
+ return content
54
+ .split("\n")
55
+ .map((line) => line.trim())
56
+ .filter(Boolean)
57
+ .map(parseJsonLine)
58
+ .filter((event) => event !== undefined)
59
+ .slice(-maxEvents);
60
+ }
61
+ async function writeEvents(events) {
62
+ const { fs, path } = await loadNodeModules();
63
+ await ensureDirectory(fs, path);
64
+ const content = events.map((event) => JSON.stringify(event)).join("\n");
65
+ await fs.writeFile(filePath, content ? `${content}\n` : "", "utf8");
66
+ }
67
+ function enqueue(task) {
68
+ queue = queue.then(task, task);
69
+ return queue;
70
+ }
71
+ return {
72
+ name: "file",
73
+ async load() {
74
+ const events = await readEvents();
75
+ await writeEvents(events);
76
+ return events;
77
+ },
78
+ append(event, events) {
79
+ appendCount += 1;
80
+ const currentAppendCount = appendCount;
81
+ return enqueue(async () => {
82
+ const shouldCompact = currentAppendCount % compactEvery === 0 || events.length >= maxEvents;
83
+ if (shouldCompact) {
84
+ await writeEvents(events.slice(-maxEvents));
85
+ return;
86
+ }
87
+ const { fs, path } = await loadNodeModules();
88
+ await ensureDirectory(fs, path);
89
+ await fs.appendFile(filePath, `${JSON.stringify(event)}\n`, "utf8");
90
+ });
91
+ },
92
+ clear() {
93
+ appendCount = 0;
94
+ return enqueue(async () => {
95
+ await writeEvents([]);
96
+ });
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=persistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persistence.js","sourceRoot":"","sources":["../src/persistence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { type ProviderCustomInstrumentationEventInput, type ProviderInstrumentation, type ProviderInstrumentationOptions } from "@beignet/core/providers";
2
+ import type { DevtoolsPort } from "./index";
3
+ export type ProviderDevtoolsOptions = ProviderInstrumentationOptions;
4
+ export type ProviderCustomDevtoolsEventInput = ProviderCustomInstrumentationEventInput;
5
+ export type ProviderDevtools = ProviderInstrumentation;
6
+ export declare function isDevtoolsPort(value: unknown): value is DevtoolsPort;
7
+ export declare function resolveDevtoolsPort(target: unknown): DevtoolsPort | undefined;
8
+ export declare function createProviderDevtools(target: unknown, options: ProviderDevtoolsOptions): ProviderDevtools;
9
+ //# sourceMappingURL=provider-instrumentation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-instrumentation.d.ts","sourceRoot":"","sources":["../src/provider-instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,uCAAuC,EAC5C,KAAK,uBAAuB,EAC5B,KAAK,8BAA8B,EACpC,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,MAAM,MAAM,uBAAuB,GAAG,8BAA8B,CAAC;AACrE,MAAM,MAAM,gCAAgC,GAC1C,uCAAuC,CAAC;AAC1C,MAAM,MAAM,gBAAgB,GAAG,uBAAuB,CAAC;AAEvD,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,YAAY,CAUpE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,GAAG,SAAS,CAa7E;AAED,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,OAAO,EACf,OAAO,EAAE,uBAAuB,GAC/B,gBAAgB,CAKlB"}
@@ -0,0 +1,25 @@
1
+ import { createProviderInstrumentation, isProviderInstrumentationPort, } from "@beignet/core/providers";
2
+ export function isDevtoolsPort(value) {
3
+ return (isProviderInstrumentationPort(value) &&
4
+ typeof value === "object" &&
5
+ value !== null &&
6
+ "getEvents" in value &&
7
+ typeof value.getEvents === "function" &&
8
+ "isWatcherEnabled" in value &&
9
+ typeof value.isWatcherEnabled === "function");
10
+ }
11
+ export function resolveDevtoolsPort(target) {
12
+ if (isDevtoolsPort(target))
13
+ return target;
14
+ if (typeof target === "object" &&
15
+ target !== null &&
16
+ "devtools" in target &&
17
+ isDevtoolsPort(target.devtools)) {
18
+ return target.devtools;
19
+ }
20
+ return undefined;
21
+ }
22
+ export function createProviderDevtools(target, options) {
23
+ return createProviderInstrumentation(resolveDevtoolsPort(target) ?? undefined, options);
24
+ }
25
+ //# sourceMappingURL=provider-instrumentation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-instrumentation.js","sourceRoot":"","sources":["../src/provider-instrumentation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,6BAA6B,GAI9B,MAAM,yBAAyB,CAAC;AAQjC,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,CACL,6BAA6B,CAAC,KAAK,CAAC;QACpC,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,WAAW,IAAI,KAAK;QACpB,OAAO,KAAK,CAAC,SAAS,KAAK,UAAU;QACrC,kBAAkB,IAAI,KAAK;QAC3B,OAAO,KAAK,CAAC,gBAAgB,KAAK,UAAU,CAC7C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAe;IACjD,IAAI,cAAc,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,IACE,OAAO,MAAM,KAAK,QAAQ;QAC1B,MAAM,KAAK,IAAI;QACf,UAAU,IAAI,MAAM;QACpB,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,EAC/B,CAAC;QACD,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,MAAe,EACf,OAAgC;IAEhC,OAAO,6BAA6B,CAClC,mBAAmB,CAAC,MAAM,CAAC,IAAI,SAAS,EACxC,OAAO,CACR,CAAC;AACJ,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Devtools provider implementation
3
+ *
4
+ * Provides an in-memory event buffer that can be attached to ctx.ports.devtools.
5
+ * The provider is disabled by default in production environments.
6
+ */
7
+ import { z } from "zod";
8
+ import type { DevtoolsEvent, DevtoolsEventInput, DevtoolsRedactor } from "./events";
9
+ import type { DevtoolsPort } from "./index";
10
+ import { type DevtoolsEventStore } from "./persistence";
11
+ import { type DevtoolsWatchersOptions } from "./watchers";
12
+ export interface InMemoryDevtoolsOptions {
13
+ maxEvents?: number;
14
+ redact?: DevtoolsRedactor;
15
+ watchers?: DevtoolsWatchersOptions;
16
+ initialEvents?: readonly DevtoolsEvent[];
17
+ store?: DevtoolsEventStore;
18
+ }
19
+ export declare function createDevtoolsEvent(event: DevtoolsEventInput): DevtoolsEvent;
20
+ /**
21
+ * Create an in-memory devtools implementation.
22
+ *
23
+ * This implementation stores events in a bounded buffer (max 500 events).
24
+ * When the buffer is full, the oldest events are removed to make room for new ones.
25
+ *
26
+ * @returns A DevtoolsPort implementation
27
+ */
28
+ export declare function createInMemoryDevtools(options?: InMemoryDevtoolsOptions): DevtoolsPort;
29
+ /**
30
+ * Configuration schema for the devtools provider.
31
+ */
32
+ declare const DevtoolsConfigSchema: z.ZodObject<{
33
+ ENABLED: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean | undefined, string | undefined>>;
34
+ MAX_EVENTS: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
35
+ PERSIST: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean | undefined, string | undefined>>;
36
+ PERSIST_PATH: z.ZodOptional<z.ZodString>;
37
+ }, z.core.$strip>;
38
+ export type DevtoolsConfig = z.infer<typeof DevtoolsConfigSchema>;
39
+ export interface DevtoolsProviderOptions {
40
+ enabled?: boolean;
41
+ maxEvents?: number;
42
+ redact?: DevtoolsRedactor;
43
+ watchers?: DevtoolsWatchersOptions;
44
+ store?: DevtoolsEventStore | (() => DevtoolsEventStore | Promise<DevtoolsEventStore>);
45
+ }
46
+ /**
47
+ * Devtools service provider.
48
+ *
49
+ * This provider attaches a DevtoolsPort to ctx.ports.devtools.
50
+ * It can be enabled/disabled via the DEVTOOLS_ENABLED environment variable.
51
+ * By default, it's enabled in non-production environments and disabled in production.
52
+ *
53
+ * @example
54
+ * ```ts
55
+ * import { createDevtoolsProvider } from "@beignet/devtools";
56
+ * import { createServer } from "@beignet/core/server";
57
+ *
58
+ * const server = await createServer({
59
+ * ports,
60
+ * providers: [createDevtoolsProvider()],
61
+ * });
62
+ * ```
63
+ *
64
+ * To explicitly enable/disable:
65
+ * ```bash
66
+ * DEVTOOLS_ENABLED=true npm run dev
67
+ * DEVTOOLS_ENABLED=false npm run dev
68
+ * ```
69
+ */
70
+ export declare function createDevtoolsProvider(options?: DevtoolsProviderOptions): import("@beignet/core/providers").ServiceProvider<Record<string, unknown>, z.ZodObject<{
71
+ ENABLED: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean | undefined, string | undefined>>;
72
+ MAX_EVENTS: z.ZodOptional<z.ZodCoercedNumber<unknown>>;
73
+ PERSIST: z.ZodPipe<z.ZodOptional<z.ZodString>, z.ZodTransform<boolean | undefined, string | undefined>>;
74
+ PERSIST_PATH: z.ZodOptional<z.ZodString>;
75
+ }, z.core.$strip>, {
76
+ devtools: DevtoolsPort;
77
+ }>;
78
+ export {};
79
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,aAAa,EACb,kBAAkB,EAElB,gBAAgB,EAEjB,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5D,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,eAAe,CAAC;AAKvB,OAAO,EAEL,KAAK,uBAAuB,EAI7B,MAAM,YAAY,CAAC;AAQpB,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,aAAa,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,KAAK,CAAC,EAAE,kBAAkB,CAAC;CAC5B;AASD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,kBAAkB,GAAG,aAAa,CAM5E;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,GAAE,uBAA4B,GACpC,YAAY,CA+Jd;AAED;;GAEG;AACH,QAAA,MAAM,oBAAoB;;;;;iBAWxB,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,MAAM,WAAW,uBAAuB;IACtC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,KAAK,CAAC,EACF,kBAAkB,GAClB,CAAC,MAAM,kBAAkB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC;CAC9D;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,GAAE,uBAA4B;;;;;;cAI5D,YAAY;GAqF3B"}