stitchkit 0.44.1 → 0.46.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/browser/http.d.ts.map +1 -1
- package/dist/browser/socket-io.d.ts +16 -0
- package/dist/browser/socket-io.d.ts.map +1 -1
- package/dist/cli.js +3 -4
- package/dist/contract/errors.d.ts +1 -0
- package/dist/contract/errors.d.ts.map +1 -1
- package/dist/contract/index.js +2 -2
- package/dist/{index-yh0p5ddn.js → index-5s8b7z6q.js} +31 -11
- package/dist/{index-mvjyq9h9.js → index-62pqb23z.js} +309 -144
- package/dist/index-c40tkxcd.js +181 -0
- package/dist/{index-r6czv7yt.js → index-pwyedf7b.js} +4 -3
- package/dist/{index-6jypn22c.js → index-r1qp4rve.js} +9 -1
- package/dist/{index-s4qsmgwe.js → index-tss6bk5c.js} +4 -1
- package/dist/{index-36f1xkdb.js → index-w1s873ng.js} +2 -2
- package/dist/index-yxpe3phd.js +63 -0
- package/dist/{index-4fyn9f09.js → index-zwqty9zf.js} +396 -246
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +266 -17
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/secure-fetch.d.ts +23 -3
- package/dist/internal/secure-fetch.d.ts.map +1 -1
- package/dist/internal/typed.d.ts +7 -0
- package/dist/internal/typed.d.ts.map +1 -1
- package/dist/internal/within-dir.d.ts +6 -0
- package/dist/internal/within-dir.d.ts.map +1 -1
- package/dist/logger.d.ts +8 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/node.d.ts +1 -0
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +5 -4
- package/dist/observability/audit.d.ts.map +1 -1
- package/dist/observability/event.d.ts +7 -0
- package/dist/observability/event.d.ts.map +1 -1
- package/dist/observability/index.js +54 -125
- package/dist/observability/sanitize.d.ts +8 -1
- package/dist/observability/sanitize.d.ts.map +1 -1
- package/dist/observability/trace.d.ts +3 -1
- package/dist/observability/trace.d.ts.map +1 -1
- package/dist/react/cache-bridge.d.ts +4 -0
- package/dist/react/cache-bridge.d.ts.map +1 -1
- package/dist/react.js +46 -5
- package/dist/realtime/contract.d.ts +39 -0
- package/dist/realtime/contract.d.ts.map +1 -0
- package/dist/realtime/index.d.ts +3 -0
- package/dist/realtime/index.d.ts.map +1 -0
- package/dist/realtime/rejection.d.ts +10 -0
- package/dist/realtime/rejection.d.ts.map +1 -0
- package/dist/realtime/socket.d.ts +30 -0
- package/dist/realtime/socket.d.ts.map +1 -0
- package/dist/server/cache.d.ts +5 -1
- package/dist/server/cache.d.ts.map +1 -1
- package/dist/server/error-hook.d.ts +1 -0
- package/dist/server/error-hook.d.ts.map +1 -1
- package/dist/server/file.d.ts +6 -0
- package/dist/server/file.d.ts.map +1 -1
- package/dist/server/implement.d.ts.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +110 -11
- package/dist/server/middleware/cors.d.ts.map +1 -1
- package/dist/server/openapi.d.ts.map +1 -1
- package/dist/server/realtime.d.ts +24 -0
- package/dist/server/realtime.d.ts.map +1 -0
- package/dist/server/router.d.ts +0 -8
- package/dist/server/router.d.ts.map +1 -1
- package/dist/server/stream.d.ts.map +1 -1
- package/dist/server/types.d.ts +2 -7
- package/dist/server/types.d.ts.map +1 -1
- package/dist/tools/cli-args.d.ts +11 -3
- package/dist/tools/cli-args.d.ts.map +1 -1
- package/dist/tools/cli.d.ts +5 -0
- package/dist/tools/cli.d.ts.map +1 -1
- package/dist/tools/coerce.d.ts.map +1 -1
- package/dist/tools/json-schema.d.ts.map +1 -1
- package/dist/tools/mcp-handler.d.ts +4 -3
- package/dist/tools/mcp-handler.d.ts.map +1 -1
- package/dist/tools/mcp-prepare.d.ts +95 -0
- package/dist/tools/mcp-prepare.d.ts.map +1 -0
- package/dist/tools/mcp-round.d.ts +4 -0
- package/dist/tools/mcp-round.d.ts.map +1 -1
- package/dist/tools/mcp-stdio.d.ts +2 -1
- package/dist/tools/mcp-stdio.d.ts.map +1 -1
- package/dist/tools/mcp.d.ts +2 -78
- package/dist/tools/mcp.d.ts.map +1 -1
- package/dist/tools/mount-download.d.ts +5 -0
- package/dist/tools/mount-download.d.ts.map +1 -1
- package/dist/tools/native-mcp.d.ts +1 -1
- package/dist/tools/native-mcp.d.ts.map +1 -1
- package/dist/tools/oauth-provider.d.ts +20 -1
- package/dist/tools/oauth-provider.d.ts.map +1 -1
- package/dist/tools/tool-logger.d.ts +1 -1
- package/dist/tools/tool-logger.d.ts.map +1 -1
- package/dist/tools/view-file.d.ts +9 -0
- package/dist/tools/view-file.d.ts.map +1 -1
- package/dist/tools.d.ts +2 -1
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +342 -214
- package/llms-full.txt +175 -44
- package/llms.txt +1 -1
- package/package.json +2 -2
- package/dist/index-frfyw9fa.js +0 -33
- package/dist/index-x3fcszf8.js +0 -8
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
measureSize,
|
|
3
|
+
redact,
|
|
4
|
+
sanitizePayload,
|
|
5
|
+
truncatePreview
|
|
6
|
+
} from "../index-c40tkxcd.js";
|
|
1
7
|
import {
|
|
2
8
|
childSpan,
|
|
3
9
|
createTraceContext,
|
|
@@ -6,7 +12,6 @@ import {
|
|
|
6
12
|
getTraceId,
|
|
7
13
|
getUserId,
|
|
8
14
|
isRecord,
|
|
9
|
-
isUnsafeKey,
|
|
10
15
|
parseTraceparent,
|
|
11
16
|
recordedErrorMessage,
|
|
12
17
|
resolvePropagationContext,
|
|
@@ -17,88 +22,7 @@ import {
|
|
|
17
22
|
setRequestError,
|
|
18
23
|
setRequestUser,
|
|
19
24
|
wrapInRequestContext
|
|
20
|
-
} from "../index-
|
|
21
|
-
|
|
22
|
-
// src/observability/sanitize.ts
|
|
23
|
-
var DEFAULT_SENSITIVE_KEYS = /(password|passwd|pwd|secret|token|apikey|api[-_ ]?key|auth|authorization|bearer|session|cookie|init[-_ ]?data|credential|private[-_ ]?key)/i;
|
|
24
|
-
var DEFAULT_MAX_BYTES = 16000;
|
|
25
|
-
var DEFAULT_MAX_DEPTH = 20;
|
|
26
|
-
var MASK = "[redacted]";
|
|
27
|
-
function redact(value, options = {}) {
|
|
28
|
-
const sensitive = options.sensitiveKeys ?? DEFAULT_SENSITIVE_KEYS;
|
|
29
|
-
const maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
|
|
30
|
-
const ancestors = new Set;
|
|
31
|
-
const walk = (input, depth) => {
|
|
32
|
-
if (depth > maxDepth)
|
|
33
|
-
return "[max depth]";
|
|
34
|
-
if (input === null || input === undefined)
|
|
35
|
-
return null;
|
|
36
|
-
if (typeof input === "string" || typeof input === "number" || typeof input === "boolean") {
|
|
37
|
-
return input;
|
|
38
|
-
}
|
|
39
|
-
if (input instanceof Uint8Array || input instanceof ArrayBuffer) {
|
|
40
|
-
return { _type: "binary", size: input.byteLength };
|
|
41
|
-
}
|
|
42
|
-
if (input instanceof Blob) {
|
|
43
|
-
return { _type: "blob", size: input.size, mime: input.type };
|
|
44
|
-
}
|
|
45
|
-
if (typeof FormData !== "undefined" && input instanceof FormData) {
|
|
46
|
-
return { _type: "formdata", keys: [...input.keys()] };
|
|
47
|
-
}
|
|
48
|
-
if (Array.isArray(input)) {
|
|
49
|
-
if (ancestors.has(input))
|
|
50
|
-
return "[circular]";
|
|
51
|
-
ancestors.add(input);
|
|
52
|
-
const result = input.map((item) => walk(item, depth + 1));
|
|
53
|
-
ancestors.delete(input);
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
if (isRecord(input)) {
|
|
57
|
-
if (ancestors.has(input))
|
|
58
|
-
return "[circular]";
|
|
59
|
-
ancestors.add(input);
|
|
60
|
-
const out = {};
|
|
61
|
-
for (const [key, val] of Object.entries(input)) {
|
|
62
|
-
if (isUnsafeKey(key))
|
|
63
|
-
continue;
|
|
64
|
-
out[key] = sensitive.test(key) ? MASK : walk(val, depth + 1);
|
|
65
|
-
}
|
|
66
|
-
ancestors.delete(input);
|
|
67
|
-
return out;
|
|
68
|
-
}
|
|
69
|
-
return String(input);
|
|
70
|
-
};
|
|
71
|
-
return walk(value, 0);
|
|
72
|
-
}
|
|
73
|
-
function truncatePreview(value, maxBytes = DEFAULT_MAX_BYTES) {
|
|
74
|
-
const json = JSON.stringify(value);
|
|
75
|
-
const bytes = Buffer.byteLength(json, "utf8");
|
|
76
|
-
if (bytes <= maxBytes)
|
|
77
|
-
return value;
|
|
78
|
-
return {
|
|
79
|
-
_truncated: true,
|
|
80
|
-
_originalBytes: bytes,
|
|
81
|
-
preview: `${json.slice(0, maxBytes)}…`
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
function sanitizePayload(value, options = {}) {
|
|
85
|
-
if (value === undefined || value === null)
|
|
86
|
-
return null;
|
|
87
|
-
return truncatePreview(redact(value, options), options.maxBytes ?? DEFAULT_MAX_BYTES);
|
|
88
|
-
}
|
|
89
|
-
function measureSize(value) {
|
|
90
|
-
if (value === undefined || value === null) {
|
|
91
|
-
return { resultSize: null, responseBytes: 0 };
|
|
92
|
-
}
|
|
93
|
-
const responseBytes = Buffer.byteLength(JSON.stringify(value), "utf8");
|
|
94
|
-
if (Array.isArray(value)) {
|
|
95
|
-
return { resultSize: value.length, responseBytes };
|
|
96
|
-
}
|
|
97
|
-
if (isRecord(value) && Array.isArray(value.items) && "nextCursor" in value) {
|
|
98
|
-
return { resultSize: value.items.length, responseBytes };
|
|
99
|
-
}
|
|
100
|
-
return { resultSize: null, responseBytes };
|
|
101
|
-
}
|
|
25
|
+
} from "../index-5s8b7z6q.js";
|
|
102
26
|
|
|
103
27
|
// src/observability/audit.ts
|
|
104
28
|
function toolErrorMessage(result) {
|
|
@@ -195,52 +119,57 @@ function createObservability(config) {
|
|
|
195
119
|
userAgent: context.userAgent,
|
|
196
120
|
startedAt: new Date(Date.now() - durationMs)
|
|
197
121
|
});
|
|
198
|
-
})();
|
|
122
|
+
})().catch(() => {});
|
|
199
123
|
}
|
|
200
124
|
} : undefined;
|
|
201
125
|
const toolCall = config.tools ? {
|
|
202
126
|
afterToolCall: ({ toolName, args, result, durationMs, context, endpoint, error }) => {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
127
|
+
try {
|
|
128
|
+
const toolConfig = config.tools;
|
|
129
|
+
if (!toolConfig)
|
|
130
|
+
return;
|
|
131
|
+
const emit = createEmitter(toolConfig);
|
|
132
|
+
const requestCtx = getRequestContext();
|
|
133
|
+
const span = requestCtx ? childSpan(requestCtx.trace) : createTraceContext();
|
|
134
|
+
const measure = result.ok ? measureSize(result.data) : { resultSize: null, responseBytes: 0 };
|
|
135
|
+
const mcp = context.source === "mcp" ? readMcpContext(context.mcp) : undefined;
|
|
136
|
+
const toolPhase = mcp?.outcome === "input_required" ? "input-round" : "operation";
|
|
137
|
+
emit({
|
|
138
|
+
source: context.source,
|
|
139
|
+
method: "TOOL",
|
|
140
|
+
httpMethod: endpoint.method,
|
|
141
|
+
path: `/${context.source}/${toolName}`,
|
|
142
|
+
serviceName: endpoint.serviceName,
|
|
143
|
+
action: endpoint.key,
|
|
144
|
+
...requestCtx?.dimensions !== undefined && {
|
|
145
|
+
dimensions: requestCtx.dimensions
|
|
146
|
+
},
|
|
147
|
+
toolName,
|
|
148
|
+
toolPhase,
|
|
149
|
+
...mcp !== undefined && { mcp },
|
|
150
|
+
traceId: span.traceId,
|
|
151
|
+
spanId: span.spanId,
|
|
152
|
+
parentSpanId: span.parentSpanId,
|
|
153
|
+
ok: result.ok,
|
|
154
|
+
statusCode: result.ok ? 200 : 400,
|
|
155
|
+
durationMs,
|
|
156
|
+
errorCode: result.ok ? undefined : result.code,
|
|
157
|
+
errorMessage: result.ok ? undefined : auditErrorMessage(result, error),
|
|
158
|
+
...!result.ok && result.details !== undefined && {
|
|
159
|
+
errorDetail: sanitizePayload(result.details, toolConfig.sanitize)
|
|
160
|
+
},
|
|
161
|
+
payload: sanitizePayload(args, toolConfig.sanitize),
|
|
162
|
+
resultSize: measure.resultSize,
|
|
163
|
+
responseBytes: measure.responseBytes,
|
|
164
|
+
..."unserializable" in measure && measure.unserializable && { resultUnserializable: true },
|
|
165
|
+
userId: readString(context.userId),
|
|
166
|
+
authMethod: readString(context.authMethod),
|
|
167
|
+
clientId: readString(context.clientId),
|
|
168
|
+
ipAddress: readString(context.ipAddress),
|
|
169
|
+
userAgent: readString(context.userAgent),
|
|
170
|
+
startedAt: new Date(Date.now() - durationMs)
|
|
171
|
+
});
|
|
172
|
+
} catch {}
|
|
244
173
|
}
|
|
245
174
|
} : undefined;
|
|
246
175
|
return {
|
|
@@ -4,7 +4,12 @@ export type JsonValue = string | number | boolean | null | JsonValue[] | {
|
|
|
4
4
|
};
|
|
5
5
|
/** Tuning for `redact` / `sanitizePayload`. */
|
|
6
6
|
export interface SanitizeOptions {
|
|
7
|
-
/**
|
|
7
|
+
/**
|
|
8
|
+
* Keys whose VALUE is masked, tested against the raw key name. When omitted,
|
|
9
|
+
* the default matcher splits the key into words (camelCase, `-`, `_`, spaces)
|
|
10
|
+
* and masks it when a word IS a secret term — so `sessionToken` and
|
|
11
|
+
* `X-Api-Key` are masked while `authorId` and `sessionCount` survive.
|
|
12
|
+
*/
|
|
8
13
|
sensitiveKeys?: RegExp;
|
|
9
14
|
/** Cap on the serialised payload — anything larger collapses to a preview. Default 16 KB. */
|
|
10
15
|
maxBytes?: number;
|
|
@@ -17,6 +22,8 @@ export interface SizeMeasure {
|
|
|
17
22
|
resultSize: number | null;
|
|
18
23
|
/** Serialised byte length. */
|
|
19
24
|
responseBytes: number;
|
|
25
|
+
/** Set when the value cannot be serialised at all (bigint, a cycle). */
|
|
26
|
+
unserializable?: true;
|
|
20
27
|
}
|
|
21
28
|
/**
|
|
22
29
|
* Deep-copy `value` into a JSON-safe shape: secret-named keys masked, binary
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/observability/sanitize.ts"],"names":[],"mappings":"AAOA,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B
|
|
1
|
+
{"version":3,"file":"sanitize.d.ts","sourceRoot":"","sources":["../../src/observability/sanitize.ts"],"names":[],"mappings":"AAOA,8EAA8E;AAC9E,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEjC,+CAA+C;AAC/C,MAAM,WAAW,eAAe;IAC9B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,8BAA8B;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,cAAc,CAAC,EAAE,IAAI,CAAC;CACvB;AAwED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,SAAS,CA4F/E;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,SAAoB,GAAG,SAAS,CAgBzF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,eAAoB,GAC5B,SAAS,GAAG,IAAI,CAOlB;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAqBvD"}
|
|
@@ -20,6 +20,8 @@ export interface TraceContext {
|
|
|
20
20
|
tracestate?: string;
|
|
21
21
|
/** Valid bounded W3C baggage, retained for propagation only. */
|
|
22
22
|
baggage?: string;
|
|
23
|
+
/** W3C trace flags byte, preserved end to end (for example `00` or `01`). */
|
|
24
|
+
traceFlags?: string;
|
|
23
25
|
}
|
|
24
26
|
/** A fresh root trace — a new trace id, a new span id, no parent. */
|
|
25
27
|
export declare function createTraceContext(): TraceContext;
|
|
@@ -30,7 +32,7 @@ export declare function createTraceContext(): TraceContext;
|
|
|
30
32
|
* missing or malformed header.
|
|
31
33
|
*/
|
|
32
34
|
export declare function parseTraceparent(header: string | null | undefined): TraceContext | null;
|
|
33
|
-
/** Render a `TraceContext`
|
|
35
|
+
/** Render a `TraceContext` with its actual W3C trace-flags byte. */
|
|
34
36
|
export declare function formatTraceparent(ctx: TraceContext): string;
|
|
35
37
|
/**
|
|
36
38
|
* The trace for an incoming request — the caller's `traceparent` continued
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/observability/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../src/observability/trace.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,gFAAgF;AAChF,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAaD,qEAAqE;AACrE,wBAAgB,kBAAkB,IAAI,YAAY,CAEjD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,YAAY,GAAG,IAAI,CAmBvF;AAED,oEAAoE;AACpE,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,YAAY,GAAG,MAAM,CAE3D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,CAE9D;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,YAAY,CAS5D;AAuBD;;;;GAIG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAC7C,QAAQ,CAAC,EAAE,YAAY,GACtB,YAAY,CAkBd"}
|
|
@@ -40,6 +40,8 @@ export interface CacheBridgeConfig<TEvents> {
|
|
|
40
40
|
handlers: CacheBridgeHandlers<TEvents>;
|
|
41
41
|
/** Window (ms) after `markFresh()` during which `isFresh()` returns true. Default 500. */
|
|
42
42
|
freshWindow?: number;
|
|
43
|
+
/** Maximum remembered freshness keys. Oldest entries are evicted first. Default 1,000. */
|
|
44
|
+
maxFreshKeys?: number;
|
|
43
45
|
}
|
|
44
46
|
export interface CacheBridge {
|
|
45
47
|
connect(): void;
|
|
@@ -47,6 +49,8 @@ export interface CacheBridge {
|
|
|
47
49
|
/** Mark a query key as just-mutated. Call from a mutation's onSuccess so
|
|
48
50
|
* handlers can skip a stale socket echo via `ctx.isFresh()`. */
|
|
49
51
|
markFresh(key: QueryKey): void;
|
|
52
|
+
/** Forget every freshness marker without changing socket subscriptions. */
|
|
53
|
+
clearFresh(): void;
|
|
50
54
|
}
|
|
51
55
|
export declare function createCacheBridge<TEvents>(config: CacheBridgeConfig<TEvents>): CacheBridge;
|
|
52
56
|
export {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-bridge.d.ts","sourceRoot":"","sources":["../../src/react/cache-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEnE,wEAAwE;AACxE,MAAM,WAAW,iBAAiB,CAAC,OAAO;IACxC,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;CACjF;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,gFAAgF;IAChF,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;CACjC;AAED,oEAAoE;AACpE,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAE3E,MAAM,MAAM,kBAAkB,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAE7F,MAAM,MAAM,mBAAmB,CAAC,OAAO,IAAI;KACxC,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,OAAO;IACxC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnC;;;;;OAKG;IACH,WAAW,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;IAC/C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACvC,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"cache-bridge.d.ts","sourceRoot":"","sources":["../../src/react/cache-bridge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEnE,wEAAwE;AACxE,MAAM,WAAW,iBAAiB,CAAC,OAAO;IACxC,EAAE,CAAC,CAAC,SAAS,MAAM,OAAO,GAAG,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;CACjF;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,WAAW,CAAC;IACzB,gFAAgF;IAChF,OAAO,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC;CACjC;AAED,oEAAoE;AACpE,KAAK,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,OAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAE3E,MAAM,MAAM,kBAAkB,CAAC,QAAQ,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,kBAAkB,KAAK,IAAI,CAAC;AAE7F,MAAM,MAAM,mBAAmB,CAAC,OAAO,IAAI;KACxC,CAAC,IAAI,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7E,CAAC;AAEF,MAAM,WAAW,iBAAiB,CAAC,OAAO;IACxC,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACnC;;;;;OAKG;IACH,WAAW,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,CAAC,CAAC;IAC/C,QAAQ,EAAE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IACvC,0FAA0F;IAC1F,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0FAA0F;IAC1F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,IAAI,IAAI,CAAC;IAChB,UAAU,IAAI,IAAI,CAAC;IACnB;qEACiE;IACjE,SAAS,CAAC,GAAG,EAAE,QAAQ,GAAG,IAAI,CAAC;IAC/B,2EAA2E;IAC3E,UAAU,IAAI,IAAI,CAAC;CACpB;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAAG,WAAW,CAsF1F"}
|
package/dist/react.js
CHANGED
|
@@ -1,15 +1,35 @@
|
|
|
1
1
|
import {
|
|
2
2
|
isRecord
|
|
3
|
-
} from "./index-
|
|
3
|
+
} from "./index-tss6bk5c.js";
|
|
4
4
|
|
|
5
5
|
// src/react/cache-bridge.ts
|
|
6
6
|
function createCacheBridge(config) {
|
|
7
7
|
const freshWindow = config.freshWindow ?? 500;
|
|
8
|
+
const maxFreshKeys = config.maxFreshKeys ?? 1000;
|
|
9
|
+
if (!Number.isFinite(freshWindow) || freshWindow < 0) {
|
|
10
|
+
throw new Error("cacheBridge.freshWindow must be a non-negative finite number");
|
|
11
|
+
}
|
|
12
|
+
if (!Number.isInteger(maxFreshKeys) || maxFreshKeys < 1) {
|
|
13
|
+
throw new Error("cacheBridge.maxFreshKeys must be a positive integer");
|
|
14
|
+
}
|
|
8
15
|
const freshAt = new Map;
|
|
16
|
+
const expiryTimers = new Map;
|
|
9
17
|
let unsubscribers = [];
|
|
10
18
|
const isFresh = (key) => {
|
|
11
|
-
const
|
|
12
|
-
|
|
19
|
+
const serialised = JSON.stringify(key);
|
|
20
|
+
const ts = freshAt.get(serialised);
|
|
21
|
+
if (ts === undefined)
|
|
22
|
+
return false;
|
|
23
|
+
if (Date.now() - ts < freshWindow)
|
|
24
|
+
return true;
|
|
25
|
+
freshAt.delete(serialised);
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
28
|
+
const clearFresh = () => {
|
|
29
|
+
for (const timer of expiryTimers.values())
|
|
30
|
+
clearTimeout(timer);
|
|
31
|
+
expiryTimers.clear();
|
|
32
|
+
freshAt.clear();
|
|
13
33
|
};
|
|
14
34
|
return {
|
|
15
35
|
connect() {
|
|
@@ -31,10 +51,31 @@ function createCacheBridge(config) {
|
|
|
31
51
|
for (const off of unsubscribers)
|
|
32
52
|
off();
|
|
33
53
|
unsubscribers = [];
|
|
54
|
+
clearFresh();
|
|
34
55
|
},
|
|
35
56
|
markFresh(key) {
|
|
36
|
-
|
|
37
|
-
|
|
57
|
+
const serialised = JSON.stringify(key);
|
|
58
|
+
const existingTimer = expiryTimers.get(serialised);
|
|
59
|
+
if (existingTimer)
|
|
60
|
+
clearTimeout(existingTimer);
|
|
61
|
+
freshAt.delete(serialised);
|
|
62
|
+
freshAt.set(serialised, Date.now());
|
|
63
|
+
expiryTimers.set(serialised, setTimeout(() => {
|
|
64
|
+
freshAt.delete(serialised);
|
|
65
|
+
expiryTimers.delete(serialised);
|
|
66
|
+
}, freshWindow));
|
|
67
|
+
while (freshAt.size > maxFreshKeys) {
|
|
68
|
+
const oldest = freshAt.keys().next().value;
|
|
69
|
+
if (oldest === undefined)
|
|
70
|
+
break;
|
|
71
|
+
freshAt.delete(oldest);
|
|
72
|
+
const timer = expiryTimers.get(oldest);
|
|
73
|
+
if (timer)
|
|
74
|
+
clearTimeout(timer);
|
|
75
|
+
expiryTimers.delete(oldest);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
clearFresh
|
|
38
79
|
};
|
|
39
80
|
}
|
|
40
81
|
// src/react/cursor-query.ts
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { AppError } from '../contract/errors';
|
|
3
|
+
export interface RealtimeEventDefinition<TArgs extends z.ZodType<unknown[]> = z.ZodType<unknown[]>, TAck extends z.ZodType | undefined = z.ZodType | undefined> {
|
|
4
|
+
args: TArgs;
|
|
5
|
+
ack?: TAck;
|
|
6
|
+
}
|
|
7
|
+
export type RealtimeEventRegistry = Record<string, RealtimeEventDefinition>;
|
|
8
|
+
export interface RealtimeContract<TServerToClient extends RealtimeEventRegistry, TClientToServer extends RealtimeEventRegistry> {
|
|
9
|
+
serverToClient: TServerToClient;
|
|
10
|
+
clientToServer: TClientToServer;
|
|
11
|
+
}
|
|
12
|
+
export declare function defineRealtimeContract<const TServerToClient extends RealtimeEventRegistry, const TClientToServer extends RealtimeEventRegistry>(contract: RealtimeContract<TServerToClient, TClientToServer>): RealtimeContract<TServerToClient, TClientToServer>;
|
|
13
|
+
export type RealtimeEventArguments<TDefinition extends RealtimeEventDefinition> = [
|
|
14
|
+
...z.output<TDefinition['args']>,
|
|
15
|
+
...(TDefinition extends {
|
|
16
|
+
ack: infer TAck extends z.ZodType;
|
|
17
|
+
} ? [(value: z.input<TAck>) => void] : [])
|
|
18
|
+
];
|
|
19
|
+
export type RealtimeEmitArguments<TDefinition extends RealtimeEventDefinition> = [
|
|
20
|
+
...(z.input<TDefinition['args']> extends unknown[] ? z.input<TDefinition['args']> : never),
|
|
21
|
+
...(TDefinition extends {
|
|
22
|
+
ack: infer TAck extends z.ZodType;
|
|
23
|
+
} ? [(value: z.output<TAck>) => void] : [])
|
|
24
|
+
];
|
|
25
|
+
export type RealtimeEventHandler<TDefinition extends RealtimeEventDefinition> = (...args: RealtimeEventArguments<TDefinition>) => void;
|
|
26
|
+
export type InferRealtimeEventMap<TRegistry extends RealtimeEventRegistry> = {
|
|
27
|
+
[TEvent in keyof TRegistry]: RealtimeEventHandler<TRegistry[TEvent]>;
|
|
28
|
+
};
|
|
29
|
+
export type RealtimeRejectDirection = 'client-inbound' | 'client-outbound' | 'server-inbound' | 'server-outbound';
|
|
30
|
+
export interface RealtimeRejectedEvent {
|
|
31
|
+
event: string;
|
|
32
|
+
direction: RealtimeRejectDirection;
|
|
33
|
+
phase: 'arguments' | 'acknowledgement';
|
|
34
|
+
reason: 'unknown-event' | 'invalid-arguments' | 'invalid-acknowledgement-value' | 'missing-acknowledgement';
|
|
35
|
+
fault: 'peer' | 'local';
|
|
36
|
+
error: AppError<'REALTIME_CONTRACT_VIOLATION'>;
|
|
37
|
+
}
|
|
38
|
+
export type RealtimeRejectedEventHook = (rejected: RealtimeRejectedEvent) => void | Promise<void>;
|
|
39
|
+
//# sourceMappingURL=contract.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../src/realtime/contract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAEnD,MAAM,WAAW,uBAAuB,CACtC,KAAK,SAAS,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EACzD,IAAI,SAAS,CAAC,CAAC,OAAO,GAAG,SAAS,GAAG,CAAC,CAAC,OAAO,GAAG,SAAS;IAE1D,IAAI,EAAE,KAAK,CAAC;IACZ,GAAG,CAAC,EAAE,IAAI,CAAC;CACZ;AAED,MAAM,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAE5E,MAAM,WAAW,gBAAgB,CAC/B,eAAe,SAAS,qBAAqB,EAC7C,eAAe,SAAS,qBAAqB;IAE7C,cAAc,EAAE,eAAe,CAAC;IAChC,cAAc,EAAE,eAAe,CAAC;CACjC;AAED,wBAAgB,sBAAsB,CACpC,KAAK,CAAC,eAAe,SAAS,qBAAqB,EACnD,KAAK,CAAC,eAAe,SAAS,qBAAqB,EACnD,QAAQ,EAAE,gBAAgB,CAAC,eAAe,EAAE,eAAe,CAAC,sDAE7D;AAED,MAAM,MAAM,sBAAsB,CAAC,WAAW,SAAS,uBAAuB,IAAI;IAChF,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAChC,GAAG,CAAC,WAAW,SAAS;QAAE,GAAG,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC,OAAO,CAAA;KAAE,GACzD,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GAChC,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,MAAM,qBAAqB,CAAC,WAAW,SAAS,uBAAuB,IAAI;IAC/E,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,SAAS,OAAO,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC;IAC1F,GAAG,CAAC,WAAW,SAAS;QAAE,GAAG,EAAE,MAAM,IAAI,SAAS,CAAC,CAAC,OAAO,CAAA;KAAE,GACzD,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,GACjC,EAAE,CAAC;CACR,CAAC;AAEF,MAAM,MAAM,oBAAoB,CAAC,WAAW,SAAS,uBAAuB,IAAI,CAC9E,GAAG,IAAI,EAAE,sBAAsB,CAAC,WAAW,CAAC,KACzC,IAAI,CAAC;AAEV,MAAM,MAAM,qBAAqB,CAAC,SAAS,SAAS,qBAAqB,IAAI;KAC1E,MAAM,IAAI,MAAM,SAAS,GAAG,oBAAoB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;CACrE,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAC/B,gBAAgB,GAChB,iBAAiB,GACjB,gBAAgB,GAChB,iBAAiB,CAAC;AAEtB,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,uBAAuB,CAAC;IACnC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAAC;IACvC,MAAM,EACF,eAAe,GACf,mBAAmB,GACnB,+BAA+B,GAC/B,yBAAyB,CAAC;IAC9B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,QAAQ,CAAC,6BAA6B,CAAC,CAAC;CAChD;AAED,MAAM,MAAM,yBAAyB,GAAG,CACtC,QAAQ,EAAE,qBAAqB,KAC5B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { defineRealtimeContract, type InferRealtimeEventMap, type RealtimeContract, type RealtimeEmitArguments, type RealtimeEventArguments, type RealtimeEventDefinition, type RealtimeEventHandler, type RealtimeEventRegistry, type RealtimeRejectDirection, type RealtimeRejectedEvent, type RealtimeRejectedEventHook, } from './contract';
|
|
2
|
+
export type { ValidatedRealtimeSocket } from './socket';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/realtime/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,EAC1B,KAAK,yBAAyB,GAC/B,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { RealtimeRejectDirection, RealtimeRejectedEvent } from './contract';
|
|
2
|
+
export declare function realtimeContractViolation(options: {
|
|
3
|
+
event: string;
|
|
4
|
+
direction: RealtimeRejectDirection;
|
|
5
|
+
phase: 'arguments' | 'acknowledgement';
|
|
6
|
+
reason: RealtimeRejectedEvent['reason'];
|
|
7
|
+
fault: RealtimeRejectedEvent['fault'];
|
|
8
|
+
cause?: unknown;
|
|
9
|
+
}): RealtimeRejectedEvent;
|
|
10
|
+
//# sourceMappingURL=rejection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rejection.d.ts","sourceRoot":"","sources":["../../src/realtime/rejection.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAEjF,wBAAgB,yBAAyB,CAAC,OAAO,EAAE;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,uBAAuB,CAAC;IACnC,KAAK,EAAE,WAAW,GAAG,iBAAiB,CAAC;IACvC,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IACxC,KAAK,EAAE,qBAAqB,CAAC,OAAO,CAAC,CAAC;IACtC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,GAAG,qBAAqB,CAkBxB"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { StitchLogger } from '../logger';
|
|
2
|
+
import type { RealtimeEmitArguments, RealtimeEventHandler, RealtimeEventRegistry, RealtimeRejectDirection, RealtimeRejectedEventHook } from './contract';
|
|
3
|
+
interface ValidatedRealtimeSocketOptions<TInbound extends RealtimeEventRegistry, TOutbound extends RealtimeEventRegistry> {
|
|
4
|
+
target: object;
|
|
5
|
+
inbound: TInbound;
|
|
6
|
+
outbound: TOutbound;
|
|
7
|
+
inboundDirection: RealtimeRejectDirection;
|
|
8
|
+
outboundDirection: RealtimeRejectDirection;
|
|
9
|
+
onRejected?: RealtimeRejectedEventHook;
|
|
10
|
+
logger?: StitchLogger;
|
|
11
|
+
subscribe?: (event: string, handler: (...args: unknown[]) => void) => () => void;
|
|
12
|
+
}
|
|
13
|
+
/** Runtime target forms supported by the realtime adapter and their required capabilities. */
|
|
14
|
+
export declare const REALTIME_TARGET_FORMS: ({
|
|
15
|
+
name: "Server";
|
|
16
|
+
capabilities: ("emit" | "off" | "on")[];
|
|
17
|
+
} | {
|
|
18
|
+
name: "Socket";
|
|
19
|
+
capabilities: ("emit" | "off" | "on")[];
|
|
20
|
+
} | {
|
|
21
|
+
name: "BroadcastOperator";
|
|
22
|
+
capabilities: "emit"[];
|
|
23
|
+
})[];
|
|
24
|
+
export interface ValidatedRealtimeSocket<TInbound extends RealtimeEventRegistry, TOutbound extends RealtimeEventRegistry> {
|
|
25
|
+
on<TEvent extends keyof TInbound & string>(event: TEvent, handler: RealtimeEventHandler<TInbound[TEvent]>): () => void;
|
|
26
|
+
emit<TEvent extends keyof TOutbound & string>(event: TEvent, ...args: RealtimeEmitArguments<TOutbound[TEvent]>): void;
|
|
27
|
+
}
|
|
28
|
+
export declare function createValidatedRealtimeSocket<const TInbound extends RealtimeEventRegistry, const TOutbound extends RealtimeEventRegistry>({ target, inbound, outbound, inboundDirection, outboundDirection, onRejected, logger, subscribe, }: ValidatedRealtimeSocketOptions<TInbound, TOutbound>): ValidatedRealtimeSocket<TInbound, TOutbound>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=socket.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../src/realtime/socket.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAC9C,OAAO,KAAK,EACV,qBAAqB,EAErB,oBAAoB,EACpB,qBAAqB,EACrB,uBAAuB,EAEvB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAGpB,UAAU,8BAA8B,CACtC,QAAQ,SAAS,qBAAqB,EACtC,SAAS,SAAS,qBAAqB;IAEvC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,QAAQ,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB,EAAE,uBAAuB,CAAC;IAC1C,iBAAiB,EAAE,uBAAuB,CAAC;IAC3C,UAAU,CAAC,EAAE,yBAAyB,CAAC;IACvC,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,MAAM,IAAI,CAAC;CAClF;AAED,8FAA8F;AAC9F,eAAO,MAAM,qBAAqB;;;;;;;;;IAOhC,CAAC;AAEH,MAAM,WAAW,uBAAuB,CACtC,QAAQ,SAAS,qBAAqB,EACtC,SAAS,SAAS,qBAAqB;IAEvC,EAAE,CAAC,MAAM,SAAS,MAAM,QAAQ,GAAG,MAAM,EACvC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,oBAAoB,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,GAC9C,MAAM,IAAI,CAAC;IACd,IAAI,CAAC,MAAM,SAAS,MAAM,SAAS,GAAG,MAAM,EAC1C,KAAK,EAAE,MAAM,EACb,GAAG,IAAI,EAAE,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,GAChD,IAAI,CAAC;CACT;AA+DD,wBAAgB,6BAA6B,CAC3C,KAAK,CAAC,QAAQ,SAAS,qBAAqB,EAC5C,KAAK,CAAC,SAAS,SAAS,qBAAqB,EAC7C,EACA,MAAM,EACN,OAAO,EACP,QAAQ,EACR,gBAAgB,EAChB,iBAAiB,EACjB,UAAU,EACV,MAAM,EACN,SAAS,GACV,EAAE,8BAA8B,CAAC,QAAQ,EAAE,SAAS,CAAC,GAAG,uBAAuB,CAC9E,QAAQ,EACR,SAAS,CACV,CA0HA"}
|
package/dist/server/cache.d.ts
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
|
+
export interface CacheOptions {
|
|
2
|
+
/** Maximum retained entries. Oldest entries are evicted first. Default 1,000. */
|
|
3
|
+
maxEntries?: number;
|
|
4
|
+
}
|
|
1
5
|
/**
|
|
2
6
|
* In-memory key/value cache with a per-entry TTL. Expired entries are swept on
|
|
3
7
|
* a 30-second timer; `destroy()` stops it. For response `Cache-Control`
|
|
4
8
|
* headers use `cacheHeaders()` instead.
|
|
5
9
|
*/
|
|
6
|
-
export declare function createCache(): {
|
|
10
|
+
export declare function createCache(options?: CacheOptions): {
|
|
7
11
|
destroy: () => void;
|
|
8
12
|
get(key: string): unknown | null;
|
|
9
13
|
set(key: string, data: unknown, maxAgeSeconds: number): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/server/cache.ts"],"names":[],"mappings":"AAOA;;;;GAIG;AACH,wBAAgB,WAAW;;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/server/cache.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,YAAY;IAC3B,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,OAAO,GAAE,YAAiB;;aAYzC,MAAM,GAAG,OAAO,GAAG,IAAI;aAUvB,MAAM,QAAQ,OAAO,iBAAiB,MAAM;uBAalC,MAAM;;EAU5B;AAED,4EAA4E;AAC5E,wBAAgB,YAAY,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,QAAQ,GAAG,SAAoB,GACrC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAIxB"}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
* NOT_FOUND: 'not_found', METHOD_NOT_ALLOWED: 'not_found',
|
|
22
22
|
* CONFLICT: 'conflict', RATE_LIMITED: 'rate_limited',
|
|
23
23
|
* INTERNAL_SERVER_ERROR: 'internal',
|
|
24
|
+
* REALTIME_CONTRACT_VIOLATION: 'internal',
|
|
24
25
|
* } satisfies Record<StitchErrorCode, string>,
|
|
25
26
|
* render: (info, ctx) => ({
|
|
26
27
|
* ok: false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-hook.d.ts","sourceRoot":"","sources":["../../src/server/error-hook.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"error-hook.d.ts","sourceRoot":"","sources":["../../src/server/error-hook.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAqB,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzD,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,wFAAwF;IACxF,IAAI,EAAE,MAAM,CAAC;IACb,mBAAmB;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,OAAO,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,oCAAoC;AACpC,MAAM,WAAW,eAAe,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM;IAChE;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAC7C,uDAAuD;IACvD;;;;;OAKG;IACH,MAAM,EAAE,CACN,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,cAAc,EACnB,QAAQ,CAAC,EAAE,SAAS,KACjB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC;;;;OAIG;IACH,OAAO,CAAC,EAAE,CACR,KAAK,EAAE,OAAO,EACd,IAAI,EAAE,aAAa,EACnB,GAAG,EAAE,cAAc,EACnB,QAAQ,CAAC,EAAE,SAAS,KACjB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjC;AAED,mEAAmE;AACnE,wBAAgB,eAAe,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM,EAC/D,MAAM,EAAE,eAAe,CAAC,SAAS,CAAC,GACjC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CA0BxC"}
|
package/dist/server/file.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import type { RawRoute } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Build a basic static-file route. URL-derived paths pass both lexical and
|
|
4
|
+
* realpath containment checks, so an in-root symlink cannot escape `dir`.
|
|
5
|
+
*/
|
|
6
|
+
export declare function staticRoute(prefix: string, dir: string): RawRoute;
|
|
1
7
|
/** An inclusive byte range `[start, end]`. */
|
|
2
8
|
export interface ByteRange {
|
|
3
9
|
start: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/server/file.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../src/server/file.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,CA4BjE;AAED,8CAA8C;AAC9C,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,IAAI,EAAE,MAAM,GACX,SAAS,GAAG,eAAe,GAAG,IAAI,CAkCpC;AAED;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAE9D;AA6ED,MAAM,WAAW,gBAAgB;IAC/B,gFAAgF;IAChF,IAAI,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,WAAW,CAAC,EAAE,QAAQ,GAAG,YAAY,CAAC;IACtC,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6CAA6C;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,CAwEvF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/server/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,KAAK,EAAE,QAAQ,EAAa,UAAU,EAAE,MAAM,SAAS,CAAC;AAK/D;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,IAAI,SAAS,cAAc,GAAG,cAAc,EAC5C,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU,
|
|
1
|
+
{"version":3,"file":"implement.d.ts","sourceRoot":"","sources":["../../src/server/implement.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,KAAK,EAAE,QAAQ,EAAa,UAAU,EAAE,MAAM,SAAS,CAAC;AAK/D;;;;;GAKG;AACH,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,EACrC,IAAI,SAAS,cAAc,GAAG,cAAc,EAC5C,QAAQ,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,UAAU,CAoE3E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,SAAS,cAAc,MACjD,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,YACjC,WAAW,CAAC,CAAC,EAAE,MAAM,CAAC,YACtB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,KAC1B,UAAU,CACd"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -2,11 +2,11 @@ export { AppError, appError, badRequest, conflict, forbidden, isStitchErrorCode,
|
|
|
2
2
|
export { errorCode, formatZodError, normalizeError, type ZodIssueSummary, zodIssues, } from '../internal/errors';
|
|
3
3
|
export { isWithinDir } from '../internal/within-dir';
|
|
4
4
|
export { type BunFetchComposition as FetchComposition, type BunFetchHandler as FetchHandler, type BunHandlerConfig as HandlerConfig, type BunRawRoute as RawRoute, type BunRawRouteContext as RawRouteContext, type BunServer, type BunServerConfig, createServer, type ServerPassthrough, } from './bun';
|
|
5
|
-
export { cacheHeaders, createCache } from './cache';
|
|
5
|
+
export { type CacheOptions, cacheHeaders, createCache } from './cache';
|
|
6
6
|
export { createHandler } from './create';
|
|
7
7
|
export { createErrorHook, type ErrorHookConfig, type ResolvedError, } from './error-hook';
|
|
8
8
|
export { createEventBus, type DefaultEventMap, type EventBus, type EventBusOptions, type EventHandler, } from './event-bus';
|
|
9
|
-
export { type ByteRange, parseByteRange, type ServeFileOptions, serveFile, weakETag, } from './file';
|
|
9
|
+
export { type ByteRange, parseByteRange, type ServeFileOptions, serveFile, staticRoute, weakETag, } from './file';
|
|
10
10
|
export { createImplement, implement } from './implement';
|
|
11
11
|
export type { LogFormat } from './logger';
|
|
12
12
|
export { type AuthHook, type AuthHookConfig, type AuthRule, type BearerResolverConfig, createAuthHook, createBearerResolver, extractToken, type JwtPayload, type SignJwtOptions, signJwt, type VerifyJwtOptions, verifyJwt, } from './middleware/auth';
|
|
@@ -17,8 +17,8 @@ export { type MultipartResult, parseMultipart } from './multipart';
|
|
|
17
17
|
export { generateOpenApiDocument, type OpenApiConfig, type OpenApiDocument, type OpenApiInfo, type OpenApiServer, openApiRoute, } from './openapi';
|
|
18
18
|
export { createRateLimiter, type RateLimitConfig } from './rate-limit';
|
|
19
19
|
export { errorResponse, parseBody, respondJson } from './raw';
|
|
20
|
+
export { bindRealtimeServer, type RealtimeServer, type RealtimeServerConnection, type RealtimeServerHandle, } from './realtime';
|
|
20
21
|
export { type ClientIpOptions, extractIp, generateTraceId, getClientInfo, resolveSocketIp, resolveTraceId, } from './request';
|
|
21
|
-
export { staticRoute } from './router';
|
|
22
22
|
export type { SocketIOServerConfig, SocketIOServerHandle } from './socket-io';
|
|
23
23
|
export { createSocketIOServer, socketIoLane } from './socket-io';
|
|
24
24
|
export { type ParseSSEOptions, parseSSE, streamSSE } from './stream';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,SAAS,EACT,iBAAiB,EACjB,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,KAAK,eAAe,EACpB,YAAY,GACb,MAAM,aAAa,CAAC;AAIrB,OAAO,EACL,SAAS,EACT,cAAc,EACd,cAAc,EACd,KAAK,eAAe,EACpB,SAAS,GACV,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EACL,KAAK,mBAAmB,IAAI,gBAAgB,EAC5C,KAAK,eAAe,IAAI,YAAY,EACpC,KAAK,gBAAgB,IAAI,aAAa,EACtC,KAAK,WAAW,IAAI,QAAQ,EAC5B,KAAK,kBAAkB,IAAI,eAAe,EAC1C,KAAK,SAAS,EACd,KAAK,eAAe,EACpB,YAAY,EACZ,KAAK,iBAAiB,GACvB,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"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"}
|