mates-fullstack 1.0.0-beta.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.
- package/README.md +311 -0
- package/dist/arctic-auth.d.ts +101 -0
- package/dist/arctic-auth.d.ts.map +1 -0
- package/dist/arctic-auth.js +538 -0
- package/dist/arctic-auth.js.map +1 -0
- package/dist/asset-manifest.d.ts +14 -0
- package/dist/asset-manifest.d.ts.map +1 -0
- package/dist/asset-manifest.js +102 -0
- package/dist/asset-manifest.js.map +1 -0
- package/dist/browser.d.ts +18 -0
- package/dist/browser.d.ts.map +1 -0
- package/dist/browser.js +25 -0
- package/dist/browser.js.map +1 -0
- package/dist/build-esbuild.d.ts +29 -0
- package/dist/build-esbuild.d.ts.map +1 -0
- package/dist/build-esbuild.js +699 -0
- package/dist/build-esbuild.js.map +1 -0
- package/dist/build-prod.d.ts +126 -0
- package/dist/build-prod.d.ts.map +1 -0
- package/dist/build-prod.js +1014 -0
- package/dist/build-prod.js.map +1 -0
- package/dist/cli-new.d.ts +14 -0
- package/dist/cli-new.d.ts.map +1 -0
- package/dist/cli-new.js +637 -0
- package/dist/cli-new.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +130 -0
- package/dist/client.js.map +1 -0
- package/dist/cors.d.ts +16 -0
- package/dist/cors.d.ts.map +1 -0
- package/dist/cors.js +60 -0
- package/dist/cors.js.map +1 -0
- package/dist/ctx.d.ts +78 -0
- package/dist/ctx.d.ts.map +1 -0
- package/dist/ctx.js +280 -0
- package/dist/ctx.js.map +1 -0
- package/dist/dev-watcher.d.ts +23 -0
- package/dist/dev-watcher.d.ts.map +1 -0
- package/dist/dev-watcher.js +136 -0
- package/dist/dev-watcher.js.map +1 -0
- package/dist/docs-generator.d.ts +69 -0
- package/dist/docs-generator.d.ts.map +1 -0
- package/dist/docs-generator.js +557 -0
- package/dist/docs-generator.js.map +1 -0
- package/dist/docs-page.d.ts +20 -0
- package/dist/docs-page.d.ts.map +1 -0
- package/dist/docs-page.js +1152 -0
- package/dist/docs-page.js.map +1 -0
- package/dist/download.d.ts +78 -0
- package/dist/download.d.ts.map +1 -0
- package/dist/download.js +202 -0
- package/dist/download.js.map +1 -0
- package/dist/env-loader.d.ts +76 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +213 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/errors.d.ts +146 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +386 -0
- package/dist/errors.js.map +1 -0
- package/dist/head.d.ts +31 -0
- package/dist/head.d.ts.map +1 -0
- package/dist/head.js +245 -0
- package/dist/head.js.map +1 -0
- package/dist/index.d.ts +30 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/internal-prefixes.d.ts +16 -0
- package/dist/internal-prefixes.d.ts.map +1 -0
- package/dist/internal-prefixes.js +16 -0
- package/dist/internal-prefixes.js.map +1 -0
- package/dist/internal.d.ts +25 -0
- package/dist/internal.d.ts.map +1 -0
- package/dist/internal.js +25 -0
- package/dist/internal.js.map +1 -0
- package/dist/jwt.d.ts +166 -0
- package/dist/jwt.d.ts.map +1 -0
- package/dist/jwt.js +261 -0
- package/dist/jwt.js.map +1 -0
- package/dist/log.d.ts +44 -0
- package/dist/log.d.ts.map +1 -0
- package/dist/log.js +66 -0
- package/dist/log.js.map +1 -0
- package/dist/logger.d.ts +76 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +138 -0
- package/dist/logger.js.map +1 -0
- package/dist/main-runner.d.ts +59 -0
- package/dist/main-runner.d.ts.map +1 -0
- package/dist/main-runner.js +157 -0
- package/dist/main-runner.js.map +1 -0
- package/dist/mates-auth.d.ts +82 -0
- package/dist/mates-auth.d.ts.map +1 -0
- package/dist/mates-auth.js +323 -0
- package/dist/mates-auth.js.map +1 -0
- package/dist/middleware.d.ts +30 -0
- package/dist/middleware.d.ts.map +1 -0
- package/dist/middleware.js +67 -0
- package/dist/middleware.js.map +1 -0
- package/dist/project-resolver.d.ts +102 -0
- package/dist/project-resolver.d.ts.map +1 -0
- package/dist/project-resolver.js +271 -0
- package/dist/project-resolver.js.map +1 -0
- package/dist/rate-limit.d.ts +37 -0
- package/dist/rate-limit.d.ts.map +1 -0
- package/dist/rate-limit.js +109 -0
- package/dist/rate-limit.js.map +1 -0
- package/dist/redirect.d.ts +84 -0
- package/dist/redirect.d.ts.map +1 -0
- package/dist/redirect.js +105 -0
- package/dist/redirect.js.map +1 -0
- package/dist/renderer.d.ts +91 -0
- package/dist/renderer.d.ts.map +1 -0
- package/dist/renderer.js +630 -0
- package/dist/renderer.js.map +1 -0
- package/dist/request-logger.d.ts +12 -0
- package/dist/request-logger.d.ts.map +1 -0
- package/dist/request-logger.js +55 -0
- package/dist/request-logger.js.map +1 -0
- package/dist/rest.d.ts +25 -0
- package/dist/rest.d.ts.map +1 -0
- package/dist/rest.js +93 -0
- package/dist/rest.js.map +1 -0
- package/dist/router.d.ts +71 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +222 -0
- package/dist/router.js.map +1 -0
- package/dist/rpc-registry.d.ts +84 -0
- package/dist/rpc-registry.d.ts.map +1 -0
- package/dist/rpc-registry.js +271 -0
- package/dist/rpc-registry.js.map +1 -0
- package/dist/rpc-runner.d.ts +82 -0
- package/dist/rpc-runner.d.ts.map +1 -0
- package/dist/rpc-runner.js +564 -0
- package/dist/rpc-runner.js.map +1 -0
- package/dist/sanitize.d.ts +61 -0
- package/dist/sanitize.d.ts.map +1 -0
- package/dist/sanitize.js +193 -0
- package/dist/sanitize.js.map +1 -0
- package/dist/security-headers.d.ts +114 -0
- package/dist/security-headers.d.ts.map +1 -0
- package/dist/security-headers.js +121 -0
- package/dist/security-headers.js.map +1 -0
- package/dist/server-fn.d.ts +323 -0
- package/dist/server-fn.d.ts.map +1 -0
- package/dist/server-fn.js +373 -0
- package/dist/server-fn.js.map +1 -0
- package/dist/server-public.d.ts +13 -0
- package/dist/server-public.d.ts.map +1 -0
- package/dist/server-public.js +12 -0
- package/dist/server-public.js.map +1 -0
- package/dist/server-timeout.d.ts +38 -0
- package/dist/server-timeout.d.ts.map +1 -0
- package/dist/server-timeout.js +46 -0
- package/dist/server-timeout.js.map +1 -0
- package/dist/server.d.ts +100 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1218 -0
- package/dist/server.js.map +1 -0
- package/dist/socket-router.d.ts +153 -0
- package/dist/socket-router.d.ts.map +1 -0
- package/dist/socket-router.js +612 -0
- package/dist/socket-router.js.map +1 -0
- package/dist/sso.d.ts +90 -0
- package/dist/sso.d.ts.map +1 -0
- package/dist/sso.js +261 -0
- package/dist/sso.js.map +1 -0
- package/dist/ssr-context.d.ts +49 -0
- package/dist/ssr-context.d.ts.map +1 -0
- package/dist/ssr-context.js +85 -0
- package/dist/ssr-context.js.map +1 -0
- package/dist/ssr-globals.d.ts +32 -0
- package/dist/ssr-globals.d.ts.map +1 -0
- package/dist/ssr-globals.js +1010 -0
- package/dist/ssr-globals.js.map +1 -0
- package/dist/ssr-template.d.ts +73 -0
- package/dist/ssr-template.d.ts.map +1 -0
- package/dist/ssr-template.js +507 -0
- package/dist/ssr-template.js.map +1 -0
- package/dist/stack-mapper.d.ts +25 -0
- package/dist/stack-mapper.d.ts.map +1 -0
- package/dist/stack-mapper.js +139 -0
- package/dist/stack-mapper.js.map +1 -0
- package/dist/stream.d.ts +89 -0
- package/dist/stream.d.ts.map +1 -0
- package/dist/stream.js +299 -0
- package/dist/stream.js.map +1 -0
- package/dist/upload.d.ts +69 -0
- package/dist/upload.d.ts.map +1 -0
- package/dist/upload.js +110 -0
- package/dist/upload.js.map +1 -0
- package/dist/validate.d.ts +58 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +89 -0
- package/dist/validate.js.map +1 -0
- package/dist/verify-package.d.ts +3 -0
- package/dist/verify-package.d.ts.map +1 -0
- package/dist/verify-package.js +128 -0
- package/dist/verify-package.js.map +1 -0
- package/package.json +79 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ssr-template.js","sourceRoot":"","sources":["../src/ssr-template.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export interface ParsedStackFrame {
|
|
2
|
+
raw: string;
|
|
3
|
+
fnName: string | null;
|
|
4
|
+
file: string;
|
|
5
|
+
line: number;
|
|
6
|
+
column: number;
|
|
7
|
+
}
|
|
8
|
+
export interface MappedStackFrame extends ParsedStackFrame {
|
|
9
|
+
mappedFile: string | null;
|
|
10
|
+
mappedLine: number | null;
|
|
11
|
+
mappedColumn: number | null;
|
|
12
|
+
mappedName: string | null;
|
|
13
|
+
}
|
|
14
|
+
export type SourceLoader = (url: string) => Promise<string | null>;
|
|
15
|
+
export declare function parseStackFrames(stack: string): ParsedStackFrame[];
|
|
16
|
+
export declare function extractInlineSourceMap(code: string): unknown | null;
|
|
17
|
+
export declare function mapStackTrace(stack: string, loadSource?: SourceLoader): Promise<MappedStackFrame[]>;
|
|
18
|
+
export declare function formatMappedStack(frames: MappedStackFrame[]): string;
|
|
19
|
+
export declare function renderMappedStack(container: {
|
|
20
|
+
textContent: string | null;
|
|
21
|
+
}, error: {
|
|
22
|
+
stack?: string;
|
|
23
|
+
message?: string;
|
|
24
|
+
} | Error, loadSource?: SourceLoader): Promise<void>;
|
|
25
|
+
//# sourceMappingURL=stack-mapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-mapper.d.ts","sourceRoot":"","sources":["../src/stack-mapper.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;AAKnE,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,EAAE,CA+BlE;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CASnE;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,GAAE,YAAkC,GAC7C,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAyB7B;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAYpE;AAED,wBAAsB,iBAAiB,CACrC,SAAS,EAAE;IAAE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,EACzC,KAAK,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,KAAK,EACnD,UAAU,CAAC,EAAE,YAAY,GACxB,OAAO,CAAC,IAAI,CAAC,CAIf"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { TraceMap, originalPositionFor, } from "@jridgewell/trace-mapping";
|
|
2
|
+
const INLINE_SOURCE_MAP_RE = /\/\/# sourceMappingURL=data:application\/json(?:;charset=[^;,]+)?;base64,([A-Za-z0-9+/=]+)/;
|
|
3
|
+
export function parseStackFrames(stack) {
|
|
4
|
+
const frames = [];
|
|
5
|
+
for (const raw of stack.split(/\r?\n/)) {
|
|
6
|
+
const trimmed = raw.trim();
|
|
7
|
+
if (!trimmed.startsWith("at "))
|
|
8
|
+
continue;
|
|
9
|
+
const withFn = trimmed.match(/^at\s+(.+?)\s+\((.+):(\d+):(\d+)\)$/);
|
|
10
|
+
const withoutFn = trimmed.match(/^at\s+(.+):(\d+):(\d+)$/);
|
|
11
|
+
if (withFn) {
|
|
12
|
+
frames.push({
|
|
13
|
+
raw,
|
|
14
|
+
fnName: withFn[1],
|
|
15
|
+
file: withFn[2],
|
|
16
|
+
line: Number(withFn[3]),
|
|
17
|
+
column: Number(withFn[4]),
|
|
18
|
+
});
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (withoutFn) {
|
|
22
|
+
frames.push({
|
|
23
|
+
raw,
|
|
24
|
+
fnName: null,
|
|
25
|
+
file: withoutFn[1],
|
|
26
|
+
line: Number(withoutFn[2]),
|
|
27
|
+
column: Number(withoutFn[3]),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return frames;
|
|
32
|
+
}
|
|
33
|
+
export function extractInlineSourceMap(code) {
|
|
34
|
+
const match = code.match(INLINE_SOURCE_MAP_RE);
|
|
35
|
+
if (!match)
|
|
36
|
+
return null;
|
|
37
|
+
try {
|
|
38
|
+
return JSON.parse(decodeBase64(match[1]));
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
export async function mapStackTrace(stack, loadSource = defaultSourceLoader) {
|
|
45
|
+
const frames = parseStackFrames(stack);
|
|
46
|
+
const mapCache = new Map();
|
|
47
|
+
const mapped = [];
|
|
48
|
+
for (const frame of frames) {
|
|
49
|
+
let traceMap = mapCache.get(frame.file);
|
|
50
|
+
if (traceMap === undefined) {
|
|
51
|
+
traceMap = await loadTraceMap(frame.file, loadSource);
|
|
52
|
+
mapCache.set(frame.file, traceMap);
|
|
53
|
+
}
|
|
54
|
+
if (!traceMap) {
|
|
55
|
+
mapped.push(toUnmappedFrame(frame));
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const original = originalPositionFor(traceMap, {
|
|
59
|
+
line: frame.line,
|
|
60
|
+
column: Math.max(0, frame.column - 1),
|
|
61
|
+
});
|
|
62
|
+
mapped.push(toMappedFrame(frame, original));
|
|
63
|
+
}
|
|
64
|
+
return mapped;
|
|
65
|
+
}
|
|
66
|
+
export function formatMappedStack(frames) {
|
|
67
|
+
return frames
|
|
68
|
+
.map((frame) => {
|
|
69
|
+
const file = frame.mappedFile ?? frame.file;
|
|
70
|
+
const line = frame.mappedLine ?? frame.line;
|
|
71
|
+
const column = frame.mappedColumn ?? frame.column;
|
|
72
|
+
const name = frame.mappedName ?? frame.fnName;
|
|
73
|
+
return name
|
|
74
|
+
? ` at ${name} (${file}:${line}:${column})`
|
|
75
|
+
: ` at ${file}:${line}:${column}`;
|
|
76
|
+
})
|
|
77
|
+
.join("\n");
|
|
78
|
+
}
|
|
79
|
+
export async function renderMappedStack(container, error, loadSource) {
|
|
80
|
+
const stack = error.stack ?? error.message ?? String(error);
|
|
81
|
+
const frames = await mapStackTrace(stack, loadSource);
|
|
82
|
+
container.textContent = frames.length > 0 ? formatMappedStack(frames) : stack;
|
|
83
|
+
}
|
|
84
|
+
async function loadTraceMap(url, loadSource) {
|
|
85
|
+
const code = await loadSource(url);
|
|
86
|
+
if (!code)
|
|
87
|
+
return null;
|
|
88
|
+
const map = extractInlineSourceMap(code);
|
|
89
|
+
if (!map)
|
|
90
|
+
return null;
|
|
91
|
+
try {
|
|
92
|
+
return new TraceMap(map);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
return null;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function toMappedFrame(frame, original) {
|
|
99
|
+
if (!original.source || original.line == null || original.column == null) {
|
|
100
|
+
return toUnmappedFrame(frame);
|
|
101
|
+
}
|
|
102
|
+
return {
|
|
103
|
+
...frame,
|
|
104
|
+
mappedFile: original.source,
|
|
105
|
+
mappedLine: original.line,
|
|
106
|
+
mappedColumn: original.column + 1,
|
|
107
|
+
mappedName: original.name ?? frame.fnName,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
function toUnmappedFrame(frame) {
|
|
111
|
+
return {
|
|
112
|
+
...frame,
|
|
113
|
+
mappedFile: null,
|
|
114
|
+
mappedLine: null,
|
|
115
|
+
mappedColumn: null,
|
|
116
|
+
mappedName: null,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
async function defaultSourceLoader(url) {
|
|
120
|
+
if (typeof fetch !== "function")
|
|
121
|
+
return null;
|
|
122
|
+
try {
|
|
123
|
+
const res = await fetch(url);
|
|
124
|
+
if (!res.ok)
|
|
125
|
+
return null;
|
|
126
|
+
return await res.text();
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
function decodeBase64(value) {
|
|
133
|
+
if (typeof atob === "function")
|
|
134
|
+
return atob(value);
|
|
135
|
+
if (typeof Buffer !== "undefined")
|
|
136
|
+
return Buffer.from(value, "base64").toString("utf-8");
|
|
137
|
+
throw new Error("No base64 decoder available");
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=stack-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stack-mapper.js","sourceRoot":"","sources":["../src/stack-mapper.ts"],"names":[],"mappings":"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"}
|
package/dist/stream.d.ts
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mates-fullstack — stream.ts
|
|
3
|
+
*
|
|
4
|
+
* The stream() helper for server functions.
|
|
5
|
+
* Returns a StreamResponse that the RPC runner serializes as SSE.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { stream } from "mates-fullstack/server";
|
|
9
|
+
*
|
|
10
|
+
* export async function generate(payload: { prompt: string }) {
|
|
11
|
+
* return stream(async function*() {
|
|
12
|
+
* for await (const chunk of llm.stream(payload.prompt)) {
|
|
13
|
+
* yield chunk.text; // string chunk
|
|
14
|
+
* }
|
|
15
|
+
* });
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* export async function watchProgress(payload: { jobId: string }) {
|
|
19
|
+
* return stream(async function*() {
|
|
20
|
+
* while (true) {
|
|
21
|
+
* const status = await getStatus(payload.jobId);
|
|
22
|
+
* yield { percent: status.percent, done: status.done }; // object chunk
|
|
23
|
+
* if (status.done) break;
|
|
24
|
+
* await sleep(500);
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* Client receives an async iterable:
|
|
30
|
+
* for await (const chunk of await generate({ prompt })) {
|
|
31
|
+
* text += chunk;
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* Wire format: SSE (text/event-stream)
|
|
35
|
+
* data: hello world\n\n ← string chunk
|
|
36
|
+
* data: {"percent":42}\n\n ← object chunk (JSON)
|
|
37
|
+
* event: error\ndata: {...}\n\n ← terminal error event
|
|
38
|
+
* event: done\ndata: {}\n\n ← stream completed normally
|
|
39
|
+
*/
|
|
40
|
+
/// <reference types="node" />
|
|
41
|
+
import type { ServerResponse } from "node:http";
|
|
42
|
+
/**
|
|
43
|
+
* Returned by stream() and detected by rpc-runner to trigger SSE mode.
|
|
44
|
+
*/
|
|
45
|
+
export declare class StreamResponse {
|
|
46
|
+
readonly generator: () => AsyncGenerator<string | object>;
|
|
47
|
+
constructor(generator: () => AsyncGenerator<string | object>);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Return a streaming response from a server function.
|
|
51
|
+
* The generator is called once per request when the response begins.
|
|
52
|
+
*
|
|
53
|
+
* Yield strings or plain objects. Objects are JSON-serialized per event.
|
|
54
|
+
* Throw inside the generator to send a terminal error event.
|
|
55
|
+
* The generator's finally block always runs, even if the client disconnects.
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* return stream(async function*() {
|
|
59
|
+
* yield "Hello ";
|
|
60
|
+
* yield "world";
|
|
61
|
+
* yield { type: "done", result: 42 };
|
|
62
|
+
* });
|
|
63
|
+
*/
|
|
64
|
+
export declare function stream(generator: () => AsyncGenerator<string | object>): StreamResponse;
|
|
65
|
+
/**
|
|
66
|
+
* Write a StreamResponse to a Node.js ServerResponse as SSE.
|
|
67
|
+
*
|
|
68
|
+
* Sets the correct headers and writes each yielded value as an SSE event.
|
|
69
|
+
* Handles client disconnect via the AbortSignal.
|
|
70
|
+
* Always closes the response when done (normally or via error).
|
|
71
|
+
*/
|
|
72
|
+
export declare function writeStream(streamResponse: StreamResponse, res: ServerResponse, signal: AbortSignal): Promise<void>;
|
|
73
|
+
/**
|
|
74
|
+
* Read an SSE response as an async iterable.
|
|
75
|
+
* Used by the RPC stub on the client side.
|
|
76
|
+
*
|
|
77
|
+
* Yields parsed values:
|
|
78
|
+
* - String data events → string
|
|
79
|
+
* - JSON data events → parsed object
|
|
80
|
+
* - "done" event → stops iteration
|
|
81
|
+
* - "error" event → throws the reconstructed error
|
|
82
|
+
*/
|
|
83
|
+
export declare function readSseStream(response: Response): AsyncGenerator<string | object>;
|
|
84
|
+
/**
|
|
85
|
+
* Returns true if the value is a StreamResponse.
|
|
86
|
+
* Used by rpc-runner to detect stream returns.
|
|
87
|
+
*/
|
|
88
|
+
export declare function isStreamResponse(value: unknown): value is StreamResponse;
|
|
89
|
+
//# sourceMappingURL=stream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAIhD;;GAEG;AACH,qBAAa,cAAc;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;gBAE9C,SAAS,EAAE,MAAM,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC;CAG7D;AAID;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,MAAM,CACpB,SAAS,EAAE,MAAM,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,GAC/C,cAAc,CAEhB;AAID;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,cAAc,EAAE,cAAc,EAC9B,GAAG,EAAE,cAAc,EACnB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,IAAI,CAAC,CA6Df;AAID;;;;;;;;;GASG;AACH,wBAAuB,aAAa,CAClC,QAAQ,EAAE,QAAQ,GACjB,cAAc,CAAC,MAAM,GAAG,MAAM,CAAC,CAuDjC;AA6GD;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAExE"}
|
package/dist/stream.js
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mates-fullstack — stream.ts
|
|
3
|
+
*
|
|
4
|
+
* The stream() helper for server functions.
|
|
5
|
+
* Returns a StreamResponse that the RPC runner serializes as SSE.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { stream } from "mates-fullstack/server";
|
|
9
|
+
*
|
|
10
|
+
* export async function generate(payload: { prompt: string }) {
|
|
11
|
+
* return stream(async function*() {
|
|
12
|
+
* for await (const chunk of llm.stream(payload.prompt)) {
|
|
13
|
+
* yield chunk.text; // string chunk
|
|
14
|
+
* }
|
|
15
|
+
* });
|
|
16
|
+
* }
|
|
17
|
+
*
|
|
18
|
+
* export async function watchProgress(payload: { jobId: string }) {
|
|
19
|
+
* return stream(async function*() {
|
|
20
|
+
* while (true) {
|
|
21
|
+
* const status = await getStatus(payload.jobId);
|
|
22
|
+
* yield { percent: status.percent, done: status.done }; // object chunk
|
|
23
|
+
* if (status.done) break;
|
|
24
|
+
* await sleep(500);
|
|
25
|
+
* }
|
|
26
|
+
* });
|
|
27
|
+
* }
|
|
28
|
+
*
|
|
29
|
+
* Client receives an async iterable:
|
|
30
|
+
* for await (const chunk of await generate({ prompt })) {
|
|
31
|
+
* text += chunk;
|
|
32
|
+
* }
|
|
33
|
+
*
|
|
34
|
+
* Wire format: SSE (text/event-stream)
|
|
35
|
+
* data: hello world\n\n ← string chunk
|
|
36
|
+
* data: {"percent":42}\n\n ← object chunk (JSON)
|
|
37
|
+
* event: error\ndata: {...}\n\n ← terminal error event
|
|
38
|
+
* event: done\ndata: {}\n\n ← stream completed normally
|
|
39
|
+
*/
|
|
40
|
+
// ─── StreamResponse class ─────────────────────────────────────────────────────
|
|
41
|
+
/**
|
|
42
|
+
* Returned by stream() and detected by rpc-runner to trigger SSE mode.
|
|
43
|
+
*/
|
|
44
|
+
export class StreamResponse {
|
|
45
|
+
generator;
|
|
46
|
+
constructor(generator) {
|
|
47
|
+
this.generator = generator;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
// ─── stream() helper ──────────────────────────────────────────────────────────
|
|
51
|
+
/**
|
|
52
|
+
* Return a streaming response from a server function.
|
|
53
|
+
* The generator is called once per request when the response begins.
|
|
54
|
+
*
|
|
55
|
+
* Yield strings or plain objects. Objects are JSON-serialized per event.
|
|
56
|
+
* Throw inside the generator to send a terminal error event.
|
|
57
|
+
* The generator's finally block always runs, even if the client disconnects.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* return stream(async function*() {
|
|
61
|
+
* yield "Hello ";
|
|
62
|
+
* yield "world";
|
|
63
|
+
* yield { type: "done", result: 42 };
|
|
64
|
+
* });
|
|
65
|
+
*/
|
|
66
|
+
export function stream(generator) {
|
|
67
|
+
return new StreamResponse(generator);
|
|
68
|
+
}
|
|
69
|
+
// ─── SSE writer ───────────────────────────────────────────────────────────────
|
|
70
|
+
/**
|
|
71
|
+
* Write a StreamResponse to a Node.js ServerResponse as SSE.
|
|
72
|
+
*
|
|
73
|
+
* Sets the correct headers and writes each yielded value as an SSE event.
|
|
74
|
+
* Handles client disconnect via the AbortSignal.
|
|
75
|
+
* Always closes the response when done (normally or via error).
|
|
76
|
+
*/
|
|
77
|
+
export async function writeStream(streamResponse, res, signal) {
|
|
78
|
+
// Set SSE headers before any data is written
|
|
79
|
+
if (!res.headersSent) {
|
|
80
|
+
res.writeHead(200, {
|
|
81
|
+
"Content-Type": "text/event-stream; charset=utf-8",
|
|
82
|
+
"Cache-Control": "no-cache, no-transform",
|
|
83
|
+
"Connection": "keep-alive",
|
|
84
|
+
// Disable nginx/proxy buffering for SSE
|
|
85
|
+
"X-Accel-Buffering": "no",
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
const gen = streamResponse.generator();
|
|
89
|
+
// Track whether we've already closed
|
|
90
|
+
let closed = false;
|
|
91
|
+
function close() {
|
|
92
|
+
if (closed)
|
|
93
|
+
return;
|
|
94
|
+
closed = true;
|
|
95
|
+
if (!res.writableEnded) {
|
|
96
|
+
res.end();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Handle client disconnect
|
|
100
|
+
signal.addEventListener("abort", () => {
|
|
101
|
+
close();
|
|
102
|
+
}, { once: true });
|
|
103
|
+
try {
|
|
104
|
+
for await (const chunk of gen) {
|
|
105
|
+
// Stop if client disconnected or response ended
|
|
106
|
+
if (signal.aborted || res.writableEnded) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
const data = _serializeChunk(chunk);
|
|
110
|
+
// Write the SSE event — write() returns false if buffer is full (backpressure)
|
|
111
|
+
// For simplicity we don't await drain; SSE clients handle this gracefully
|
|
112
|
+
if (!res.writableEnded) {
|
|
113
|
+
res.write(_formatSseEvent(undefined, data));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// Send terminal done event if client is still connected
|
|
117
|
+
if (!signal.aborted && !res.writableEnded) {
|
|
118
|
+
res.write(_formatSseEvent("done", "{}"));
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
// Generator threw — send terminal error event if still connected
|
|
123
|
+
if (!signal.aborted && !res.writableEnded) {
|
|
124
|
+
const errorData = _serializeStreamError(err);
|
|
125
|
+
res.write(_formatSseEvent("error", errorData));
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
finally {
|
|
129
|
+
// Return from generator (runs generator's finally block)
|
|
130
|
+
await gen.return?.(undefined).catch(() => { });
|
|
131
|
+
close();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
// ─── Client-side SSE reader ───────────────────────────────────────────────────
|
|
135
|
+
/**
|
|
136
|
+
* Read an SSE response as an async iterable.
|
|
137
|
+
* Used by the RPC stub on the client side.
|
|
138
|
+
*
|
|
139
|
+
* Yields parsed values:
|
|
140
|
+
* - String data events → string
|
|
141
|
+
* - JSON data events → parsed object
|
|
142
|
+
* - "done" event → stops iteration
|
|
143
|
+
* - "error" event → throws the reconstructed error
|
|
144
|
+
*/
|
|
145
|
+
export async function* readSseStream(response) {
|
|
146
|
+
const reader = response.body?.getReader();
|
|
147
|
+
if (!reader)
|
|
148
|
+
return;
|
|
149
|
+
const decoder = new TextDecoder();
|
|
150
|
+
let buffer = "";
|
|
151
|
+
try {
|
|
152
|
+
while (true) {
|
|
153
|
+
const { done, value } = await reader.read();
|
|
154
|
+
if (done)
|
|
155
|
+
break;
|
|
156
|
+
buffer += decoder.decode(value, { stream: true });
|
|
157
|
+
// SSE events are separated by double newline
|
|
158
|
+
const events = buffer.split("\n\n");
|
|
159
|
+
// Keep the last incomplete event in the buffer
|
|
160
|
+
buffer = events.pop() ?? "";
|
|
161
|
+
for (const event of events) {
|
|
162
|
+
if (!event.trim())
|
|
163
|
+
continue;
|
|
164
|
+
const parsed = _parseSseEvent(event);
|
|
165
|
+
if (!parsed)
|
|
166
|
+
continue;
|
|
167
|
+
// Terminal done event — stop iteration
|
|
168
|
+
if (parsed.event === "done")
|
|
169
|
+
return;
|
|
170
|
+
// Terminal error event — reconstruct and throw
|
|
171
|
+
if (parsed.event === "error") {
|
|
172
|
+
const { reconstructError, isMatesError } = await import("./errors.js");
|
|
173
|
+
try {
|
|
174
|
+
const errorData = JSON.parse(parsed.data);
|
|
175
|
+
if (isMatesError(errorData)) {
|
|
176
|
+
throw reconstructError(errorData);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (e) {
|
|
180
|
+
if (e instanceof SyntaxError) {
|
|
181
|
+
throw new Error(`Stream error: ${parsed.data}`);
|
|
182
|
+
}
|
|
183
|
+
throw e;
|
|
184
|
+
}
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
// Data event — parse and yield
|
|
188
|
+
if (parsed.data) {
|
|
189
|
+
yield _parseChunk(parsed.data);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
reader.releaseLock();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
// ─── Internal helpers ─────────────────────────────────────────────────────────
|
|
199
|
+
/**
|
|
200
|
+
* Serialize a chunk to a string for SSE data.
|
|
201
|
+
* Objects are JSON-stringified. Strings are used as-is.
|
|
202
|
+
*/
|
|
203
|
+
function _serializeChunk(chunk) {
|
|
204
|
+
if (typeof chunk === "string")
|
|
205
|
+
return chunk;
|
|
206
|
+
try {
|
|
207
|
+
return JSON.stringify(chunk);
|
|
208
|
+
}
|
|
209
|
+
catch {
|
|
210
|
+
// Circular reference or non-serializable — send empty object
|
|
211
|
+
return "{}";
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Format an SSE event.
|
|
216
|
+
* Handles multi-line data by prefixing each line with "data: ".
|
|
217
|
+
*
|
|
218
|
+
* Format:
|
|
219
|
+
* [event: <name>\n]
|
|
220
|
+
* data: <line1>\n
|
|
221
|
+
* [data: <line2>\n]
|
|
222
|
+
* \n
|
|
223
|
+
*/
|
|
224
|
+
function _formatSseEvent(eventName, data) {
|
|
225
|
+
let out = "";
|
|
226
|
+
if (eventName) {
|
|
227
|
+
out += `event: ${eventName}\n`;
|
|
228
|
+
}
|
|
229
|
+
// Handle multi-line data — each line needs its own "data: " prefix
|
|
230
|
+
const lines = data.split("\n");
|
|
231
|
+
for (const line of lines) {
|
|
232
|
+
out += `data: ${line}\n`;
|
|
233
|
+
}
|
|
234
|
+
out += "\n"; // Double newline to end the event
|
|
235
|
+
return out;
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Parse a raw SSE event string into event name and data.
|
|
239
|
+
*/
|
|
240
|
+
function _parseSseEvent(raw) {
|
|
241
|
+
let event;
|
|
242
|
+
const dataLines = [];
|
|
243
|
+
for (const line of raw.split("\n")) {
|
|
244
|
+
if (line.startsWith("event:")) {
|
|
245
|
+
event = line.slice(6).trim();
|
|
246
|
+
}
|
|
247
|
+
else if (line.startsWith("data:")) {
|
|
248
|
+
dataLines.push(line.slice(5).trim());
|
|
249
|
+
}
|
|
250
|
+
// Ignore "id:", "retry:", and comment lines (": ...")
|
|
251
|
+
}
|
|
252
|
+
if (dataLines.length === 0)
|
|
253
|
+
return null;
|
|
254
|
+
return { event, data: dataLines.join("\n") };
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Parse a received SSE data string.
|
|
258
|
+
* Attempts JSON parse first; falls back to raw string.
|
|
259
|
+
*/
|
|
260
|
+
function _parseChunk(data) {
|
|
261
|
+
// Try JSON parse for object chunks
|
|
262
|
+
if (data.startsWith("{") || data.startsWith("[")) {
|
|
263
|
+
try {
|
|
264
|
+
return JSON.parse(data);
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// Not valid JSON — treat as string
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
return data;
|
|
271
|
+
}
|
|
272
|
+
/**
|
|
273
|
+
* Serialize an error thrown inside a stream generator for the SSE error event.
|
|
274
|
+
*/
|
|
275
|
+
function _serializeStreamError(err) {
|
|
276
|
+
// Import serializeError lazily to avoid circular deps at module load time
|
|
277
|
+
try {
|
|
278
|
+
const { serializeError } = require("./errors.js");
|
|
279
|
+
const dev = process.env.NODE_ENV !== "production";
|
|
280
|
+
return JSON.stringify(serializeError(err, dev));
|
|
281
|
+
}
|
|
282
|
+
catch {
|
|
283
|
+
return JSON.stringify({
|
|
284
|
+
__type: "AppError",
|
|
285
|
+
message: "Stream error",
|
|
286
|
+
status: 500,
|
|
287
|
+
code: "STREAM_ERROR",
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
// ─── Type guard ───────────────────────────────────────────────────────────────
|
|
292
|
+
/**
|
|
293
|
+
* Returns true if the value is a StreamResponse.
|
|
294
|
+
* Used by rpc-runner to detect stream returns.
|
|
295
|
+
*/
|
|
296
|
+
export function isStreamResponse(value) {
|
|
297
|
+
return value instanceof StreamResponse;
|
|
298
|
+
}
|
|
299
|
+
//# sourceMappingURL=stream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","sourceRoot":"","sources":["../src/stream.ts"],"names":[],"mappings":"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"}
|