@chaiops/n-ext 0.0.1-alpha

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.
package/dist/cli.js ADDED
@@ -0,0 +1,60 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __create = Object.create;
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getProtoOf = Object.getPrototypeOf;
8
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
9
+ var __copyProps = (to, from, except, desc) => {
10
+ if (from && typeof from === "object" || typeof from === "function") {
11
+ for (let key of __getOwnPropNames(from))
12
+ if (!__hasOwnProp.call(to, key) && key !== except)
13
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
+ }
15
+ return to;
16
+ };
17
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
+ // If the importer is in node compatibility mode or this is not an ESM
19
+ // file that has been converted to a CommonJS file using a Babel-
20
+ // compatible transform (i.e. "__esModule" has not been set), then set
21
+ // "default" to the CommonJS "module.exports" for node compatibility.
22
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
+ mod
24
+ ));
25
+
26
+ // src/cli.ts
27
+ var import_node_child_process = require("child_process");
28
+ var path = __toESM(require("path"));
29
+ var args = process.argv.slice(2);
30
+ var command = args[0];
31
+ if (command !== "dev") {
32
+ console.error(`[n-ext] Unknown command: ${command}`);
33
+ console.error("Usage: n-ext dev [...next-args]");
34
+ process.exit(1);
35
+ }
36
+ if (process.env.NODE_ENV === "production") {
37
+ console.error("[n-ext] Cannot run in production mode");
38
+ process.exit(1);
39
+ }
40
+ var registerPath = path.resolve(__dirname, "runtime", "register.js");
41
+ var existingNodeOptions = process.env.NODE_OPTIONS || "";
42
+ var nodeOptions = `--require ${registerPath} ${existingNodeOptions}`.trim();
43
+ var nextArgs = ["dev", ...args.slice(1)];
44
+ var nextBin = path.resolve(process.cwd(), "node_modules", ".bin", "next");
45
+ var child = (0, import_node_child_process.spawn)(nextBin, nextArgs, {
46
+ stdio: "inherit",
47
+ env: {
48
+ ...process.env,
49
+ NODE_OPTIONS: nodeOptions
50
+ }
51
+ });
52
+ child.on("exit", (code) => {
53
+ process.exit(code ?? 0);
54
+ });
55
+ for (const signal of ["SIGINT", "SIGTERM"]) {
56
+ process.on(signal, () => {
57
+ child.kill(signal);
58
+ });
59
+ }
60
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { spawn } from \"node:child_process\";\nimport * as path from \"node:path\";\n\nconst args = process.argv.slice(2);\nconst command = args[0];\n\nif (command !== \"dev\") {\n console.error(`[n-ext] Unknown command: ${command}`);\n console.error(\"Usage: n-ext dev [...next-args]\");\n process.exit(1);\n}\n\nif (process.env.NODE_ENV === \"production\") {\n console.error(\"[n-ext] Cannot run in production mode\");\n process.exit(1);\n}\n\nconst registerPath = path.resolve(__dirname, \"runtime\", \"register.js\");\nconst existingNodeOptions = process.env.NODE_OPTIONS || \"\";\nconst nodeOptions = `--require ${registerPath} ${existingNodeOptions}`.trim();\n\nconst nextArgs = [\"dev\", ...args.slice(1)];\nconst nextBin = path.resolve(process.cwd(), \"node_modules\", \".bin\", \"next\");\n\nconst child = spawn(nextBin, nextArgs, {\n stdio: \"inherit\",\n env: {\n ...process.env,\n NODE_OPTIONS: nodeOptions,\n },\n});\n\nchild.on(\"exit\", (code) => {\n process.exit(code ?? 0);\n});\n\nfor (const signal of [\"SIGINT\", \"SIGTERM\"] as const) {\n process.on(signal, () => {\n child.kill(signal);\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,gCAAsB;AACtB,WAAsB;AAEtB,IAAM,OAAO,QAAQ,KAAK,MAAM,CAAC;AACjC,IAAM,UAAU,KAAK,CAAC;AAEtB,IAAI,YAAY,OAAO;AACrB,UAAQ,MAAM,4BAA4B,OAAO,EAAE;AACnD,UAAQ,MAAM,iCAAiC;AAC/C,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAI,QAAQ,IAAI,aAAa,cAAc;AACzC,UAAQ,MAAM,uCAAuC;AACrD,UAAQ,KAAK,CAAC;AAChB;AAEA,IAAM,eAAoB,aAAQ,WAAW,WAAW,aAAa;AACrE,IAAM,sBAAsB,QAAQ,IAAI,gBAAgB;AACxD,IAAM,cAAc,aAAa,YAAY,IAAI,mBAAmB,GAAG,KAAK;AAE5E,IAAM,WAAW,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC,CAAC;AACzC,IAAM,UAAe,aAAQ,QAAQ,IAAI,GAAG,gBAAgB,QAAQ,MAAM;AAE1E,IAAM,YAAQ,iCAAM,SAAS,UAAU;AAAA,EACrC,OAAO;AAAA,EACP,KAAK;AAAA,IACH,GAAG,QAAQ;AAAA,IACX,cAAc;AAAA,EAChB;AACF,CAAC;AAED,MAAM,GAAG,QAAQ,CAAC,SAAS;AACzB,UAAQ,KAAK,QAAQ,CAAC;AACxB,CAAC;AAED,WAAW,UAAU,CAAC,UAAU,SAAS,GAAY;AACnD,UAAQ,GAAG,QAAQ,MAAM;AACvB,UAAM,KAAK,MAAM;AAAA,EACnB,CAAC;AACH;","names":[]}
@@ -0,0 +1,392 @@
1
+ "use strict";
2
+
3
+ // src/shared/constants.ts
4
+ var SEE_HOST = "127.0.0.1";
5
+ var SEE_PORT = 3894;
6
+ var MAX_BODY = 64 * 1024;
7
+ var MAX_EVENTS = 1e3;
8
+
9
+ // src/runtime/event-store.ts
10
+ var http = require("http");
11
+ var originalHttpRequest = http.request.bind(http);
12
+ var STORE_KEY = /* @__PURE__ */ Symbol.for("__n_ext_store__");
13
+ function getStore() {
14
+ const g2 = globalThis;
15
+ if (!g2[STORE_KEY]) {
16
+ g2[STORE_KEY] = { events: [], cursor: 0, remote: false };
17
+ }
18
+ return g2[STORE_KEY];
19
+ }
20
+ function setRemoteMode() {
21
+ getStore().remote = true;
22
+ }
23
+ function sendToServer(event) {
24
+ const data = JSON.stringify(event);
25
+ const req = originalHttpRequest({
26
+ hostname: SEE_HOST,
27
+ port: SEE_PORT,
28
+ path: "/ingest",
29
+ method: "POST",
30
+ headers: { "Content-Type": "application/json", "Content-Length": Buffer.byteLength(data) }
31
+ });
32
+ req.on("error", () => {
33
+ });
34
+ req.end(data);
35
+ }
36
+ function addEvent(event) {
37
+ const store = getStore();
38
+ if (store.remote) {
39
+ sendToServer(event);
40
+ return { ...event, cursor: 0 };
41
+ }
42
+ store.cursor++;
43
+ const stored = { ...event, cursor: store.cursor };
44
+ store.events.push(stored);
45
+ if (store.events.length > MAX_EVENTS) {
46
+ store.events.shift();
47
+ }
48
+ return stored;
49
+ }
50
+ function clearEvents() {
51
+ const store = getStore();
52
+ store.events = [];
53
+ return store.cursor;
54
+ }
55
+ function getEvents(afterCursor = 0) {
56
+ const store = getStore();
57
+ let events;
58
+ if (afterCursor > 0) {
59
+ let lo = 0, hi = store.events.length;
60
+ while (lo < hi) {
61
+ const mid = lo + hi >>> 1;
62
+ if (store.events[mid].cursor <= afterCursor) lo = mid + 1;
63
+ else hi = mid;
64
+ }
65
+ events = store.events.slice(lo);
66
+ } else {
67
+ events = store.events;
68
+ }
69
+ return { cursor: store.cursor, events };
70
+ }
71
+
72
+ // src/runtime/fetch-interceptor.ts
73
+ function headersToRecord(headers) {
74
+ const result = {};
75
+ if (!headers) return result;
76
+ if (headers instanceof Headers) {
77
+ headers.forEach((v, k) => {
78
+ result[k] = v;
79
+ });
80
+ } else if (Array.isArray(headers)) {
81
+ for (const [k, v] of headers) result[k] = v;
82
+ } else {
83
+ Object.assign(result, headers);
84
+ }
85
+ return result;
86
+ }
87
+ function extractRequestBody(init) {
88
+ const body = init?.body;
89
+ if (!body) return null;
90
+ if (typeof body === "string") return body.slice(0, MAX_BODY);
91
+ if (body instanceof ArrayBuffer) return new TextDecoder().decode(body).slice(0, MAX_BODY);
92
+ if (body instanceof URLSearchParams) return body.toString().slice(0, MAX_BODY);
93
+ return "[stream]";
94
+ }
95
+ async function readBody(body) {
96
+ if (!body) return null;
97
+ try {
98
+ const reader = body.getReader();
99
+ const chunks = [];
100
+ let size = 0;
101
+ while (true) {
102
+ const { done, value } = await reader.read();
103
+ if (done) break;
104
+ chunks.push(value);
105
+ size += value.length;
106
+ if (size > MAX_BODY) {
107
+ reader.cancel();
108
+ break;
109
+ }
110
+ }
111
+ const merged = new Uint8Array(size);
112
+ let offset = 0;
113
+ for (const c of chunks) {
114
+ merged.set(c, offset);
115
+ offset += c.length;
116
+ }
117
+ return new TextDecoder().decode(merged);
118
+ } catch {
119
+ return null;
120
+ }
121
+ }
122
+ var installed = false;
123
+ function installFetchInterceptor() {
124
+ if (installed) return;
125
+ installed = true;
126
+ const originalFetch = globalThis.fetch;
127
+ globalThis.fetch = async function interceptedFetch(input, init) {
128
+ const url = typeof input === "string" ? input : input instanceof URL ? input.href : input.url;
129
+ if (url.includes(`${SEE_HOST}:${SEE_PORT}`)) return originalFetch(input, init);
130
+ const method = (init?.method ?? (input instanceof Request ? input.method : "GET")).toUpperCase();
131
+ const requestHeaders = headersToRecord(
132
+ init?.headers ?? (input instanceof Request ? input.headers : void 0)
133
+ );
134
+ const requestBody = extractRequestBody(init);
135
+ const id = crypto.randomUUID();
136
+ const start = performance.now();
137
+ let response;
138
+ try {
139
+ response = await originalFetch(input, init);
140
+ } catch (err) {
141
+ addEvent({
142
+ id,
143
+ url,
144
+ method,
145
+ requestHeaders,
146
+ requestBody,
147
+ status: null,
148
+ statusText: null,
149
+ responseHeaders: {},
150
+ responseBody: null,
151
+ responseSize: null,
152
+ duration: performance.now() - start,
153
+ timestamp: Date.now(),
154
+ error: err instanceof Error ? err.message : String(err),
155
+ source: "fetch"
156
+ });
157
+ throw err;
158
+ }
159
+ const duration = performance.now() - start;
160
+ const responseHeaders = headersToRecord(response.headers);
161
+ const cloned = response.clone();
162
+ readBody(cloned.body).then((responseBody) => {
163
+ addEvent({
164
+ id,
165
+ url,
166
+ method,
167
+ requestHeaders,
168
+ requestBody,
169
+ status: response.status,
170
+ statusText: response.statusText,
171
+ responseHeaders,
172
+ responseBody,
173
+ responseSize: responseBody?.length ?? null,
174
+ duration,
175
+ timestamp: Date.now(),
176
+ error: null,
177
+ source: "fetch"
178
+ });
179
+ });
180
+ return response;
181
+ };
182
+ }
183
+
184
+ // src/runtime/http-interceptor.ts
185
+ var http2 = require("http");
186
+ var https = require("https");
187
+ function isSelfRequest(options) {
188
+ if (typeof options === "string" || options instanceof URL) {
189
+ try {
190
+ const u = new URL(typeof options === "string" ? options : options.href);
191
+ return u.hostname === SEE_HOST && Number(u.port) === SEE_PORT;
192
+ } catch {
193
+ return false;
194
+ }
195
+ }
196
+ return options.hostname === SEE_HOST && Number(options.port) === SEE_PORT;
197
+ }
198
+ function extractUrl(options, protocol) {
199
+ if (typeof options === "string") return options;
200
+ if (options instanceof URL) return options.href;
201
+ const host = options.hostname || options.host || "localhost";
202
+ const port = options.port ? `:${options.port}` : "";
203
+ const path = options.path || "/";
204
+ return `${protocol}//${host}${port}${path}`;
205
+ }
206
+ function headersToRecord2(raw) {
207
+ const result = {};
208
+ if (!raw) return result;
209
+ for (const [k, v] of Object.entries(raw)) {
210
+ if (v != null) result[k] = Array.isArray(v) ? v.join(", ") : String(v);
211
+ }
212
+ return result;
213
+ }
214
+ function patchModule(mod, protocol) {
215
+ const originalRequest = mod.request;
216
+ const originalGet = mod.get;
217
+ function interceptRequest(...args) {
218
+ const [urlOrOpts, optsOrCb, maybeCb] = args;
219
+ if (isSelfRequest(urlOrOpts)) {
220
+ return originalRequest.apply(mod, args);
221
+ }
222
+ const url = extractUrl(urlOrOpts, protocol);
223
+ const options = typeof urlOrOpts === "string" || urlOrOpts instanceof URL ? typeof optsOrCb === "object" ? optsOrCb : {} : urlOrOpts;
224
+ const method = (options.method || "GET").toUpperCase();
225
+ const requestHeaders = headersToRecord2(options.headers);
226
+ const id = crypto.randomUUID();
227
+ const start = performance.now();
228
+ const requestChunks = [];
229
+ let requestSize = 0;
230
+ const req = originalRequest.apply(mod, args);
231
+ const origWrite = req.write.bind(req);
232
+ req.write = function(chunk, ...rest) {
233
+ if (chunk && requestSize < MAX_BODY) {
234
+ const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
235
+ requestChunks.push(buf);
236
+ requestSize += buf.length;
237
+ }
238
+ return origWrite(chunk, ...rest);
239
+ };
240
+ req.on("response", (res) => {
241
+ const responseChunks = [];
242
+ let responseSize = 0;
243
+ res.on("data", (chunk) => {
244
+ responseSize += chunk.length;
245
+ if (responseSize <= MAX_BODY) {
246
+ responseChunks.push(chunk);
247
+ }
248
+ });
249
+ res.on("end", () => {
250
+ const responseHeaders = headersToRecord2(res.headers);
251
+ const responseBody = Buffer.concat(responseChunks).toString("utf-8").slice(0, MAX_BODY);
252
+ const requestBody = requestChunks.length > 0 ? Buffer.concat(requestChunks).toString("utf-8").slice(0, MAX_BODY) : null;
253
+ addEvent({
254
+ id,
255
+ url,
256
+ method,
257
+ requestHeaders,
258
+ requestBody,
259
+ status: res.statusCode ?? null,
260
+ statusText: res.statusMessage ?? null,
261
+ responseHeaders,
262
+ responseBody,
263
+ responseSize,
264
+ duration: performance.now() - start,
265
+ timestamp: Date.now(),
266
+ error: null,
267
+ source: "http"
268
+ });
269
+ });
270
+ });
271
+ req.on("error", (err) => {
272
+ const requestBody = requestChunks.length > 0 ? Buffer.concat(requestChunks).toString("utf-8").slice(0, MAX_BODY) : null;
273
+ addEvent({
274
+ id,
275
+ url,
276
+ method,
277
+ requestHeaders,
278
+ requestBody,
279
+ status: null,
280
+ statusText: null,
281
+ responseHeaders: {},
282
+ responseBody: null,
283
+ responseSize: null,
284
+ duration: performance.now() - start,
285
+ timestamp: Date.now(),
286
+ error: err.message,
287
+ source: "http"
288
+ });
289
+ });
290
+ return req;
291
+ }
292
+ mod.request = interceptRequest;
293
+ mod.get = function(...args) {
294
+ const req = mod.request(...args);
295
+ req.end();
296
+ return req;
297
+ };
298
+ }
299
+ var installed2 = false;
300
+ function installHttpInterceptor() {
301
+ if (installed2) return;
302
+ installed2 = true;
303
+ patchModule(http2, "http:");
304
+ patchModule(https, "https:");
305
+ }
306
+
307
+ // src/server/see-endpoint.ts
308
+ var http3 = require("http");
309
+ function startSeeServer() {
310
+ return new Promise((resolve) => {
311
+ const server = http3.createServer((req, res) => {
312
+ res.setHeader("Access-Control-Allow-Origin", "*");
313
+ res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
314
+ res.setHeader("Access-Control-Allow-Headers", "Content-Type");
315
+ if (req.method === "OPTIONS") {
316
+ res.writeHead(204);
317
+ res.end();
318
+ return;
319
+ }
320
+ const url = new URL(req.url || "/", `http://${SEE_HOST}:${SEE_PORT}`);
321
+ if (url.pathname === "/see" && req.method === "GET") {
322
+ const cursorParam = url.searchParams.get("cursor");
323
+ const afterCursor = cursorParam ? parseInt(cursorParam, 10) : 0;
324
+ const result = getEvents(isNaN(afterCursor) ? 0 : afterCursor);
325
+ res.writeHead(200, { "Content-Type": "application/json" });
326
+ res.end(JSON.stringify(result));
327
+ return;
328
+ }
329
+ if (url.pathname === "/ingest" && req.method === "POST") {
330
+ let body = "";
331
+ let bodySize = 0;
332
+ const MAX_INGEST = 256 * 1024;
333
+ req.on("data", (chunk) => {
334
+ bodySize += chunk.length;
335
+ if (bodySize > MAX_INGEST) {
336
+ req.destroy();
337
+ return;
338
+ }
339
+ body += chunk;
340
+ });
341
+ req.on("end", () => {
342
+ try {
343
+ const event = JSON.parse(body);
344
+ addEvent(event);
345
+ res.writeHead(200, { "Content-Type": "application/json" });
346
+ res.end(JSON.stringify({ ok: true }));
347
+ } catch {
348
+ res.writeHead(400, { "Content-Type": "application/json" });
349
+ res.end(JSON.stringify({ error: "Invalid JSON" }));
350
+ }
351
+ });
352
+ return;
353
+ }
354
+ if (url.pathname === "/clear" && req.method === "POST") {
355
+ const newCursor = clearEvents();
356
+ res.writeHead(200, { "Content-Type": "application/json" });
357
+ res.end(JSON.stringify({ ok: true, cursor: newCursor }));
358
+ return;
359
+ }
360
+ res.writeHead(404, { "Content-Type": "application/json" });
361
+ res.end(JSON.stringify({ error: "Not found. Use GET /see" }));
362
+ });
363
+ server.on("error", (err) => {
364
+ if (err.code === "EADDRINUSE") {
365
+ resolve(false);
366
+ return;
367
+ }
368
+ console.error("[n-ext] Server error:", err);
369
+ resolve(false);
370
+ });
371
+ server.listen(SEE_PORT, SEE_HOST, () => {
372
+ console.log(`[n-ext] DevTools server running at http://${SEE_HOST}:${SEE_PORT}/see`);
373
+ resolve(true);
374
+ });
375
+ });
376
+ }
377
+
378
+ // src/runtime/register.ts
379
+ var INIT_KEY = /* @__PURE__ */ Symbol.for("__n_ext_init__");
380
+ var g = globalThis;
381
+ if (!g[INIT_KEY]) {
382
+ g[INIT_KEY] = true;
383
+ startSeeServer().then((isServer) => {
384
+ if (!isServer) {
385
+ setRemoteMode();
386
+ }
387
+ installHttpInterceptor();
388
+ installFetchInterceptor();
389
+ console.log(`[n-ext] Interceptors installed (${isServer ? "server" : "client"} mode)`);
390
+ });
391
+ }
392
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/shared/constants.ts","../../src/runtime/event-store.ts","../../src/runtime/fetch-interceptor.ts","../../src/runtime/http-interceptor.ts","../../src/server/see-endpoint.ts","../../src/runtime/register.ts"],"sourcesContent":["export const SEE_HOST = \"127.0.0.1\";\nexport const SEE_PORT = 3894;\nexport const MAX_BODY = 64 * 1024;\nexport const MAX_EVENTS = 1000;\n","import type { NExtEvent } from \"../shared/event-types\";\nimport { SEE_HOST, SEE_PORT, MAX_EVENTS } from \"../shared/constants\";\n\nconst http = require(\"node:http\") as typeof import(\"node:http\");\n// Save original before interceptors patch it\nconst originalHttpRequest = http.request.bind(http);\n\nconst STORE_KEY = Symbol.for(\"__n_ext_store__\");\n\ninterface Store {\n events: NExtEvent[];\n cursor: number;\n remote: boolean;\n}\n\nfunction getStore(): Store {\n const g = globalThis as unknown as Record<symbol, Store | undefined>;\n if (!g[STORE_KEY]) {\n g[STORE_KEY] = { events: [], cursor: 0, remote: false };\n }\n return g[STORE_KEY]!;\n}\n\nexport function setRemoteMode() {\n getStore().remote = true;\n}\n\nfunction sendToServer(event: Omit<NExtEvent, \"cursor\">) {\n const data = JSON.stringify(event);\n const req = originalHttpRequest({\n hostname: SEE_HOST,\n port: SEE_PORT,\n path: \"/ingest\",\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\", \"Content-Length\": Buffer.byteLength(data) },\n });\n req.on(\"error\", () => {}); // silently ignore\n req.end(data);\n}\n\nexport function addEvent(event: Omit<NExtEvent, \"cursor\">): NExtEvent {\n const store = getStore();\n\n if (store.remote) {\n sendToServer(event);\n return { ...event, cursor: 0 };\n }\n\n store.cursor++;\n const stored: NExtEvent = { ...event, cursor: store.cursor };\n store.events.push(stored);\n if (store.events.length > MAX_EVENTS) {\n store.events.shift();\n }\n return stored;\n}\n\nexport function clearEvents(): number {\n const store = getStore();\n store.events = [];\n return store.cursor;\n}\n\nexport function getEvents(afterCursor: number = 0): { cursor: number; events: NExtEvent[] } {\n const store = getStore();\n let events: NExtEvent[];\n if (afterCursor > 0) {\n // Cursors are monotonically increasing — find start index with binary search\n let lo = 0, hi = store.events.length;\n while (lo < hi) {\n const mid = (lo + hi) >>> 1;\n if (store.events[mid].cursor <= afterCursor) lo = mid + 1;\n else hi = mid;\n }\n events = store.events.slice(lo);\n } else {\n events = store.events;\n }\n return { cursor: store.cursor, events };\n}\n","import { addEvent } from \"./event-store\";\nimport type { NExtEvent } from \"../shared/event-types\";\nimport { SEE_HOST, SEE_PORT, MAX_BODY } from \"../shared/constants\";\n\nfunction headersToRecord(headers: HeadersInit | undefined): Record<string, string> {\n const result: Record<string, string> = {};\n if (!headers) return result;\n if (headers instanceof Headers) {\n headers.forEach((v, k) => { result[k] = v; });\n } else if (Array.isArray(headers)) {\n for (const [k, v] of headers) result[k] = v;\n } else {\n Object.assign(result, headers);\n }\n return result;\n}\n\nfunction extractRequestBody(init: RequestInit | undefined): string | null {\n const body = init?.body;\n if (!body) return null;\n if (typeof body === \"string\") return body.slice(0, MAX_BODY);\n if (body instanceof ArrayBuffer) return new TextDecoder().decode(body).slice(0, MAX_BODY);\n if (body instanceof URLSearchParams) return body.toString().slice(0, MAX_BODY);\n return \"[stream]\";\n}\n\nasync function readBody(body: ReadableStream<Uint8Array> | null): Promise<string | null> {\n if (!body) return null;\n try {\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n chunks.push(value);\n size += value.length;\n if (size > MAX_BODY) { reader.cancel(); break; }\n }\n const merged = new Uint8Array(size);\n let offset = 0;\n for (const c of chunks) { merged.set(c, offset); offset += c.length; }\n return new TextDecoder().decode(merged);\n } catch {\n return null;\n }\n}\n\nlet installed = false;\n\nexport function installFetchInterceptor() {\n if (installed) return;\n installed = true;\n\n const originalFetch = globalThis.fetch;\n\n globalThis.fetch = async function interceptedFetch(\n input: RequestInfo | URL,\n init?: RequestInit\n ): Promise<Response> {\n const url = typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url;\n\n if (url.includes(`${SEE_HOST}:${SEE_PORT}`)) return originalFetch(input, init);\n\n const method = (init?.method ?? (input instanceof Request ? input.method : \"GET\")).toUpperCase();\n const requestHeaders = headersToRecord(\n init?.headers ?? (input instanceof Request ? input.headers : undefined)\n );\n const requestBody = extractRequestBody(init);\n const id = crypto.randomUUID();\n const start = performance.now();\n\n let response: Response;\n try {\n response = await originalFetch(input, init);\n } catch (err: unknown) {\n addEvent({\n id, url, method, requestHeaders, requestBody,\n status: null, statusText: null, responseHeaders: {}, responseBody: null,\n responseSize: null, duration: performance.now() - start,\n timestamp: Date.now(), error: err instanceof Error ? err.message : String(err),\n source: \"fetch\",\n });\n throw err;\n }\n\n const duration = performance.now() - start;\n const responseHeaders = headersToRecord(response.headers);\n\n const cloned = response.clone();\n readBody(cloned.body).then((responseBody) => {\n addEvent({\n id, url, method, requestHeaders, requestBody,\n status: response.status, statusText: response.statusText,\n responseHeaders, responseBody, responseSize: responseBody?.length ?? null,\n duration, timestamp: Date.now(), error: null,\n source: \"fetch\",\n });\n });\n\n return response;\n };\n}\n","import { addEvent } from \"./event-store\";\nimport { SEE_HOST, SEE_PORT, MAX_BODY } from \"../shared/constants\";\n\n// Use require to get the mutable CJS module objects (ESM imports give frozen namespace)\nconst http = require(\"node:http\") as typeof import(\"node:http\");\nconst https = require(\"node:https\") as typeof import(\"node:https\");\n\nfunction isSelfRequest(options: http.RequestOptions | string | URL): boolean {\n if (typeof options === \"string\" || options instanceof URL) {\n try {\n const u = new URL(typeof options === \"string\" ? options : options.href);\n return u.hostname === SEE_HOST && Number(u.port) === SEE_PORT;\n } catch {\n return false;\n }\n }\n return options.hostname === SEE_HOST && Number(options.port) === SEE_PORT;\n}\n\nfunction extractUrl(options: http.RequestOptions | string | URL, protocol: string): string {\n if (typeof options === \"string\") return options;\n if (options instanceof URL) return options.href;\n const host = options.hostname || options.host || \"localhost\";\n const port = options.port ? `:${options.port}` : \"\";\n const path = options.path || \"/\";\n return `${protocol}//${host}${port}${path}`;\n}\n\nfunction headersToRecord(raw: http.OutgoingHttpHeaders | undefined): Record<string, string> {\n const result: Record<string, string> = {};\n if (!raw) return result;\n for (const [k, v] of Object.entries(raw)) {\n if (v != null) result[k] = Array.isArray(v) ? v.join(\", \") : String(v);\n }\n return result;\n}\n\nfunction patchModule(mod: typeof http | typeof https, protocol: string) {\n const originalRequest = mod.request;\n const originalGet = mod.get;\n\n function interceptRequest(\n this: unknown,\n ...args: Parameters<typeof http.request>\n ): http.ClientRequest {\n const [urlOrOpts, optsOrCb, maybeCb] = args;\n\n if (isSelfRequest(urlOrOpts)) {\n return originalRequest.apply(mod, args as any);\n }\n\n const url = extractUrl(urlOrOpts, protocol);\n const options: http.RequestOptions =\n typeof urlOrOpts === \"string\" || urlOrOpts instanceof URL\n ? (typeof optsOrCb === \"object\" ? optsOrCb : {})\n : urlOrOpts;\n\n const method = (options.method || \"GET\").toUpperCase();\n const requestHeaders = headersToRecord(options.headers);\n const id = crypto.randomUUID();\n const start = performance.now();\n const requestChunks: Buffer[] = [];\n let requestSize = 0;\n\n const req = originalRequest.apply(mod, args as any) as http.ClientRequest;\n\n const origWrite = req.write.bind(req);\n req.write = function (chunk: any, ...rest: any[]): boolean {\n if (chunk && requestSize < MAX_BODY) {\n const buf = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n requestChunks.push(buf);\n requestSize += buf.length;\n }\n return origWrite(chunk, ...rest);\n } as any;\n\n req.on(\"response\", (res: http.IncomingMessage) => {\n const responseChunks: Buffer[] = [];\n let responseSize = 0;\n\n res.on(\"data\", (chunk: Buffer) => {\n responseSize += chunk.length;\n if (responseSize <= MAX_BODY) {\n responseChunks.push(chunk);\n }\n });\n\n res.on(\"end\", () => {\n const responseHeaders = headersToRecord(res.headers as http.OutgoingHttpHeaders);\n\n const responseBody = Buffer.concat(responseChunks).toString(\"utf-8\").slice(0, MAX_BODY);\n const requestBody = requestChunks.length > 0\n ? Buffer.concat(requestChunks).toString(\"utf-8\").slice(0, MAX_BODY)\n : null;\n\n addEvent({\n id, url, method, requestHeaders, requestBody,\n status: res.statusCode ?? null,\n statusText: res.statusMessage ?? null,\n responseHeaders, responseBody,\n responseSize,\n duration: performance.now() - start,\n timestamp: Date.now(),\n error: null,\n source: \"http\",\n });\n });\n });\n\n req.on(\"error\", (err: Error) => {\n const requestBody = requestChunks.length > 0\n ? Buffer.concat(requestChunks).toString(\"utf-8\").slice(0, MAX_BODY)\n : null;\n\n addEvent({\n id, url, method, requestHeaders, requestBody,\n status: null, statusText: null,\n responseHeaders: {}, responseBody: null, responseSize: null,\n duration: performance.now() - start,\n timestamp: Date.now(),\n error: err.message,\n source: \"http\",\n });\n });\n\n return req;\n }\n\n (mod as any).request = interceptRequest;\n\n (mod as any).get = function (this: unknown, ...args: Parameters<typeof http.get>): http.ClientRequest {\n const req = (mod.request as any)(...args);\n req.end();\n return req;\n };\n}\n\nlet installed = false;\n\nexport function installHttpInterceptor() {\n if (installed) return;\n installed = true;\n patchModule(http, \"http:\");\n patchModule(https, \"https:\");\n}\n","const http = require(\"node:http\") as typeof import(\"node:http\");\nimport { addEvent, getEvents, clearEvents } from \"../runtime/event-store\";\nimport { SEE_HOST as HOST, SEE_PORT as PORT } from \"../shared/constants\";\n\nexport function startSeeServer(): Promise<boolean> {\n return new Promise((resolve) => {\n const server = http.createServer((req, res) => {\n res.setHeader(\"Access-Control-Allow-Origin\", \"*\");\n res.setHeader(\"Access-Control-Allow-Methods\", \"GET, POST, OPTIONS\");\n res.setHeader(\"Access-Control-Allow-Headers\", \"Content-Type\");\n\n if (req.method === \"OPTIONS\") {\n res.writeHead(204);\n res.end();\n return;\n }\n\n const url = new URL(req.url || \"/\", `http://${HOST}:${PORT}`);\n\n if (url.pathname === \"/see\" && req.method === \"GET\") {\n const cursorParam = url.searchParams.get(\"cursor\");\n const afterCursor = cursorParam ? parseInt(cursorParam, 10) : 0;\n const result = getEvents(isNaN(afterCursor) ? 0 : afterCursor);\n\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify(result));\n return;\n }\n\n if (url.pathname === \"/ingest\" && req.method === \"POST\") {\n let body = \"\";\n let bodySize = 0;\n const MAX_INGEST = 256 * 1024;\n req.on(\"data\", (chunk: Buffer) => {\n bodySize += chunk.length;\n if (bodySize > MAX_INGEST) { req.destroy(); return; }\n body += chunk;\n });\n req.on(\"end\", () => {\n try {\n const event = JSON.parse(body);\n addEvent(event);\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true }));\n } catch {\n res.writeHead(400, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Invalid JSON\" }));\n }\n });\n return;\n }\n\n if (url.pathname === \"/clear\" && req.method === \"POST\") {\n const newCursor = clearEvents();\n res.writeHead(200, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ ok: true, cursor: newCursor }));\n return;\n }\n\n res.writeHead(404, { \"Content-Type\": \"application/json\" });\n res.end(JSON.stringify({ error: \"Not found. Use GET /see\" }));\n });\n\n server.on(\"error\", (err: NodeJS.ErrnoException) => {\n if (err.code === \"EADDRINUSE\") {\n resolve(false);\n return;\n }\n console.error(\"[n-ext] Server error:\", err);\n resolve(false);\n });\n\n server.listen(PORT, HOST, () => {\n console.log(`[n-ext] DevTools server running at http://${HOST}:${PORT}/see`);\n resolve(true);\n });\n });\n}\n","import { installFetchInterceptor } from \"./fetch-interceptor\";\nimport { installHttpInterceptor } from \"./http-interceptor\";\nimport { setRemoteMode } from \"./event-store\";\nimport { startSeeServer } from \"../server/see-endpoint\";\n\nconst INIT_KEY = Symbol.for(\"__n_ext_init__\");\nconst g = globalThis as unknown as Record<symbol, boolean>;\n\nif (!g[INIT_KEY]) {\n g[INIT_KEY] = true;\n\n // Start server first, then install interceptors\n // (so interceptor's http patches don't affect our own server)\n startSeeServer().then((isServer) => {\n if (!isServer) {\n // Server already running in another process — send events remotely\n setRemoteMode();\n }\n\n installHttpInterceptor();\n installFetchInterceptor();\n console.log(`[n-ext] Interceptors installed (${isServer ? \"server\" : \"client\"} mode)`);\n });\n}\n"],"mappings":"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","names":["g","http","headersToRecord","installed","http"]}
package/package.json ADDED
@@ -0,0 +1,40 @@
1
+ {
2
+ "name": "@chaiops/n-ext",
3
+ "version": "0.0.1-alpha",
4
+ "description": "Next.js Server DevTools — capture and inspect server-side network requests",
5
+ "license": "MIT",
6
+ "author": "Anuj",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/chaiops/n-ext"
10
+ },
11
+ "keywords": [
12
+ "nextjs",
13
+ "devtools",
14
+ "server",
15
+ "fetch",
16
+ "http",
17
+ "interceptor",
18
+ "debug"
19
+ ],
20
+ "bin": {
21
+ "n-ext": "./dist/cli.js"
22
+ },
23
+ "exports": {
24
+ "./runtime/register": "./dist/runtime/register.js"
25
+ },
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "publishConfig": {
30
+ "access": "public"
31
+ },
32
+ "scripts": {
33
+ "build": "tsup",
34
+ "dev": "tsup --watch"
35
+ },
36
+ "devDependencies": {
37
+ "tsup": "^8",
38
+ "typescript": "^5"
39
+ }
40
+ }