@nyirusu/nact-streamable-http-server 0.0.0-stage → 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,29 @@
1
+ import type { Channel } from '@nyirusu/nasdk/NACT';
2
+ export declare const streamableHTTPError: (code: string) => Error & {
3
+ code: string;
4
+ };
5
+ export declare class StreamableHTTPChannel implements Channel {
6
+ private io;
7
+ private maxBufferBytes;
8
+ private receivers;
9
+ private closers;
10
+ private errors;
11
+ private queue;
12
+ private queuedBytes;
13
+ private ended;
14
+ constructor(io: {
15
+ send(frame: readonly Uint8Array[]): void | Promise<void>;
16
+ close(): void | Promise<void>;
17
+ }, maxBufferBytes: number);
18
+ get closed(): boolean;
19
+ send(frame: readonly Uint8Array[]): void | Promise<void>;
20
+ close(): void | Promise<void>;
21
+ terminate(): void | Promise<void>;
22
+ onReceive(handler: (frame: readonly Uint8Array[]) => void): () => boolean;
23
+ onClose(handler: () => void): () => boolean;
24
+ onError(handler: (reason: unknown) => void): () => boolean;
25
+ receive(frame: readonly Uint8Array[]): void;
26
+ fail(reason: unknown): void;
27
+ private end;
28
+ }
29
+ //# sourceMappingURL=channel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.d.ts","sourceRoot":"","sources":["../channel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;AAElD,eAAO,MAAM,mBAAmB,GAAI,MAAM,MAAM;;CAA6C,CAAA;AAE7F,qBAAa,qBAAsB,YAAW,OAAO;IASjD,OAAO,CAAC,EAAE;IAIV,OAAO,CAAC,cAAc;IAZxB,OAAO,CAAC,SAAS,CAAoD;IACrE,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,MAAM,CAAuC;IACrD,OAAO,CAAC,KAAK,CAAgC;IAC7C,OAAO,CAAC,WAAW,CAAI;IACvB,OAAO,CAAC,KAAK,CAAQ;gBAGX,EAAE,EAAE;QACV,IAAI,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;QACxD,KAAK,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;KAC9B,EACO,cAAc,EAAE,MAAM;IAGhC,IAAI,MAAM,YAAwB;IAElC,IAAI,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE;IAKjC,KAAK;IAQL,SAAS;IAET,SAAS,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,KAAK,IAAI;IAOzD,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI;IAM3B,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI;IAK1C,OAAO,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE;IAepC,IAAI,CAAC,MAAM,EAAE,OAAO;IASpB,OAAO,CAAC,GAAG;CAQZ"}
@@ -0,0 +1,86 @@
1
+ export const streamableHTTPError = (code) => Object.assign(new Error(code), { code });
2
+ export class StreamableHTTPChannel {
3
+ io;
4
+ maxBufferBytes;
5
+ receivers = new Set();
6
+ closers = new Set();
7
+ errors = new Set();
8
+ queue = [];
9
+ queuedBytes = 0;
10
+ ended = false;
11
+ constructor(io, maxBufferBytes) {
12
+ this.io = io;
13
+ this.maxBufferBytes = maxBufferBytes;
14
+ }
15
+ get closed() { return this.ended; }
16
+ send(frame) {
17
+ if (this.ended)
18
+ throw streamableHTTPError('transport-closed');
19
+ return this.io.send(frame);
20
+ }
21
+ close() {
22
+ if (this.ended)
23
+ return;
24
+ this.queue = [];
25
+ this.queuedBytes = 0;
26
+ this.end();
27
+ return this.io.close();
28
+ }
29
+ terminate() { return this.close(); }
30
+ onReceive(handler) {
31
+ this.receivers.add(handler);
32
+ for (const frame of this.queue.splice(0))
33
+ handler(frame);
34
+ this.queuedBytes = 0;
35
+ return () => this.receivers.delete(handler);
36
+ }
37
+ onClose(handler) {
38
+ if (this.ended)
39
+ queueMicrotask(handler);
40
+ else
41
+ this.closers.add(handler);
42
+ return () => this.closers.delete(handler);
43
+ }
44
+ onError(handler) {
45
+ this.errors.add(handler);
46
+ return () => this.errors.delete(handler);
47
+ }
48
+ receive(frame) {
49
+ if (this.ended)
50
+ return;
51
+ if (this.receivers.size) {
52
+ for (const handler of this.receivers)
53
+ handler(frame);
54
+ return;
55
+ }
56
+ const size = frame.reduce((sum, part) => sum + part.byteLength, 0);
57
+ if (this.queuedBytes + size > this.maxBufferBytes) {
58
+ this.fail(streamableHTTPError('receive-buffer-overflow'));
59
+ return;
60
+ }
61
+ this.queue.push(frame);
62
+ this.queuedBytes += size;
63
+ }
64
+ fail(reason) {
65
+ if (this.ended)
66
+ return;
67
+ try {
68
+ for (const handler of this.errors)
69
+ handler(reason);
70
+ }
71
+ finally {
72
+ void Promise.resolve(this.close()).catch(() => { });
73
+ }
74
+ }
75
+ end() {
76
+ if (this.ended)
77
+ return;
78
+ this.ended = true;
79
+ for (const handler of this.closers)
80
+ handler();
81
+ this.receivers.clear();
82
+ this.closers.clear();
83
+ this.errors.clear();
84
+ }
85
+ }
86
+ //# sourceMappingURL=channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel.js","sourceRoot":"","sources":["../channel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { Channel, ServerProvider, ServerHandle } from '@nyirusu/nasdk/NACT';
2
+ export declare const SESSION_HEADER = "x-nact-session";
3
+ export type StreamableHTTPServerOptions = {
4
+ authorize?: (request: Request) => boolean | Promise<boolean>;
5
+ maxSessions?: number;
6
+ maxBodyBytes?: number;
7
+ maxBufferedBytes?: number;
8
+ idleTimeoutMs?: number;
9
+ } & ({
10
+ noServer?: false;
11
+ host?: string;
12
+ port: number;
13
+ path?: string;
14
+ } | {
15
+ noServer: true;
16
+ host?: never;
17
+ port?: never;
18
+ path?: never;
19
+ });
20
+ export interface StreamableHTTPServerTransportSpec {
21
+ type: 'streamable-http';
22
+ provider: StreamableHTTPServerOptions;
23
+ nact?: {
24
+ chunkSize?: number;
25
+ };
26
+ }
27
+ export default class StreamableHTTPCore implements ServerProvider<'streamable-http', StreamableHTTPServerOptions> {
28
+ readonly type = "streamable-http";
29
+ readonly role = "server";
30
+ readonly defaultChunkSize: number;
31
+ private accept?;
32
+ private options?;
33
+ private sessions;
34
+ listen(options: StreamableHTTPServerOptions, accept: (channel: Channel) => void): Promise<ServerHandle>;
35
+ readonly fetch: (request: Request) => Promise<Response>;
36
+ private open;
37
+ }
38
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAIhF,eAAO,MAAM,cAAc,mBAAmB,CAAA;AAE9C,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB,GAAG,CAAC;IAAE,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAC;IAAC,IAAI,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC,CAAA;AAErI,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,iBAAiB,CAAA;IACvB,QAAQ,EAAE,2BAA2B,CAAA;IACrC,IAAI,CAAC,EAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAC9B;AAmBD,MAAM,CAAC,OAAO,OAAO,kBACnB,YAAW,cAAc,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;IACzE,QAAQ,CAAC,IAAI,qBAAoB;IACjC,QAAQ,CAAC,IAAI,YAAW;IACxB,QAAQ,CAAC,gBAAgB,SAAY;IACrC,OAAO,CAAC,MAAM,CAAC,CAA4B;IAC3C,OAAO,CAAC,OAAO,CAAC,CAAc;IAC9B,OAAO,CAAC,QAAQ,CAA6B;IAEvC,MAAM,CAAC,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;IA6B7G,QAAQ,CAAC,KAAK,GAAU,SAAS,OAAO,KAAG,OAAO,CAAC,QAAQ,CAAC,CA+C3D;IAED,OAAO,CAAC,IAAI;CA4Db"}
@@ -0,0 +1,167 @@
1
+ import { makeFrameSplitter, NACT_PREFACE } from '@nyirusu/nact-provider-shared';
2
+ import { StreamableHTTPChannel, streamableHTTPError } from "./channel.js";
3
+ export const SESSION_HEADER = 'x-nact-session';
4
+ // Request → Response protocol core, shared by standalone and attached servers.
5
+ export default class StreamableHTTPCore {
6
+ type = 'streamable-http';
7
+ role = 'server';
8
+ defaultChunkSize = 64 * 1024;
9
+ accept;
10
+ options;
11
+ sessions = new Map();
12
+ async listen(options, accept) {
13
+ if (this.accept)
14
+ throw streamableHTTPError('provider-already-listening');
15
+ const config = {
16
+ path: options.noServer ? undefined : options.path ?? '/nacp',
17
+ authorize: options.authorize,
18
+ maxSessions: options.maxSessions ?? 1024,
19
+ maxBodyBytes: options.maxBodyBytes ?? 4 * 1024 * 1024,
20
+ maxBufferedBytes: options.maxBufferedBytes ?? 4 * 1024 * 1024,
21
+ idleTimeoutMs: options.idleTimeoutMs ?? 120_000,
22
+ };
23
+ for (const key of ['maxSessions', 'maxBodyBytes', 'maxBufferedBytes', 'idleTimeoutMs']) {
24
+ const minimum = key === 'idleTimeoutMs' ? 0 : key === 'maxBufferedBytes' ? 5 : 1;
25
+ if (!Number.isSafeInteger(config[key]) || config[key] < minimum)
26
+ throw streamableHTTPError(`invalid-${key}`);
27
+ }
28
+ this.options = config;
29
+ this.accept = accept;
30
+ let closed = false;
31
+ return {
32
+ close: async () => {
33
+ if (closed)
34
+ return;
35
+ closed = true;
36
+ this.accept = undefined;
37
+ this.options = undefined;
38
+ for (const session of this.sessions.values())
39
+ await session.channel.close();
40
+ },
41
+ };
42
+ }
43
+ fetch = async (request) => {
44
+ const options = this.options;
45
+ if (!this.accept || !options)
46
+ return new Response(null, { status: 503 });
47
+ if (options.path && new URL(request.url).pathname !== options.path)
48
+ return new Response(null, { status: 404 });
49
+ if (!['GET', 'POST'].includes(request.method))
50
+ return new Response(null, { status: 405, headers: { Allow: 'GET, POST' } });
51
+ if (options.authorize && !await options.authorize(request))
52
+ return new Response(null, { status: 403 });
53
+ if (!this.accept)
54
+ return new Response(null, { status: 503 });
55
+ if (request.signal.aborted)
56
+ return new Response(null, { status: 400 });
57
+ if (request.method === 'GET')
58
+ return this.open(request, options);
59
+ const session = this.sessions.get(request.headers.get(SESSION_HEADER) ?? '');
60
+ if (!session)
61
+ return new Response(null, { status: 404 });
62
+ if (request.headers.get('content-type')?.split(';')[0].trim() !== 'application/octet-stream')
63
+ return new Response(null, { status: 415 });
64
+ if (session.writing)
65
+ return new Response(null, { status: 409 });
66
+ session.writing = true;
67
+ const reader = request.body?.getReader();
68
+ const abort = () => session.channel.fail(streamableHTTPError('upload-aborted'));
69
+ request.signal.addEventListener('abort', abort, { once: true });
70
+ let total = 0;
71
+ try {
72
+ while (reader) {
73
+ const { value, done } = await reader.read();
74
+ if (done)
75
+ break;
76
+ total += value.byteLength;
77
+ if (total > options.maxBodyBytes) {
78
+ await reader.cancel();
79
+ session.channel.fail(streamableHTTPError('body-too-large'));
80
+ return new Response(null, { status: 413 });
81
+ }
82
+ // Drain finite POST bodies after session close. Cancelling a host-owned
83
+ // Request stream can race its pending end event (Next/Undici and H3).
84
+ if (!session.channel.closed)
85
+ session.push(value);
86
+ }
87
+ return new Response(null, { status: 204 });
88
+ }
89
+ catch (reason) {
90
+ session.channel.fail(reason);
91
+ return new Response(null, { status: 400 });
92
+ }
93
+ finally {
94
+ request.signal.removeEventListener('abort', abort);
95
+ reader?.releaseLock();
96
+ session.writing = false;
97
+ session.touch();
98
+ }
99
+ };
100
+ open(request, options) {
101
+ if (this.sessions.size >= options.maxSessions)
102
+ return new Response(null, { status: 503 });
103
+ const token = crypto.randomUUID();
104
+ let controller;
105
+ let timer;
106
+ let ended = false;
107
+ const cleanup = () => {
108
+ if (ended)
109
+ return;
110
+ ended = true;
111
+ clearTimeout(timer);
112
+ request.signal.removeEventListener('abort', abort);
113
+ this.sessions.delete(token);
114
+ try {
115
+ controller.close();
116
+ }
117
+ catch { /* response already cancelled */ }
118
+ };
119
+ const touch = () => {
120
+ clearTimeout(timer);
121
+ if (options.idleTimeoutMs && !ended)
122
+ timer = setTimeout(abort, options.idleTimeoutMs);
123
+ };
124
+ const channel = new StreamableHTTPChannel({
125
+ send: chunks => {
126
+ const size = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
127
+ if (size > (controller.desiredSize ?? 0)) {
128
+ const reason = streamableHTTPError('send-buffer-overflow');
129
+ channel.fail(reason);
130
+ throw reason;
131
+ }
132
+ for (const chunk of chunks)
133
+ controller.enqueue(chunk.slice());
134
+ touch();
135
+ },
136
+ close: cleanup,
137
+ }, options.maxBufferedBytes);
138
+ const abort = () => { void channel.close(); };
139
+ const body = new ReadableStream({
140
+ start: value => {
141
+ controller = value;
142
+ controller.enqueue(new Uint8Array(NACT_PREFACE));
143
+ },
144
+ cancel: () => { void channel.close(); },
145
+ }, { highWaterMark: options.maxBufferedBytes, size: bytes => bytes.byteLength });
146
+ const push = makeFrameSplitter(frame => channel.receive(frame), reason => channel.fail(reason));
147
+ this.sessions.set(token, { channel, push, writing: false, touch });
148
+ request.signal.addEventListener('abort', abort, { once: true });
149
+ touch();
150
+ try {
151
+ this.accept(channel);
152
+ }
153
+ catch (reason) {
154
+ channel.fail(reason);
155
+ return new Response(null, { status: 500 });
156
+ }
157
+ return new Response(body, {
158
+ headers: {
159
+ 'Content-Type': 'application/octet-stream',
160
+ 'Cache-Control': 'no-store, no-transform',
161
+ 'X-Accel-Buffering': 'no',
162
+ [SESSION_HEADER]: token,
163
+ },
164
+ });
165
+ }
166
+ }
167
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { type IncomingMessage, type ServerResponse } from 'node:http';
2
+ import type { Channel, ServerHandle } from '@nyirusu/nasdk/NACT';
3
+ import StreamableHTTPCore from './handler.ts';
4
+ import type { StreamableHTTPServerTransportSpec, StreamableHTTPServerOptions } from './handler.ts';
5
+ export type { StreamableHTTPServerTransportSpec, StreamableHTTPServerOptions };
6
+ export declare function toNodeHandler(fetcher: (request: Request) => Response | Promise<Response>): (request: IncomingMessage, response: ServerResponse) => Promise<void>;
7
+ export default class StreamableHTTPServerProvider extends StreamableHTTPCore {
8
+ listen(options: StreamableHTTPServerOptions, accept: (channel: Channel) => void): Promise<ServerHandle>;
9
+ }
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,eAAe,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAA;AAEnF,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,kBAAkB,MAAM,cAAc,CAAA;AAC7C,OAAO,KAAK,EAAE,iCAAiC,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAA;AAElG,YAAY,EAAE,iCAAiC,EAAE,2BAA2B,EAAE,CAAA;AAE9E,wBAAgB,aAAa,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,IACzE,SAAS,eAAe,EAAE,UAAU,cAAc,KAAG,OAAO,CAAC,IAAI,CAAC,CA0CjF;AAED,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,kBAAkB;IACpE,MAAM,CAAC,OAAO,EAAE,2BAA2B,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC;CA4B9G"}
package/dist/index.js ADDED
@@ -0,0 +1,90 @@
1
+ import { createServer } from 'node:http';
2
+ import { Readable } from 'node:stream';
3
+ import StreamableHTTPCore from "./handler.js";
4
+ export function toNodeHandler(fetcher) {
5
+ return async (request, response) => {
6
+ const controller = new AbortController();
7
+ const abort = () => controller.abort();
8
+ request.once('aborted', abort);
9
+ if (request.method === 'GET')
10
+ response.once('close', abort);
11
+ try {
12
+ const headers = new Headers();
13
+ for (const [key, value] of Object.entries(request.headers))
14
+ if (value !== undefined)
15
+ headers.set(key, Array.isArray(value) ? value.join(', ') : value);
16
+ const init = { method: request.method, headers, signal: controller.signal };
17
+ if (request.method !== 'GET' && request.method !== 'HEAD') {
18
+ init.body = Readable.toWeb(request);
19
+ init.duplex = 'half';
20
+ }
21
+ const result = await fetcher(new Request(new URL(request.url ?? '/', 'http://' + (request.headers.host ?? 'localhost')), init));
22
+ result.headers.forEach((value, key) => response.setHeader(key, value));
23
+ response.writeHead(result.status);
24
+ response.flushHeaders();
25
+ if (!result.body) {
26
+ response.end();
27
+ return;
28
+ }
29
+ const reader = result.body.getReader();
30
+ const cancel = () => { void reader.cancel().catch(() => { }); };
31
+ response.once('close', cancel);
32
+ try {
33
+ while (!response.destroyed) {
34
+ const { value, done } = await reader.read();
35
+ if (done)
36
+ break;
37
+ await new Promise((resolve, reject) => response.write(value, error => error ? reject(error) : resolve()));
38
+ }
39
+ }
40
+ finally {
41
+ response.off('close', cancel);
42
+ await reader.cancel().catch(() => { });
43
+ reader.releaseLock();
44
+ }
45
+ response.end();
46
+ }
47
+ catch (reason) {
48
+ if (!response.headersSent)
49
+ response.writeHead(500).end();
50
+ else
51
+ response.destroy(reason instanceof Error ? reason : undefined);
52
+ }
53
+ finally {
54
+ request.off('aborted', abort);
55
+ if (request.method === 'GET')
56
+ response.off('close', abort);
57
+ }
58
+ };
59
+ }
60
+ export default class StreamableHTTPServerProvider extends StreamableHTTPCore {
61
+ async listen(options, accept) {
62
+ if (!options.noServer && (!Number.isInteger(options.port) || options.port < 0 || options.port > 65535))
63
+ throw Object.assign(new Error('port is required'), { code: 'invalid-port' });
64
+ const sessions = await super.listen(options, accept);
65
+ if (options.noServer)
66
+ return sessions;
67
+ const handler = toNodeHandler(this.fetch);
68
+ const server = createServer((request, response) => { void handler(request, response); });
69
+ try {
70
+ await new Promise((resolve, reject) => {
71
+ server.once('error', reject);
72
+ server.listen(options.port, options.host, () => { server.off('error', reject); resolve(); });
73
+ });
74
+ }
75
+ catch (reason) {
76
+ await sessions.close();
77
+ throw reason;
78
+ }
79
+ let closing;
80
+ return {
81
+ close: () => closing ??= (async () => {
82
+ await sessions.close();
83
+ const closed = new Promise((resolve, reject) => server.close(error => error ? reject(error) : resolve()));
84
+ server.closeAllConnections();
85
+ await closed;
86
+ })(),
87
+ };
88
+ }
89
+ }
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA6C,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,kBAAkB,MAAM,cAAc,CAAA;AAK7C,MAAM,UAAU,aAAa,CAAC,OAA2D;IACvF,OAAO,KAAK,EAAE,OAAwB,EAAE,QAAwB,EAAiB,EAAE;QACjF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAA;QACxC,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAA;QACtC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;QAC9B,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;YAAE,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC3D,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;YAC7B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;gBACxD,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;YAC5F,MAAM,IAAI,GAAsC,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAA;YAC9G,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBAC1D,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,CAA0C,CAAA;gBAC5E,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;YACtB,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,IAAI,GAAG,EAAE,SAAS,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAA;YAC/H,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;YACtE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;YACjC,QAAQ,CAAC,YAAY,EAAE,CAAA;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBAAC,OAAM;YAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAA;YACtC,MAAM,MAAM,GAAG,GAAG,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA,CAAC,CAAC,CAAA;YAC7D,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC9B,IAAI,CAAC;gBACH,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC3B,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;oBAC3C,IAAI,IAAI;wBAAE,MAAK;oBACf,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBACjH,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC7B,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;gBACrC,MAAM,CAAC,WAAW,EAAE,CAAA;YACtB,CAAC;YACD,QAAQ,CAAC,GAAG,EAAE,CAAA;QAChB,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,WAAW;gBAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAA;;gBACnD,QAAQ,CAAC,OAAO,CAAC,MAAM,YAAY,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAA;QACrE,CAAC;gBAAS,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAA;YAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK;gBAAE,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC5D,CAAC;IACH,CAAC,CAAA;AACH,CAAC;AAED,MAAM,CAAC,OAAO,OAAO,4BAA6B,SAAQ,kBAAkB;IAC1E,KAAK,CAAC,MAAM,CAAC,OAAoC,EAAE,MAAkC;QACnF,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,GAAG,KAAK,CAAC;YACpG,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,kBAAkB,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC,CAAA;QAC9E,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACpD,IAAI,OAAO,CAAC,QAAQ;YAAE,OAAO,QAAQ,CAAA;QACrC,MAAM,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QACvF,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;gBAC5B,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAA,CAAC,CAAC,CAAC,CAAA;YAC7F,CAAC,CAAC,CAAA;QACJ,CAAC;QAAC,OAAO,MAAM,EAAE,CAAC;YAChB,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;YACtB,MAAM,MAAM,CAAA;QACd,CAAC;QAED,IAAI,OAAkC,CAAA;QACtC,OAAO;YACL,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,KAAK,CAAC,KAAK,IAAI,EAAE;gBACnC,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAA;gBACtB,MAAM,MAAM,GAAG,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;gBAC/G,MAAM,CAAC,mBAAmB,EAAE,CAAA;gBAC5B,MAAM,MAAM,CAAA;YACd,CAAC,CAAC,EAAE;SACL,CAAA;IACH,CAAC;CAEF"}
package/package.json CHANGED
@@ -1,6 +1,16 @@
1
1
  {
2
2
  "name": "@nyirusu/nact-streamable-http-server",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.4",
4
+ "type": "module",
5
+ "files": ["dist"],
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": { ".": { "types": "./dist/index.d.ts", "import": "./dist/index.js" } },
9
+ "scripts": { "build": "tsc -p tsconfig.build.json", "typecheck": "tsc -p tsconfig.json --noEmit", "test": "npm run test:simple", "test:simple": "node --import tsx --test test/simple.test.mjs", "test:full": "node --import tsx --test test/full.test.mjs", "test:edge": "node --import tsx --test test/edge.test.mjs" },
10
+ "dependencies": { "@nyirusu/nact-provider-shared": "1.0.4" },
11
+ "peerDependencies": { "@nyirusu/nasdk": ">=1.0.4" },
12
+ "peerDependenciesMeta": { "@nyirusu/nasdk": { "optional": true } },
13
+ "license": "MIT",
14
+ "publishConfig": { "access": "public" },
15
+ "repository": { "type": "git", "url": "git+https://github.com/ChenYFan/NASDK.git", "directory": "packages/nact-streamable-http-server" }
16
+ }
package/README.md DELETED
@@ -1,3 +0,0 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.