bunderstack 0.24.4 → 0.24.5
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/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `bunderstack` will be documented in this file.
|
|
4
4
|
|
|
5
|
+
## [0.24.5] — 2026-09-19
|
|
6
|
+
|
|
7
|
+
### Security
|
|
8
|
+
|
|
9
|
+
- Upgrade the synchronized oRPC dependency set to `2.0.0-beta.37`, which fixes
|
|
10
|
+
the RPC serializer metadata denial-of-service vulnerability described in
|
|
11
|
+
GHSA-4p2c-m292-ghmh.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- Adapt response-header propagation and RPC client URL typing to the updated
|
|
16
|
+
oRPC handler and client contracts.
|
|
17
|
+
|
|
5
18
|
## [0.24.4] — 2026-09-19
|
|
6
19
|
|
|
7
20
|
### Fixed
|
|
@@ -129,7 +129,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
129
129
|
readonly code: "TOO_MANY_REQUESTS";
|
|
130
130
|
}>;
|
|
131
131
|
};
|
|
132
|
-
}
|
|
132
|
+
}>;
|
|
133
133
|
get: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.StrictObjectSchema<{
|
|
134
134
|
readonly id: v.StringSchema<undefined>;
|
|
135
135
|
}, undefined>, v.GenericSchema<TTable["$inferSelect"], TTable["$inferSelect"]>, {
|
|
@@ -189,7 +189,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
189
189
|
readonly code: "TOO_MANY_REQUESTS";
|
|
190
190
|
}>;
|
|
191
191
|
};
|
|
192
|
-
}
|
|
192
|
+
}>;
|
|
193
193
|
create: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.GenericSchema<Partial<TTable["$inferInsert"]>, Partial<TTable["$inferInsert"]>>, v.GenericSchema<TTable["$inferSelect"], TTable["$inferSelect"]>, {
|
|
194
194
|
readonly BAD_REQUEST: {
|
|
195
195
|
readonly data: v.OptionalSchema<v.StrictObjectSchema<{
|
|
@@ -247,7 +247,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
247
247
|
readonly code: "TOO_MANY_REQUESTS";
|
|
248
248
|
}>;
|
|
249
249
|
};
|
|
250
|
-
}
|
|
250
|
+
}>;
|
|
251
251
|
update: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.GenericSchema<{
|
|
252
252
|
id: string;
|
|
253
253
|
} & Partial<Omit<TTable["$inferInsert"], "id">>, {
|
|
@@ -309,7 +309,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
309
309
|
readonly code: "TOO_MANY_REQUESTS";
|
|
310
310
|
}>;
|
|
311
311
|
};
|
|
312
|
-
}
|
|
312
|
+
}>;
|
|
313
313
|
delete: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.StrictObjectSchema<{
|
|
314
314
|
readonly id: v.StringSchema<undefined>;
|
|
315
315
|
}, undefined>, v.UndefinedSchema<undefined>, {
|
|
@@ -369,7 +369,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
369
369
|
readonly code: "TOO_MANY_REQUESTS";
|
|
370
370
|
}>;
|
|
371
371
|
};
|
|
372
|
-
}
|
|
372
|
+
}>;
|
|
373
373
|
live: import("@orpc/server").DecoratedProcedure<import("./context.js").ApiContext<TSchema, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.GenericSchema<LiveInputFor<TTable, TFilterable, TSortable>, LiveInputFor<TTable, TFilterable, TSortable>>, import("@orpc/contract").Schema<AsyncIteratorObject<{
|
|
374
374
|
type: "snapshot";
|
|
375
375
|
items: TTable["$inferSelect"][];
|
|
@@ -467,7 +467,7 @@ export declare function buildTableCrudProcedures<TSchema extends Record<string,
|
|
|
467
467
|
readonly code: "TOO_MANY_REQUESTS";
|
|
468
468
|
}>;
|
|
469
469
|
};
|
|
470
|
-
}
|
|
470
|
+
}>;
|
|
471
471
|
};
|
|
472
472
|
export type TableCrudProcedures<TTable extends Table, TFilterable extends string = string, TSortable extends string = string, TLive extends boolean = false> = Omit<ReturnType<typeof buildTableCrudProcedures<Record<string, unknown>, TTable, TFilterable, TSortable>>, 'live'> & (TLive extends true ? {
|
|
473
473
|
live: ReturnType<typeof buildTableCrudProcedures<Record<string, unknown>, TTable, TFilterable, TSortable>>['live'];
|
|
@@ -86,7 +86,7 @@ export declare function buildRealtimeApiRouter(publisher: RealtimePublisher | un
|
|
|
86
86
|
readonly code: "TOO_MANY_REQUESTS";
|
|
87
87
|
}>;
|
|
88
88
|
};
|
|
89
|
-
}
|
|
89
|
+
}>;
|
|
90
90
|
};
|
|
91
91
|
} | undefined;
|
|
92
92
|
export type RealtimeApiRouter = NonNullable<ReturnType<typeof buildRealtimeApiRouter>>;
|
|
@@ -75,7 +75,7 @@ export declare function buildStorageApiRouter(registry: BucketStorageRegistry, o
|
|
|
75
75
|
readonly code: "TOO_MANY_REQUESTS";
|
|
76
76
|
}>;
|
|
77
77
|
};
|
|
78
|
-
}
|
|
78
|
+
}>;
|
|
79
79
|
upload: import("@orpc/server").DecoratedProcedure<ApiContext<Record<string, unknown>, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.StrictObjectSchema<{
|
|
80
80
|
readonly params: v.OptionalSchema<v.StrictObjectSchema<{}, undefined>, {}>;
|
|
81
81
|
readonly query: v.OptionalSchema<v.RecordSchema<v.StringSchema<undefined>, v.UnknownSchema, undefined>, {}>;
|
|
@@ -146,7 +146,7 @@ export declare function buildStorageApiRouter(registry: BucketStorageRegistry, o
|
|
|
146
146
|
readonly code: "TOO_MANY_REQUESTS";
|
|
147
147
|
}>;
|
|
148
148
|
};
|
|
149
|
-
}
|
|
149
|
+
}>;
|
|
150
150
|
confirmUpload: import("@orpc/server").DecoratedProcedure<ApiContext<Record<string, unknown>, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.StrictObjectSchema<{
|
|
151
151
|
readonly id: v.StringSchema<undefined>;
|
|
152
152
|
}, undefined>, v.StrictObjectSchema<{
|
|
@@ -209,7 +209,7 @@ export declare function buildStorageApiRouter(registry: BucketStorageRegistry, o
|
|
|
209
209
|
readonly code: "TOO_MANY_REQUESTS";
|
|
210
210
|
}>;
|
|
211
211
|
};
|
|
212
|
-
}
|
|
212
|
+
}>;
|
|
213
213
|
download: import("@orpc/server").DecoratedProcedure<ApiContext<Record<string, unknown>, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.StrictObjectSchema<{
|
|
214
214
|
readonly params: v.StrictObjectSchema<{
|
|
215
215
|
readonly path: v.StringSchema<undefined>;
|
|
@@ -282,7 +282,7 @@ export declare function buildStorageApiRouter(registry: BucketStorageRegistry, o
|
|
|
282
282
|
readonly code: "TOO_MANY_REQUESTS";
|
|
283
283
|
}>;
|
|
284
284
|
};
|
|
285
|
-
}
|
|
285
|
+
}>;
|
|
286
286
|
delete: import("@orpc/server").DecoratedProcedure<ApiContext<Record<string, unknown>, Record<string, unknown>, import("..").MessagingConfig, Record<never, never>> & object, object, v.StrictObjectSchema<{
|
|
287
287
|
readonly path: v.StringSchema<undefined>;
|
|
288
288
|
}, undefined>, v.UndefinedSchema<undefined>, {
|
|
@@ -342,7 +342,7 @@ export declare function buildStorageApiRouter(registry: BucketStorageRegistry, o
|
|
|
342
342
|
readonly code: "TOO_MANY_REQUESTS";
|
|
343
343
|
}>;
|
|
344
344
|
};
|
|
345
|
-
}
|
|
345
|
+
}>;
|
|
346
346
|
};
|
|
347
347
|
};
|
|
348
348
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/client/rpc-client.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAA;AAE5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,4BAA4B,CAAA;AAsD/D,SAAS,MAAM,CAAC,OAAO,GAAG,MAAM;IAC9B,OAAO,CACL,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,OAAO,MAAM,CAC5C,CAAA;AAClB,CAAC;AAED,SAAS,WAAW,CAAI,MAAS;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,EAAwB,CAAA;IAC7C,OAAO,IAAI,KAAK,CAAC,cAAa,CAAoC,EAAE;QAClE,GAAG,CAAC,OAAO,EAAE,QAAQ;YACnB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACzB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAgB,EAAE,QAAQ,CAAC,CAAA;gBACrD,KAAK,CAAC,GAAG,CACP,QAAQ,EACR,KAAK,KAAK,IAAI;oBACZ,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC;oBAC1D,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CACvB,CAAA;YACH,CAAC;YACD,OAAO,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;QAC5B,CAAC;QACD,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,IAA6B;YACpD,MAAM,CAAC,KAAK,EAAE,OAAO,GAAG,EAAE,CAAC,GAAG,IAAI,CAAA;YAClC,OAAO,OAAO,CAAC,KAAK,CAClB,MAAyC,EACzC,SAAS,EACT;gBACE,KAAK;gBACL;oBACE,MAAM,EAAE,OAAO,CAAC,MAAM;oBACtB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,OAAO,EAAE;wBACP,WAAW,EAAE,OAAO,CAAC,WAAW;wBAChC,OAAO,EAAE,OAAO,CAAC,OAAO;qBACzB;iBACF;aACF,CACF,CAAA;QACH,CAAC;KACF,CAA+B,CAAA;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,UAAyB,EAAE;IAE3B,MAAM,OAAO,GACX,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IACnE,MAAM,IAAI,GAAG,IAAI,OAAO,CAAa;QACnC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAC5B,KAAK,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC;QACxC,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,MAAM,QAAQ,GACZ,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU;gBACnC,CAAC,CAAC,MAAM,OAAO,CAAC,OAAO,EAAE;gBACzB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAA;YACrB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAA;YACrC,IAAI,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAClD,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CACxB,CAAA;YACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;gBACxB,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,OAAO,CAAC,WAAW,CAAC,CAAA;YACvD,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;KACF,CAAC,CAAA;IACF,MAAM,MAAM,GAAG,gBAAgB,CAAoC,IAAI,CAAC,CAAA;IACxE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAA;AAC5B,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,UAAyB,EAAE;IAE3B,OAAO,eAAe,CAAuB,OAAO,CAAC,CAAA;AACvD,CAAC","sourcesContent":["import type { StandardUrl } from '@orpc/client
|
|
1
|
+
{"version":3,"file":"rpc-client.js","sourceRoot":"","sources":["../../src/client/rpc-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { StandardUrl } from '@orpc/client'\nimport type { AnyRouter, RouterClient } from '@orpc/server'\n\nimport { createORPCClient } from '@orpc/client'\nimport { RPCLink } from '@orpc/client/fetch'\n\nexport const OPERATION_ID_HEADER = 'x-bunderstack-operation-id'\n\nexport type Fetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>\n\nexport type ClientOptions = {\n baseUrl?: string\n fetch?: Fetch\n headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>)\n}\n\nexport type CallOptions = {\n signal?: AbortSignal\n lastEventId?: string\n operationId?: string\n headers?: HeadersInit\n}\n\nexport type ClientCarrier = {\n api: AnyRouter\n buckets: string\n}\n\nexport type AnyBunderstackApp = {\n $inferClient?: ClientCarrier | undefined\n}\n\nexport type InferApiRouter<TApp extends AnyBunderstackApp> = NonNullable<\n TApp['$inferClient']\n>['api']\n\ntype RpcContext = {\n operationId?: string\n headers?: HeadersInit\n}\n\ntype AdaptCallArgs<TArgs extends unknown[]> = {\n [K in keyof TArgs]: K extends 1 | '1' ? CallOptions : TArgs[K]\n}\n\nexport type DirectClient<T> = T extends (...args: infer TArgs) => infer TResult\n ? (...args: AdaptCallArgs<TArgs>) => TResult\n : { [K in keyof T]: DirectClient<T[K]> }\n\nexport type RpcClient<TRouter extends AnyRouter> = DirectClient<\n RouterClient<TRouter, RpcContext>\n>\n\nexport type BunderstackClient<TApp extends AnyBunderstackApp> = RpcClient<\n InferApiRouter<TApp>\n>\n\nfunction rpcUrl(baseUrl = '/api'): StandardUrl {\n return (\n baseUrl.endsWith('/') ? `${baseUrl}rpc` : `${baseUrl}/rpc`\n ) as StandardUrl\n}\n\nfunction adaptClient<T>(client: T): DirectClient<T> {\n const cache = new Map<PropertyKey, unknown>()\n return new Proxy(function () {} as (...args: unknown[]) => unknown, {\n get(_target, property) {\n if (!cache.has(property)) {\n const value = Reflect.get(client as object, property)\n cache.set(\n property,\n value === null ||\n (typeof value !== 'object' && typeof value !== 'function')\n ? value\n : adaptClient(value),\n )\n }\n return cache.get(property)\n },\n apply(_target, _thisArg, args: [unknown, CallOptions?]) {\n const [input, options = {}] = args\n return Reflect.apply(\n client as (...args: unknown[]) => unknown,\n undefined,\n [\n input,\n {\n signal: options.signal,\n lastEventId: options.lastEventId,\n context: {\n operationId: options.operationId,\n headers: options.headers,\n },\n },\n ],\n )\n },\n }) as unknown as DirectClient<T>\n}\n\nexport function createRpcClient<TRouter extends AnyRouter>(\n options: ClientOptions = {},\n): RpcClient<TRouter> {\n const fetcher =\n options.fetch ?? ((input, init) => globalThis.fetch(input, init))\n const link = new RPCLink<RpcContext>({\n url: rpcUrl(options.baseUrl),\n fetch: (url, init) => fetcher(url, init),\n headers: async ({ context }) => {\n const defaults =\n typeof options.headers === 'function'\n ? await options.headers()\n : options.headers\n const headers = new Headers(defaults)\n new Headers(context.headers).forEach((value, key) =>\n headers.set(key, value),\n )\n if (context.operationId) {\n headers.set(OPERATION_ID_HEADER, context.operationId)\n }\n return headers\n },\n })\n const client = createORPCClient<RouterClient<TRouter, RpcContext>>(link)\n return adaptClient(client)\n}\n\nexport function createClient<TApp extends AnyBunderstackApp>(\n options: ClientOptions = {},\n): BunderstackClient<TApp> {\n return createRpcClient<InferApiRouter<TApp>>(options)\n}\n"]}
|
package/dist/runtime.js
CHANGED
|
@@ -410,11 +410,11 @@ export async function materializeBunderstack(options, source, overrides = {}, in
|
|
|
410
410
|
: {}),
|
|
411
411
|
};
|
|
412
412
|
},
|
|
413
|
-
|
|
413
|
+
interceptors: [
|
|
414
414
|
async (options) => {
|
|
415
415
|
const res = await options.next();
|
|
416
|
-
if (
|
|
417
|
-
options.context.resHeaders.forEach((v, k) => res.
|
|
416
|
+
if (options.context.resHeaders) {
|
|
417
|
+
options.context.resHeaders.forEach((v, k) => (res.headers[k] = v));
|
|
418
418
|
}
|
|
419
419
|
return res;
|
|
420
420
|
},
|
package/dist/runtime.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAA;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,4BAA4B,EAAE,MAAM,eAAe,CAAA;AA8B5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,UAAU,CAAA;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAA;AAC9D,OAAO,EAAE,gBAAgB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAA;AAC9E,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAA;AAC5D,OAAO,EACL,UAAU,EAEV,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,QAAQ,CAAA;AACf,OAAO,EACL,aAAa,GAGd,MAAM,UAAU,CAAA;AACjB,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAA;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,EAA0C,MAAM,OAAO,CAAA;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC1E,OAAO,EAAE,SAAS,EAAwB,MAAM,aAAa,CAAA;AAC7D,OAAO,EAAE,aAAa,EAA0B,MAAM,WAAW,CAAA;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACrD,OAAO,EACL,mBAAmB,GAEpB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EACL,oBAAoB,GAGrB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,6BAA6B,EAC7B,4BAA4B,GAC7B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EACL,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAA;AAC5D,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAA;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAA;AAiB9C,SAAS,qBAAqB,CAC5B,MAAmB,EACnB,uBAAgC;IAEhC,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAA;IAE5C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;YACzC,IAAI,uBAAuB,EAAE,CAAC;gBAC5B,OAAO,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;gBACtC,OAAO,CAAC,cAAc,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;YACzC,CAAC;YACD,OAAO,EAAE,CAAA;QACX,CAAC,CAAA;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,IAAI,uBAAuB,EAAE,CAAC;YAC5B,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;YAC5B,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAA;QAC/B,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,gFAAgF;AAChF,MAAM,sBAAsB,GAAG,EAAE,GAAG,MAAM,CAAA;AAoK1C,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAoB1C,OAgBC,EACD,MAA0C,EAC1C,YAA8B,EAAE,EAChC,YAAiC;IAcjC,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,aAAa,CAAA;IAChD,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IAC7C,MAAM,QAAQ,GAAG,OAAO,CAAC,IAA4B,CAAA;IACrD,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAA;IAC5E,CAAC;IACD,MAAM,GAAG,GAAG,YAAY,CAAA;IACxB,MAAM,cAAc,GAAG,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,CAAC,CAAA;IAC1D,MAAM,MAAM,GAAG;QACb,GAAG,cAAc;QACjB,QAAQ,EAAE,SAAS,CAAC,QAAQ;YAC1B,CAAC,CAAC,EAAE,GAAG,cAAc,CAAC,QAAQ,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE;YACvD,CAAC,CAAC,cAAc,CAAC,QAAQ;QAC3B,OAAO,EAAE,SAAS,CAAC,eAAe,IAAI,cAAc,CAAC,OAAO;KAC7D,CAAA;IACD,wEAAwE;IACxE,6EAA6E;IAC7E,oDAAoD;IACpD,MAAM,YAAY,GAAG,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;IACvD,MAAM,SAAS,GAAG,IAAI,SAAS,EAAE,CAAA;IACjC,MAAM,EACJ,EAAE,EACF,MAAM,EACN,KAAK,EAAE,aAAa,GACrB,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE;QAC/B,GAAG,MAAM,CAAC,QAAQ;QAClB,OAAO;KACR,CAAC,CAAA;IACF,MAAM,SAAS,GAAG,eAAe,CAC/B,CAAC,OAAO,CAAC,SAAS,IAAI,EAAE,CAAoB,EAC5C;QACE,GAAG;QACH,EAAE;QACF,gBAAgB,EAAE,SAAS,CAAC,iBAAiB;KAC9C,CACiC,CAAA;IACpC,IAAI,aAAa;QAAE,SAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAA;IAC/C,IAAI,CAAC;QACH,8EAA8E;QAC9E,6EAA6E;QAC7E,+EAA+E;QAC/E,wEAAwE;QACxE,oEAAoE;QACpE,+DAA+D;QAC/D,MAAM,MAAM,GAAG,EAA+B,CAAA;QAC9C,6EAA6E;QAC7E,6EAA6E;QAC7E,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACtE,MAAM,SAAS,GACb,OAAO,CAAC,SAAS,EAAE,KAAK,EAAE,IAAI,KAAK,OAAO;YACxC,CAAC,CAAG,SAAqC,CAAC,KAAqB;YAC/D,CAAC,CAAC,SAAS,CAAA;QACf,MAAM,IAAI,GAAG,UAAU,CACrB,EAAE,EACF,qBAAqB,CACnB,UAAU,EACV,SAAS,IAAK,EAAE,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAyB,EAC/D,OAAO,CAAC,SAAS,CAAC,CACnB,EACD,OAAO,EACP,OAAO,CAAC,MAAiC,CAC1C,CAAA;QACD,4EAA4E;QAC5E,4EAA4E;QAC5E,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,aAAa,GAAG,iBAAiB,CACrC,OAAO,CAAC,MAAiC,EACzC,UAAU,CACX,CAAA;QACD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3D,MAAM,CAAC,IAAI,CACT,sDAAsD;gBACpD,+BAA+B,aAAa;qBACzC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;qBAC9B,IAAI,CAAC,IAAI,CAAC,kDAAkD;gBAC/D,qBAAqB,CACxB,CAAA;QACH,CAAC;QACD,MAAM,oBAAoB,GACxB,OAAO,CAAC,YAAY;YACpB,CAAC,aAAa,CAAC,MAAM,KAAK,CAAC;gBACzB,CAAC,CAAC,qBAAqB,CAAC,IAAuB,EAAE,OAAO,CAAC,OAAO,CAAC;gBACjE,CAAC,CAAC,SAAS,CAAC,CAAA;QAChB,MAAM,YAAY,GAAG,SAAS,CAAC,YAAY;YACzC,CAAC,CAAC;gBACE,GAAG,EAAE;oBACH,KAAK,CAAC,UAAU,CAAC,EAAE,OAAO,EAAwB;wBAChD,OAAO,CACL,CAAC,MAAM,SAAS,CAAC,YAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;4BAC3D,CAAC,MAAM,oBAAoB,EAAE,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;4BACzD,IAAI,CACL,CAAA;oBACH,CAAC;iBACF;aACF;YACH,CAAC,CAAC,oBAAoB,CAAA;QACxB,MAAM,cAAc,GAAG,wBAAwB,CAC7C,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,CACf,CAAA;QACD,MAAM,kBAAkB,GACtB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU;YAC5B,CAAC,CAAC,SAAS,CAAA;QACf,MAAM,qBAAqB,GACzB,OAAO,MAAM,CAAC,QAAQ,KAAK,QAAQ;YACjC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa;YAC/B,CAAC,CAAC,SAAS,CAAA;QACf,MAAM,kBAAkB,GAAG,MAAM,CAAC,QAAQ;YACxC,CAAC,CAAC,uBAAuB,CAAC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,MAAM,CAAC;YACvD,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,QAAQ,GAAG,SAAS,CAAC,mBAAmB;YAC5C,CAAC,CAAC,SAAS;YACX,CAAC,CAAC,kBAAkB,CAAA;QACtB,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ;YAC/B,CAAC,CAAC,QAAQ;gBACR,CAAC,CAAC,CAAC,GAAG,EAAE;oBACJ,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAA;oBAC3C,MAAM,UAAU,GAAG,KAAK,CAAC,SAAS,EAAE,CAAA;oBACpC,SAAS,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE;wBACvB,KAAK,CAAC,KAAK,EAAE,CACZ;wBAAA,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK,EAAE,CAAA;oBAC7B,CAAC,CAAC,CAAA;oBACF,OAAO,4BAA4B,CAAC,KAAK,EAAE,UAAU,EAAE;wBACrD,MAAM,EAAE,MAAM,CAAC,2BAA2B,IAAI,cAAc;wBAC5D,iBAAiB,EAAE,kBAAkB;wBACrC,aAAa,EAAE,qBAAqB;qBACrC,CAAC,CAAA;gBACJ,CAAC,CAAC,EAAE;gBACN,CAAC,CAAC,6BAA6B,CAAC;oBAC5B,iBAAiB,EAAE,kBAAkB;oBACrC,aAAa,EAAE,qBAAqB;iBACrC,CAAC;YACN,CAAC,CAAC,SAAS,CAAA;QACb,MAAM,wBAAwB,GAAsB,CAAC,SAAS;YAC5D,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,QAAQ;gBACR,CAAC,CAAC,OAAO;gBACT,CAAC,CAAC,QAAQ,CAAA;QACd,MAAM,QAAQ,GAAG,oBAAoB,CACnC,SAAS,EACT,wBAAwB,EACxB,OAAO,CAAC,MAAM,CACf,CAAA;QACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;QACrD,MAAM,iBAAiB,GAAG,uBAAuB,CAAC;YAChD,QAAQ;YACR,EAAE;SACH,CAAC,CAAA;QACF,MAAM,gBAAgB,GAAG,qBAAqB,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAA;QAC3E,MAAM,iBAAiB,GAAG,sBAAsB,CAAC,SAAS,EAAE,cAAc,CAAC,CAAA;QAC3E,MAAM,OAAO,GAAkB;YAC7B,KAAK,CAAC,MAAM,CAAC,MAAM;gBACjB,MAAM,UAAU,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;gBACtC,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,yBAAyB,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAA;gBAC5D,CAAC;qBAAM,CAAC;oBACN,oEAAoE;oBACpE,MAAM,iBAAiB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;gBACrC,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI;gBACT,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;YACpC,CAAC;YACD,KAAK,CAAC,WAAW,GAAG,sBAAsB;gBACxC,OAAO,YAAY,CAAC,QAAQ,EAAE,EAAE,EAAE,WAAW,CAAC,CAAA;YAChD,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,GAAG,EAAE;gBACzB,MAAM,UAAU,GACd,IAAI,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAA;gBAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;gBACjD,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;oBACxB,OAAO,OAAO,CAAC,UAAU,CAAC,GAAG,EAAE;wBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;qBAClC,CAAC,CAAA;gBACJ,CAAC;gBACD,OAAO,cAAc,GAAG,EAAE,CAAA;YAC5B,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,GAAG,EAAE;gBAC5C,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;gBAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,OAAO,CAAA;gBACjD,IAAI,CAAC,OAAO;oBAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAA;gBAC9D,MAAM,EAAE,GAAG,IAAI,YAAY,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,IAAI,CAAC,CAAA;gBACnE,MAAM,GAAG,GAAgB,EAAE,CAAC,MAAM,CAAC,KAAK,CACtC,EAAE,CAAC,UAAU,EACb,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CACf,CAAA;gBAChB,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAA;gBAC3C,MAAM,eAAe,CAAC,EAAE,EAAE;oBACxB,MAAM,EAAE,GAAG;oBACX,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;oBAC7B,SAAS,EAAE,IAAI;oBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;oBACxD,WAAW;oBACX,IAAI,EAAE,GAAG,CAAC,UAAU;iBACrB,CAAC,CAAA;YACJ,CAAC;SACF,CAAA;QACD,MAAM,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QAClD,uEAAuE;QACvE,mEAAmE;QACnE,MAAM,YAAY,GAAyB,iBAAiB;YAC1D,CAAC,CAAC;gBACE,GAAG,QAAQ;gBACX,CAAC,sBAAsB,CAAC,EAAE;oBACxB,IAAI,EAAE,MAAM;oBACZ,QAAQ,EAAE,sBAAsB;oBAChC,OAAO,EAAE,KAAK,IAAI,EAAE;wBAClB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;oBACvB,CAAC;iBACF;aACF;YACH,CAAC,CAAC,QAAQ,CAAA;QAEZ,MAAM,SAAS,GAAG,YAAY;YAC5B,CAAC,CAAC,eAAe,CAAC;gBACd,EAAE;gBACF,IAAI,EAAE,YAAY;gBAClB,GAAG,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;gBACtD,MAAM;aACP,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;QACb,IAAI,UAA8B,CAAA;QAClC,MAAM,IAAI,GAAG;YACX,KAAK,CAAC,OAAO,CAAC,IAAY,EAAE,KAAe,EAAE,IAAqB;gBAChE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,MAAM,IAAI,KAAK,CACb,oEAAoE,CACrE,CAAA;gBACH,CAAC;gBACD,MAAM,MAAM,GAAG,MAAM,UAAU,CAC7B,EAAE,EACF,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,UAAU,CACX,CAAA;gBACD,OAAO,MAAM,CAAA;YACf,CAAC;YACD,IAAI,CAAC,GAAY;gBACf,OAAO,SAAS;oBACd,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;oBACrB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;YACxD,CAAC;SACF,CAAA;QACD,IAAI,SAAS;YAAE,SAAS,CAAC,aAAa,CAAC,IAAI,CAAC,CAAA;QAC5C,SAAS,CAAC,oBAAoB,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,GAAG;gBACZ,MAAM,QAAQ,GAAG,UAAU,CAAA;gBAC3B,UAAU,GAAG,GAAG,CAAA;gBAChB,IAAI,CAAC;oBACH,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;gBAC7B,CAAC;wBAAS,CAAC;oBACT,UAAU,GAAG,QAAQ,CAAA;gBACvB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CACf,SAAS;gBACP,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC;gBACxB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;SAC7D,CAAC,CAAA;QACF,MAAM,WAAW,GAAG,KAAK,EACvB,UAAiC,EAAE,EACZ,EAAE;YACzB,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAA;YAC3D,CAAC;YACD,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;gBACjC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAA;YAClE,CAAC;YACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM;gBAC3B,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;gBACrD,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;YACpB,MAAM,MAAM,GAAG,cAAc,CAAC;gBAC5B,GAAG,OAAO;gBACV,MAAM;gBACN,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;gBAClC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;aAC/B,CAAC,CAAA;YACF,MAAM,UAAU,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAA;YACtD,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAA;YACtC,OAAO,MAAM,CAAA;QACf,CAAC,CAAA;QACD,MAAM,SAAS,GAAG,KAAK,EACrB,UAA+B,EAAE,EAClB,EAAE;YACjB,IACE,QAAQ,CAAC,SAAS,KAAK,QAAQ;gBAC/B,CAAC,OAAO,CAAC,yBAAyB,EAClC,CAAC;gBACD,MAAM,IAAI,KAAK,CACb,mPAAmP,CACpP,CAAA;YACH,CAAC;YACD,MAAM,EACJ,yBAAyB,EAAE,0BAA0B,EACrD,GAAG,aAAa,EACjB,GAAG,OAAO,CAAA;YACX,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,aAAa,CAAC,CAAA;YAC/C,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM;oBACjC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;oBAC3D,CAAC,CAAC,SAAS,CAAC,MAAM,CAAA;gBACpB,MAAM,qBAAqB,CAAC,MAAM,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;YAC5D,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;gBACpB,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;YACzB,CAAC;QACH,CAAC,CAAA;QACD,MAAM,aAAa,GAAG,kBAAkB,CAItC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE;YACxB,MAAM,EAAE,cAAc;YACtB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,QAAQ;YACR,aAAa,EAAE,SAAS;SACzB,CAAC,CAAA;QAEF,MAAM,eAAe,GAAG,OAAO,CAAC,GAAmC,CAAA;QAEnE,MAAM,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,CAAA;QACrD,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAC9D,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,KAAK,CAC5B,CAAA;QACD,MAAM,SAAS,GAAG,GAAG,EAAE,CACrB,oBAAoB,CAAC;YACnB,GAAG,eAAe;YAClB,iBAAiB;YACjB,GAAG,CAAC,GAAG,CAAC,oBAAoB,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,oBAAoB,EAAE,CAAC;SAC5C,CAAC,CAAA;QAEJ,MAAM,YAAY,GAAG,cAAc,CAAC;YAClC,IAAI,EAAE,aAAwC;YAC9C,OAAO,EAAE,gBAA2C;YACpD,QAAQ,EAAE,iBAAwD;YAClE,MAAM,EAAE,eAAsD;YAC9D,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,SAAS;SACV,CAAQ,CAAA;QAET,MAAM,kBAAkB,GACtB,OAAO,CAAC,OAAO;YACf,IAAI,CAAC,GAAG;YACR,uBAAuB,IAAI,IAAI,CAAC,GAAG;YACnC,OAAO,IAAI,CAAC,GAAG,CAAC,qBAAqB,KAAK,UAAU;YAClD,CAAC,CAAC,MAAM,IAAI,CAAC,GAAG,CAAC,qBAAqB,EAAE;YACxC,CAAC,CAAC,SAAS,CAAA;QAEf,MAAM,eAAe,GAAG,kBAAkB;YACxC,CAAC,CAAC,2BAA2B,CAAC,kBAAkB,EAAE;gBAC9C,MAAM,EAAE,WAAW;gBACnB,MAAM,EAAE,MAAM;aACf,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,gBAAgB,CAAC;YACrB,YAAY;YACZ,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,EAAE;YACtD,mBAAmB,EAAE,IAAI,GAAG,CAAC;gBAC3B,QAAQ;gBACR,WAAW;gBACX,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1C,GAAG,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CACvC;oBACE,eAAe;oBACf,QAAQ;oBACR,eAAe;oBACf,UAAU;oBACV,QAAQ;iBACT,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,IAAI,IAAI,SAAS,EAAE,CAAC,CACnD;aACF,CAAC;SACH,CAAC,CAAA;QAEF,MAAM,gBAAgB,GAAG,IAAI,4BAA4B,EAAE,CAAA;QAE3D,MAAM,mBAAmB,GAAG,OAAO,CAAC,OAAO;YACzC,CAAC,CAAC,iBAAiB,CAAC;gBAChB,UAAU,EAAE,MAAM,IAAI,gBAAgB,CAAC;oBACrC,UAAU,EAAE;wBACV,gBAAgB;wBAChB;4BACE,SAAS,EAAE,CAAC,MAAW,EAAE,EAAE,CACzB,OAAO,CACL,MAAM,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,UAAU,CACzD;4BACH,OAAO,EAAE,CAAC,MAAW,EAAE,EAAE;gCACvB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,WAAW,CAAC,EAAE,MAAM,IAAI,SAAS,CAAA;gCACzD,MAAM,IAAI,qBAAqB,CAC7B,sEAAsE,MAAM,GAAG,CAChF,CAAA;4BACH,CAAC;yBACF;qBACF;iBACF,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;gBACzB,QAAQ,EAAE,eAAe;aAC1B,CAAC;YACJ,CAAC,CAAC,SAAS,CAAA;QAEb,MAAM,cAAc,GAAG,IAAI,cAAc,CAAC,YAAY,EAAE;YACtD,sEAAsE;YACtE,uEAAuE;YACvE,gEAAgE;YAChE,OAAO,EAAE;gBACP,IAAI,0BAA0B,CAAC,EAAE,UAAU,EAAE,CAAC,gBAAgB,CAAC,EAAE,CAAC;aACnE;YACD,8BAA8B,EAAE,CAAC,KAAU,EAAE,EAAE;gBAC7C,IACE,KAAK,EAAE,IAAI,KAAK,uBAAuB;oBACvC,CAAC,KAAK,EAAE,MAAM;oBACd,KAAK,CAAC,MAAM,IAAI,GAAG,EACnB,CAAC;oBACD,MAAM,CAAC,KAAK,CACV,8CAA8C,EAC9C,KAAK,EAAE,KAAK,IAAI,KAAK,CACtB,CAAA;gBACH,CAAC;gBACD,OAAO;oBACL,KAAK,EAAE,KAAK,CAAC,OAAO;oBACpB,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI;oBACpC,uEAAuE;oBACvE,iEAAiE;oBACjE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,KAAK,SAAS;wBACnC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE;wBACjC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS;4BAChC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE;4BAChC,CAAC,CAAC,EAAE,CAAC;iBACV,CAAA;YACH,CAAC;YACD,iBAAiB,EAAE;gBACjB,KAAK,EAAE,OAAO,EAAE,EAAE;oBAChB,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;oBAChC,IAAI,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;wBAC9C,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAC1D,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAC/B,CAAA;oBACH,CAAC;oBACD,OAAO,GAAG,CAAA;gBACZ,CAAC;aACF;SACF,CAAC,CAAA;QACF,2EAA2E;QAC3E,2EAA2E;QAC3E,oCAAoC;QACpC,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,YAAY,CAAC,CAAA;QAE/C,MAAM,UAAU,GAAG,KAAK,EAAE,GAAY,EAA4B,EAAE;YAClE,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAA;YACrE,IAAI,CAAC,SAAS;gBAAE,OAAO,IAAI,CAAA;YAC3B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAA;YAClD,IACE,mBAAmB;gBACnB,GAAG,CAAC,QAAQ,KAAK,mBAAmB;gBACpC,GAAG,CAAC,MAAM,KAAK,KAAK,EACpB,CAAC;gBACD,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,mBAAmB,CAAC,EAAE;oBACvD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;iBAChD,CAAC,CAAA;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAC7B;gBACE,EAAE,EAAE,MAAM;gBACV,GAAG;gBACH,OAAO;gBACP,SAAS;gBACT,IAAI;gBACJ,QAAQ;gBACR,IAAI,EAAE,IAA+B;gBACrC,YAAY;gBACZ,MAAM;aACP,EACD,GAAG,CACJ,CAAA;YAED,IAAI,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,EAAE;oBACvC,MAAM,EAAE,UAAU;oBAClB,OAAO,EAAE,MAAM;iBAChB,CAAC,CAAA;gBACF,IAAI,GAAG,CAAC,OAAO;oBAAE,OAAO,GAAG,CAAC,QAAQ,CAAA;YACtC,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;YACxE,IAAI,UAAU,CAAC,OAAO;gBAAE,OAAO,UAAU,CAAC,QAAQ,CAAA;YAElD,OAAO,IAAI,CAAA;QACb,CAAC,CAAA;QAED,MAAM,OAAO,GAAG,YAAY,CAAC;YAC3B,WAAW,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YACvC,UAAU;YACV,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC,CAAA;QAEF,0EAA0E;QAC1E,0DAA0D;QAC1D,MAAM,eAAe,GACnB,GAAG,CAAC,gBAAgB,KAAK,KAAK,IAAI,GAAG,CAAC,gBAAgB,KAAK,QAAQ,CAAA;QACrE,MAAM,SAAS,GACb,SAAS,CAAC,mBAAmB,KAAK,KAAK;YACrC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,SAAS;gBAC9B,CAAC,eAAe,IAAI,YAAY,KAAK,SAAS,CAAC,CAAC,CAAA;QACtD,IAAI,iBAAiB,GAAG,KAAK,CAAA;QAC7B,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,WAAW,EAAE,CAAA;YACnB,iBAAiB,GAAG,IAAI,CAAA;QAC1B,CAAC;QAED,MAAM,GAAG,GAUL;YACF,OAAO;YACP,0EAA0E;YAC1E,EAAE,EAAE,MAAM;YACV,IAAI;YACJ,OAAO;YACP,GAAG;YACH,SAAS;YACT,QAAQ;YACR,yEAAyE;YACzE,2EAA2E;YAC3E,qBAAqB;YACrB,IAAI,EAAE,IAAa;YACnB,WAAW;YACX,SAAS;YACT,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE;YAC9B,iBAAiB;YACjB,IAAI,MAAM;gBACR,OAAO,SAAS,CAAC,MAAM,CAAA;YACzB,CAAC;YACD,MAAM,EAAE,SAAS,CAAC,MAAM;SACzB,CAKA;QAAC,GAA8B,CAAC,mBAAmB,CAAC,GAAG;YACtD,EAAE;YACF,MAAM,EAAE,YAAY;YACpB,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG;YAChC,gBAAgB,EAAE,MAAM,CAAC,QAAQ,CAAC,UAAU;YAC5C,OAAO;YACP,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,OAAO;SACjC,CAAA;QAED,OAAO,GAAG,CAAA;IACZ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC;YACH,MAAM,SAAS,CAAC,KAAK,EAAE,CAAA;QACzB,CAAC;QAAC,OAAO,YAAY,EAAE,CAAC;YACtB,MAAM,IAAI,cAAc,CACtB,CAAC,KAAK,EAAE,YAAY,CAAC,EACrB,oEAAoE,CACrE,CAAA;QACH,CAAC;QACD,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC;AAED,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAG1C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAA;AAE3C,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AASvE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAEzE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAGzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAA;AAoBhD,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,wBAAwB,EACxB,WAAW,EACX,gBAAgB,GACjB,MAAM,UAAU,CAAA;AAWjB,OAAO,EACL,MAAM,EACN,QAAQ,IAAI,cAAc,EAC1B,KAAK,IAAI,WAAW,EACpB,QAAQ,GACT,MAAM,UAAU,CAAA;AAgBjB,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAA;AAOxD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAY3D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,2BAA2B,GAC5B,MAAM,gBAAgB,CAAA;AACvB,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA","sourcesContent":["import type { AnyRouter as AnyORPCRouter } from '@orpc/server'\n// src/runtime.ts\nimport type { Auth } from 'better-auth'\n\nimport { SmartCoercionHandlerPlugin } from '@orpc/json-schema'\nimport { OpenAPIGenerator, OpenAPIGeneratorError } from '@orpc/openapi'\nimport { OpenAPIHandler } from '@orpc/openapi/fetch'\nimport { RPCHandler } from '@orpc/server/fetch'\nimport { ValibotToJsonSchemaConverter } from '@orpc/valibot'\n\nimport type { AuthSessionResolver, SessionUserConfig } from './access'\nimport type { TableAccessInput } from './access'\nimport type { RealtimeApiRouter } from './api/realtime-router'\nimport type {\n CrudApiRouterFor,\n MergeApiRouterTypes,\n UnifiedApiRouter,\n} from './api/types'\nimport type { RuntimeTestingHandle } from './backend-internals'\nimport type { DatabaseConnection } from './database/adapter'\nimport type { DbFor } from './db'\nimport type { EmailFacade } from './email'\nimport type {\n BunderstackJobsBuilder,\n EnqueueOptions,\n JobsDefs,\n JobsFacade,\n StartWorkerOptions,\n WorkerHandle,\n} from './jobs/index'\nimport type { MessagingConfig, MessagingFacadesFor } from './messaging'\nimport type { MessagingAdapter } from './messaging/runtime'\nimport type {\n ResolvedStorageBuckets,\n StorageConfigInput,\n} from './storage/buckets'\nimport type { StorageAdapter } from './storage/index'\n\nimport { validateAndResolveAccess } from './access'\nimport { createApiContext } from './api/context'\nimport { buildCrudApiRouter } from './api/crud-router'\nimport { mergeOpenAPISpecs } from './api/openapi'\nimport { buildRealtimeApiRouter } from './api/realtime-router'\nimport { buildApiRegistry, normalizeForeignOpenAPISpec } from './api/registry'\nimport { buildApiRouter } from './api/router'\nimport { buildStorageApiRouter } from './api/storage-router'\nimport {\n createAuth,\n type BunderstackAuth,\n missingAuthModels,\n toAuthSessionResolver,\n withEmailAuthDefaults,\n} from './auth'\nimport {\n resolveConfig,\n type BetterAuthConfig,\n type BunderstackConfig,\n} from './config'\nimport { resolveAuthConfig, resolveRealtimeRedisUrl } from './config'\nimport { createDb } from './db'\nimport { detectDialect } from './dialect'\nimport { type EnvConfigInput, type ValidatedEnv } from './env'\nimport { buildHandler } from './handler'\nimport { withInternalTables } from './internal-tables'\nimport { createJobRunner, enqueueJob, startJobWorker } from './jobs/index'\nimport { Lifecycle, type LifecycleStatus } from './lifecycle'\nimport { consoleLogger, type BunderstackLogger } from './logging'\nimport { createMessaging } from './messaging/runtime'\nimport {\n PROVISION_INTERNALS,\n type WithProvisionInternals,\n} from './provision-internals'\nimport { buildReadinessReport } from './readiness'\nimport { createReadinessProbes } from './readiness-probes'\nimport {\n createRealtimeFacade,\n type RealtimeFacade,\n type RealtimeTransport,\n} from './realtime/facade'\nimport {\n createMemoryRealtimePublisher,\n createRedisRealtimePublisher,\n} from './realtime/publisher'\nimport {\n STORAGE_SWEEP_JOB_NAME,\n STORAGE_SWEEP_SCHEDULE,\n} from './storage/background'\nimport { deleteFileWithDerivatives } from './storage/delete'\nimport { deleteFileMetaRow, insertReadyFile } from './storage/file-meta'\nimport { createStorageOperations } from './storage/operations'\nimport { createBucketStorages } from './storage/registry'\nimport { sweepOrphans } from './storage/sweep'\n\n/** Base Better Auth contract used by framework internals and API context. */\nexport type AuthInstance = Auth\n\nexport type RuntimeOverrides = {\n database?: DatabaseConnection\n resolvedStorage?: ResolvedStorageBuckets\n messagingAdapters?: Record<string, MessagingAdapter>\n forceMemoryRealtime?: boolean\n backgroundAutoStart?: false\n authResolver?: AuthSessionResolver\n logger?: BunderstackLogger\n /** Private callback used by backend.test(); never exposed on the app. */\n captureTestingHandle?: (handle: RuntimeTestingHandle) => void\n}\n\nfunction waitForWorkerShutdown(\n signal: AbortSignal,\n installProcessListeners: boolean,\n): Promise<void> {\n if (signal.aborted) return Promise.resolve()\n\n return new Promise((resolve) => {\n const done = () => {\n signal.removeEventListener('abort', done)\n if (installProcessListeners) {\n process.removeListener('SIGINT', done)\n process.removeListener('SIGTERM', done)\n }\n resolve()\n }\n signal.addEventListener('abort', done, { once: true })\n if (installProcessListeners) {\n process.once('SIGINT', done)\n process.once('SIGTERM', done)\n }\n })\n}\n\n/** Default age before an unconfirmed `pending` file is treated as an orphan. */\nconst DEFAULT_PENDING_TTL_MS = 30 * 60_000\n/**\n * Public storage facade exposed as `app.storage`. Object-level operations live\n * on the per-bucket adapters; this surface offers the app-wide deletes that\n * must also clean the file-meta row.\n */\nexport interface StorageFacade {\n /** Delete a file row and purge all underlying storage derivatives. */\n delete(fileId: string): Promise<void>\n /** Low-level access to the underlying storage adapter for a bucket. */\n bucket(name: string): StorageAdapter | undefined\n /**\n * Reap stale `pending` uploads older than `olderThanMs` (default 30m). Runs\n * only when explicitly invoked by the host or local scheduler. Returns\n * the count reaped.\n */\n sweep(olderThanMs?: number): Promise<number>\n /**\n * Get a public or presigned download URL for a file key.\n * Returns a presigned S3 URL when S3 is configured, or local proxy route `/api/files/...` in development.\n */\n getUrl(\n key: string,\n opts?: { bucket?: string; expiresIn?: number },\n ): Promise<string>\n /**\n * Upload bytes as a ready file and register it in file_meta so it is\n * accessible via `GET /api/files/<key>`. Use this for server-generated\n * files (e.g. generated PDFs) that are not uploaded by end-users.\n */\n upload(\n key: string,\n body: ArrayBuffer | Uint8Array,\n contentType: string,\n opts?: { ownerId?: string; filename?: string },\n ): Promise<void>\n}\n\nexport type AppStartWorkerOptions = Omit<StartWorkerOptions, 'tick' | 'drain'>\nexport type AppRunWorkerOptions = AppStartWorkerOptions & {\n /**\n * Permit process-local realtime in a standalone worker.\n *\n * Use only when job handlers never call ctx.realtime.publish(). Publications\n * made through the memory broker cannot reach SSE clients in another process.\n */\n allowProcessLocalRealtime?: boolean\n}\n/** Bucket names declared in a storage config; `string` when unknowable. */\nexport type BucketNamesOf<TStorage> = TStorage extends {\n buckets: infer B extends Record<string, unknown>\n}\n ? keyof B & string\n : string\n\nexport type BunderstackApp<\n TSchema extends Record<string, unknown>,\n TAccess extends Record<string, TableAccessInput> | undefined = undefined,\n TBuckets extends string = string,\n TEnv extends EnvConfigInput | undefined = undefined,\n TJobsDefs extends JobsDefs | undefined = undefined,\n TCustomApiRouter extends AnyORPCRouter | undefined = undefined,\n TRealtime = undefined,\n TMessaging extends MessagingConfig | undefined = undefined,\n TAuthConfig extends BetterAuthConfig = BetterAuthConfig,\n> = {\n handler: (req: Request) => Promise<Response>\n db: DbFor<TSchema>\n auth: BunderstackAuth<TAuthConfig>\n storage: StorageFacade\n /** Validated env: bunderstack's base vars plus the config's `env` extension. */\n env: ValidatedEnv<TEnv>\n /** Named, provider-specific outbound messaging channels. */\n messaging: MessagingFacadesFor<TMessaging>\n /** Job queue facade; always present — enqueue throws when jobs aren't configured. */\n jobs: JobsFacade<\n TJobsDefs extends JobsDefs ? TJobsDefs : Record<never, never>\n >\n /** Typed custom row publication; enabled=false/no-op when realtime is off. */\n realtime: RealtimeFacade<TSchema>\n startWorker(options?: AppStartWorkerOptions): Promise<WorkerHandle>\n /** Run a queue worker until aborted, then close the application. */\n runWorker(options?: AppRunWorkerOptions): Promise<void>\n close(): Promise<void>\n /** True when this process is running the background tick loop. */\n readonly backgroundRunning: boolean\n readonly status: LifecycleStatus\n readonly signal: AbortSignal\n /**\n * Type-only carrier for client inference (`createClient<typeof app>()`).\n * Never assigned at runtime.\n */\n readonly $inferClient?: {\n schema: TSchema\n access: TAccess\n buckets: TBuckets\n api: MergeApiRouterTypes<\n UnifiedApiRouter<\n CrudApiRouterFor<\n TSchema,\n TAccess,\n [TRealtime] extends [false | undefined] ? false : true\n >,\n TCustomApiRouter\n >,\n [TRealtime] extends [false | undefined] ? {} : RealtimeApiRouter\n >\n }\n}\n\nexport function materializeBunderstack<\n TSchema extends Record<string, unknown>,\n const TAccess extends Record<string, TableAccessInput> | undefined =\n undefined,\n const TStorage extends StorageConfigInput | undefined = undefined,\n const TEnv extends EnvConfigInput | undefined = undefined,\n const TJobsDefs extends JobsDefs | undefined = undefined,\n TCustomApiRouter extends AnyORPCRouter | undefined = undefined,\n const TRealtime extends BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter\n >['realtime'] = undefined,\n const TMessaging extends MessagingConfig | undefined = undefined,\n const TAuthConfig extends BetterAuthConfig = BetterAuthConfig,\n const TSession extends\n | SessionUserConfig<Record<string, unknown>>\n | undefined = undefined,\n>(\n options: BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter,\n TAuthConfig,\n TSession\n > & {\n realtime?: TRealtime\n messaging?: TMessaging\n jobs?:\n | TJobsDefs\n | ((\n j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>, TMessaging>,\n ) => TJobsDefs)\n },\n source: Record<string, string | undefined>,\n overrides?: RuntimeOverrides,\n env?: ValidatedEnv<TEnv>,\n): Promise<\n BunderstackApp<\n TSchema,\n TAccess,\n BucketNamesOf<TStorage>,\n TEnv,\n TJobsDefs,\n TCustomApiRouter,\n TRealtime,\n TMessaging,\n TAuthConfig\n >\n>\nexport async function materializeBunderstack<\n TSchema extends Record<string, unknown>,\n const TAccess extends Record<string, TableAccessInput> | undefined =\n undefined,\n const TStorage extends StorageConfigInput | undefined = undefined,\n const TEnv extends EnvConfigInput | undefined = undefined,\n TCustomApiRouter extends AnyORPCRouter | undefined = undefined,\n const TRealtime extends BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter\n >['realtime'] = undefined,\n const TMessaging extends MessagingConfig | undefined = undefined,\n const TAuthConfig extends BetterAuthConfig = BetterAuthConfig,\n const TSession extends\n | SessionUserConfig<Record<string, unknown>>\n | undefined = undefined,\n>(\n options: BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter,\n TAuthConfig,\n TSession\n > & {\n realtime?: TRealtime\n messaging?: TMessaging\n jobs?:\n | JobsDefs\n | ((\n j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>, TMessaging>,\n ) => JobsDefs)\n },\n source: Record<string, string | undefined>,\n overrides: RuntimeOverrides = {},\n inspectedEnv?: ValidatedEnv<TEnv>,\n): Promise<\n BunderstackApp<\n TSchema,\n TAccess,\n BucketNamesOf<TStorage>,\n TEnv,\n JobsDefs | undefined,\n TCustomApiRouter,\n TRealtime,\n TMessaging,\n TAuthConfig\n >\n> {\n const logger = overrides.logger ?? consoleLogger\n const dialect = detectDialect(options.schema)\n const jobsDefs = options.jobs as JobsDefs | undefined\n if (!inspectedEnv) {\n throw new Error('[bunderstack] runtime requires an inspected environment')\n }\n const env = inspectedEnv\n const resolvedConfig = resolveConfig(options, env, source)\n const config = {\n ...resolvedConfig,\n database: overrides.database\n ? { ...resolvedConfig.database, ...overrides.database }\n : resolvedConfig.database,\n storage: overrides.resolvedStorage ?? resolvedConfig.storage,\n }\n // Merge bunderstack's internal tables (file-meta, idempotency) into the\n // schema used for the db client + provisioning. CRUD/access stay on the USER\n // schema so internal tables never get a CRUD route.\n const mergedSchema = withInternalTables(options.schema)\n const lifecycle = new Lifecycle()\n const {\n db,\n driver,\n close: closeDatabase,\n } = await createDb(mergedSchema, {\n ...config.database,\n dialect,\n })\n const messaging = createMessaging(\n (options.messaging ?? {}) as MessagingConfig,\n {\n env,\n db,\n adapterOverrides: overrides.messagingAdapters,\n },\n ) as MessagingFacadesFor<TMessaging>\n if (closeDatabase) lifecycle.add(closeDatabase)\n try {\n // `db` is typed with the merged schema (user tables + internal tables) so the\n // storage/idempotency code can query the internal tables. The public surface\n // and CRUD only expose the USER schema. TS can widen the merged-schema db type\n // on its own (storage/auth pass `db` directly), but it can't *narrow* a\n // generic schema view, so this single intentional cast produces the\n // user-facing, per-dialect db type. See `app.db` / crud below.\n const userDb = db as unknown as DbFor<TSchema>\n // An `auth` builder gets the user-facing db, so better-auth hooks in another\n // file can write through the app's own connection without importing the app.\n const authConfig = resolveAuthConfig(config.auth, { db: userDb, env })\n const authEmail =\n options.messaging?.email?.kind === 'email'\n ? ((messaging as Record<string, unknown>).email as EmailFacade)\n : undefined\n const auth = createAuth<TAuthConfig>(\n db,\n withEmailAuthDefaults(\n authConfig,\n authEmail ?? ({ send: async () => ({}) } satisfies EmailFacade),\n Boolean(authEmail),\n ),\n dialect,\n options.schema as Record<string, unknown>,\n )\n // Internal routers consume the narrow AuthSessionResolver contract, not the\n // raw better-auth instance. app.auth still exposes `auth` unchanged. An app\n // whose schema declares no better-auth models gets no resolver at all, so\n // every session resolves to null instead of hitting the drizzle adapter.\n const missingModels = missingAuthModels(\n options.schema as Record<string, unknown>,\n authConfig,\n )\n if (missingModels.length > 0 && options.auth !== undefined) {\n logger.warn(\n `[bunderstack] auth is configured, but the schema is ` +\n `missing better-auth tables: ${missingModels\n .map((model) => `\\`${model}\\``)\n .join(', ')}. Every session resolves to null until they are ` +\n `part of the schema.`,\n )\n }\n const declaredAuthResolver =\n options.authResolver ??\n (missingModels.length === 0\n ? toAuthSessionResolver(auth as unknown as Auth, options.session)\n : undefined)\n const authResolver = overrides.authResolver\n ? {\n api: {\n async getSession({ headers }: { headers: Headers }) {\n return (\n (await overrides.authResolver!.api.getSession({ headers })) ??\n (await declaredAuthResolver?.api.getSession({ headers })) ??\n null\n )\n },\n },\n }\n : declaredAuthResolver\n const resolvedAccess = validateAndResolveAccess(\n options.schema,\n options.access,\n )\n const realtimeBufferSize =\n typeof config.realtime === 'object'\n ? config.realtime.bufferSize\n : undefined\n const realtimeResumeSeconds =\n typeof config.realtime === 'object'\n ? config.realtime.resumeSeconds\n : undefined\n const configuredRedisUrl = config.realtime\n ? resolveRealtimeRedisUrl(config.realtime, env, source)\n : undefined\n const redisUrl = overrides.forceMemoryRealtime\n ? undefined\n : configuredRedisUrl\n const publisher = config.realtime\n ? redisUrl\n ? (() => {\n const redis = new Bun.RedisClient(redisUrl)\n const subscriber = redis.duplicate()\n lifecycle.add(async () => {\n redis.close()\n ;(await subscriber).close()\n })\n return createRedisRealtimePublisher(redis, subscriber, {\n prefix: source.BUNDERSTACK_REALTIME_PREFIX ?? 'bunderstack:',\n maxBufferedEvents: realtimeBufferSize,\n resumeSeconds: realtimeResumeSeconds,\n })\n })()\n : createMemoryRealtimePublisher({\n maxBufferedEvents: realtimeBufferSize,\n resumeSeconds: realtimeResumeSeconds,\n })\n : undefined\n const runtimeRealtimeTransport: RealtimeTransport = !publisher\n ? 'disabled'\n : redisUrl\n ? 'redis'\n : 'memory'\n const realtime = createRealtimeFacade<TSchema>(\n publisher,\n runtimeRealtimeTransport,\n options.schema,\n )\n const registry = createBucketStorages(config.storage)\n const storageOperations = createStorageOperations({\n registry,\n db,\n })\n const storageApiRouter = buildStorageApiRouter(registry, storageOperations)\n const realtimeApiRouter = buildRealtimeApiRouter(publisher, resolvedAccess)\n const storage: StorageFacade = {\n async delete(fileId) {\n const bucketName = fileId.split('/')[0] ?? ''\n const entry = registry.get(bucketName)\n if (entry) {\n await deleteFileWithDerivatives(entry.adapter, db, fileId)\n } else {\n // Unknown bucket: no adapter to clean, but still drop the meta row.\n await deleteFileMetaRow(db, fileId)\n }\n },\n bucket(name) {\n return registry.get(name)?.adapter\n },\n sweep(olderThanMs = DEFAULT_PENDING_TTL_MS) {\n return sweepOrphans(registry, db, olderThanMs)\n },\n async getUrl(key, opts = {}) {\n const bucketName =\n opts.bucket ?? key.split('/')[0] ?? config.storage.defaultBucket\n const adapter = registry.get(bucketName)?.adapter\n if (adapter?.presignGet) {\n return adapter.presignGet(key, {\n expiresIn: opts.expiresIn ?? 3600,\n })\n }\n return `/api/files/${key}`\n },\n async upload(key, body, contentType, opts = {}) {\n const bucketName = key.split('/')[0] ?? ''\n const adapter = registry.get(bucketName)?.adapter\n if (!adapter) throw new Error(`Unknown bucket: ${bucketName}`)\n const u8 = body instanceof Uint8Array ? body : new Uint8Array(body)\n const buf: ArrayBuffer = u8.buffer.slice(\n u8.byteOffset,\n u8.byteOffset + u8.byteLength,\n ) as ArrayBuffer\n await adapter.upload(key, buf, contentType)\n await insertReadyFile(db, {\n fileId: key,\n bucket: bucketName,\n ownerId: opts.ownerId ?? null,\n scopeJson: null,\n filename: opts.filename ?? key.split('/').at(-1) ?? null,\n contentType,\n size: buf.byteLength,\n })\n },\n }\n const storageConfigured = Boolean(options.storage)\n // The storage sweep used to be a hardcoded maintenance route. It is an\n // ordinary cron now, so it inherits retries, timeout and onFailed.\n const resolvedDefs: JobsDefs | undefined = storageConfigured\n ? {\n ...jobsDefs,\n [STORAGE_SWEEP_JOB_NAME]: {\n kind: 'cron',\n schedule: STORAGE_SWEEP_SCHEDULE,\n handler: async () => {\n await storage.sweep()\n },\n },\n }\n : jobsDefs\n\n const jobRunner = resolvedDefs\n ? createJobRunner({\n db,\n defs: resolvedDefs,\n ctx: { db: userDb, env, messaging, storage, realtime },\n logger,\n })\n : undefined\n let enqueueNow: number | undefined\n const jobs = {\n async enqueue(name: string, input?: unknown, opts?: EnqueueOptions) {\n if (!resolvedDefs) {\n throw new Error(\n '[bunderstack] no jobs configured — add a `jobs` key to bunderstack',\n )\n }\n const result = await enqueueJob(\n db,\n resolvedDefs,\n name,\n input,\n opts,\n enqueueNow,\n )\n return result\n },\n tick(now?: number) {\n return jobRunner\n ? jobRunner.tick(now)\n : Promise.resolve({ claimed: 0, ran: 0, failed: 0 })\n },\n }\n if (jobRunner) jobRunner.setJobsFacade(jobs)\n overrides.captureTestingHandle?.({\n async tick(now) {\n const previous = enqueueNow\n enqueueNow = now\n try {\n return await jobs.tick(now)\n } finally {\n enqueueNow = previous\n }\n },\n inspect: (now) =>\n jobRunner\n ? jobRunner.inspect(now)\n : Promise.resolve({ runnable: 0, failed: [], jobs: [] }),\n })\n const startWorker = async (\n options: AppStartWorkerOptions = {},\n ): Promise<WorkerHandle> => {\n if (!jobRunner) {\n throw new Error('[bunderstack] no queue jobs configured')\n }\n if (lifecycle.status !== 'ready') {\n throw new Error('[bunderstack] application lifecycle is closed')\n }\n const signal = options.signal\n ? AbortSignal.any([lifecycle.signal, options.signal])\n : lifecycle.signal\n const handle = startJobWorker({\n ...options,\n signal,\n tick: (now) => jobRunner.pump(now),\n drain: () => jobRunner.drain(),\n })\n const unregister = lifecycle.add(() => handle.close())\n void handle.closed.finally(unregister)\n return handle\n }\n const runWorker = async (\n options: AppRunWorkerOptions = {},\n ): Promise<void> => {\n if (\n realtime.transport === 'memory' &&\n !options.allowProcessLocalRealtime\n ) {\n throw new Error(\n '[bunderstack] runWorker() cannot deliver realtime events through the in-memory broker. Configure REDIS_URL or realtime.redis, embed the worker with startWorker(), or pass allowProcessLocalRealtime: true only when jobs never publish realtime.',\n )\n }\n const {\n allowProcessLocalRealtime: _allowProcessLocalRealtime,\n ...workerOptions\n } = options\n const handle = await startWorker(workerOptions)\n try {\n const signal = workerOptions.signal\n ? AbortSignal.any([lifecycle.signal, workerOptions.signal])\n : lifecycle.signal\n await waitForWorkerShutdown(signal, !workerOptions.signal)\n } finally {\n await handle.close()\n await lifecycle.close()\n }\n }\n const crudApiRouter = buildCrudApiRouter<\n TSchema,\n TAccess,\n [TRealtime] extends [false | undefined] ? false : true\n >(options.schema, userDb, {\n access: resolvedAccess,\n idempotency: options.idempotency,\n realtime,\n livePublisher: publisher,\n })\n\n const customApiRouter = options.api as TCustomApiRouter | undefined\n\n const readinessProbes = createReadinessProbes(userDb)\n const queueJobsDeclared = Object.values(options.jobs ?? {}).some(\n (def) => def.kind === 'job',\n )\n const readiness = () =>\n buildReadinessReport({\n ...readinessProbes,\n queueJobsDeclared,\n ...(env.BUNDERSTACK_REVISION === undefined\n ? {}\n : { revision: env.BUNDERSTACK_REVISION }),\n })\n\n const nativeRouter = buildApiRouter({\n crud: crudApiRouter as Record<string, unknown>,\n storage: storageApiRouter as Record<string, unknown>,\n realtime: realtimeApiRouter as Record<string, unknown> | undefined,\n custom: customApiRouter as Record<string, unknown> | undefined,\n middleware: options.middleware,\n readiness,\n }) as any\n\n const authOpenAPISpecRaw =\n options.openapi &&\n auth.api &&\n 'generateOpenAPISchema' in auth.api &&\n typeof auth.api.generateOpenAPISchema === 'function'\n ? await auth.api.generateOpenAPISchema()\n : undefined\n\n const authOpenAPISpec = authOpenAPISpecRaw\n ? normalizeForeignOpenAPISpec(authOpenAPISpecRaw, {\n prefix: '/api/auth',\n source: 'auth',\n })\n : undefined\n\n await buildApiRegistry({\n nativeRouter,\n foreignSpecs: authOpenAPISpec ? [authOpenAPISpec] : [],\n reservedCoreHandles: new Set([\n 'health',\n 'readiness',\n ...(publisher ? ['realtime.changes'] : []),\n ...[...registry.keys()].flatMap((name) =>\n [\n 'prepareUpload',\n 'upload',\n 'confirmUpload',\n 'download',\n 'delete',\n ].map((operation) => `files.${name}.${operation}`),\n ),\n ]),\n })\n\n const valibotConverter = new ValibotToJsonSchemaConverter()\n\n const combinedOpenAPISpec = options.openapi\n ? mergeOpenAPISpecs({\n nativeSpec: await new OpenAPIGenerator({\n converters: [\n valibotConverter,\n {\n condition: (schema: any) =>\n Boolean(\n schema?.['~standard'] && !schema['~standard'].jsonSchema,\n ),\n convert: (schema: any) => {\n const vendor = schema?.['~standard']?.vendor ?? 'unknown'\n throw new OpenAPIGeneratorError(\n `No JSON Schema converter is configured for Standard Schema vendor \"${vendor}\"`,\n )\n },\n },\n ],\n }).generate(nativeRouter),\n authSpec: authOpenAPISpec,\n })\n : undefined\n\n const openapiHandler = new OpenAPIHandler(nativeRouter, {\n // Query strings and form bodies are strings; this coerces them to the\n // types each procedure's input schema declares, so schemas stay honest\n // (`v.number()`, not a string-union pipe) and REST matches RPC.\n plugins: [\n new SmartCoercionHandlerPlugin({ converters: [valibotConverter] }),\n ],\n customErrorResponseBodyEncoder: (error: any) => {\n if (\n error?.code === 'INTERNAL_SERVER_ERROR' ||\n !error?.status ||\n error.status >= 500\n ) {\n logger.error(\n '[bunderstack-api] 500 Internal Server Error:',\n error?.cause ?? error,\n )\n }\n return {\n error: error.message,\n code: error.data?.code ?? error.code,\n // oRPC reports schema failures as `data.issues`; forwarding them tells\n // the client which field was rejected instead of just \"invalid\".\n ...(error.data?.details !== undefined\n ? { details: error.data.details }\n : error.data?.issues !== undefined\n ? { details: error.data.issues }\n : {}),\n }\n },\n fetchInterceptors: [\n async (options) => {\n const res = await options.next()\n if (res.matched && options.context.resHeaders) {\n options.context.resHeaders.forEach((v: string, k: string) =>\n res.response.headers.set(k, v),\n )\n }\n return res\n },\n ],\n })\n // No custom error encoding here: the RPC protocol owns its error body, and\n // `mapBunderstackErrors` already logs unhandled procedure errors for every\n // transport before rethrowing them.\n const rpcHandler = new RPCHandler(nativeRouter)\n\n const apiHandler = async (req: Request): Promise<Response | null> => {\n const urlString = typeof req === 'string' ? (req as string) : req.url\n if (!urlString) return null\n const url = new URL(urlString, 'http://localhost')\n if (\n combinedOpenAPISpec &&\n url.pathname === '/api/openapi.json' &&\n req.method === 'GET'\n ) {\n return new Response(JSON.stringify(combinedOpenAPISpec), {\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n const apiCtx = createApiContext(\n {\n db: userDb,\n env,\n storage,\n messaging,\n jobs,\n realtime,\n auth: auth as unknown as AuthInstance,\n authResolver,\n logger,\n },\n req,\n )\n\n if (url.pathname.startsWith('/api/rpc')) {\n const res = await rpcHandler.handle(req, {\n prefix: '/api/rpc',\n context: apiCtx,\n })\n if (res.matched) return res.response\n }\n\n const openapiRes = await openapiHandler.handle(req, { context: apiCtx })\n if (openapiRes.matched) return openapiRes.response\n\n return null\n }\n\n const handler = buildHandler({\n authHandler: (req) => auth.handler(req),\n apiHandler,\n rateLimit: options.rateLimit,\n })\n\n // Topology is a deployment concern: the role decides whether this process\n // runs background work, so application code never has to.\n const roleWantsWorker =\n env.BUNDERSTACK_ROLE === 'all' || env.BUNDERSTACK_ROLE === 'worker'\n const autoStart =\n overrides.backgroundAutoStart === false\n ? false\n : (options.background?.autoStart ??\n (roleWantsWorker && resolvedDefs !== undefined))\n let backgroundRunning = false\n if (autoStart) {\n await startWorker()\n backgroundRunning = true\n }\n\n const app: BunderstackApp<\n TSchema,\n TAccess,\n BucketNamesOf<TStorage>,\n TEnv,\n JobsDefs | undefined,\n TCustomApiRouter,\n TRealtime,\n TMessaging,\n TAuthConfig\n > = {\n handler,\n // Internal tables live on the runtime db but stay out of the public type.\n db: userDb,\n auth,\n storage,\n env,\n messaging,\n realtime,\n // Runtime facade is untyped (JobsRuntimeFacade); the generic-typed field\n // narrows `enqueue` per-app from the declared job defs — same relationship\n // as `userDb` above.\n jobs: jobs as never,\n startWorker,\n runWorker,\n close: () => lifecycle.close(),\n backgroundRunning,\n get status() {\n return lifecycle.status\n },\n signal: lifecycle.signal,\n }\n\n // Hidden handle for the optional `bunderstack/provision` entry. Kept off the\n // public type so provisioning stays opt-in (and drizzle-kit out of this\n // module graph).\n ;(app as WithProvisionInternals)[PROVISION_INTERNALS] = {\n db,\n schema: mergedSchema,\n databaseUrl: config.database.url,\n migrationsFolder: config.database.migrations,\n dialect,\n driver,\n adapter: config.database.adapter,\n }\n\n return app\n } catch (cause) {\n try {\n await lifecycle.close()\n } catch (cleanupCause) {\n throw new AggregateError(\n [cause, cleanupCause],\n '[bunderstack] application initialization failed and cleanup failed',\n )\n }\n throw cause\n }\n}\n\nexport { listSpec } from './api/list-spec'\nexport type { ListSpecOptions } from './api/list-spec'\nexport type { BunderstackDb, BunderstackTx } from './db'\nexport { MAX_LIST_LIMIT } from './list-query'\nexport { BunderstackError } from './errors'\nexport type { BunderstackErrorCode } from './errors'\nexport { resolveConfig, resolveAuthConfig, defineAuth } from './config'\nexport type {\n AuthConfigContext,\n AuthConfigFactory,\n AuthConfigInput,\n BetterAuthConfig,\n BunderstackConfig,\n ResolvedConfig,\n} from './config'\nexport { validateEnv, createClientEnv, BunderstackEnvError } from './env'\nexport type { EnvConfigInput, BaseEnv, ValidatedEnv } from './env'\nexport { buildManifest, parseManifest } from './manifest'\nexport type { BunderstackManifest, ManifestEnvVar } from './manifest'\nexport type { EmailMessage, EmailAdapter } from './email'\nexport { createJobsBuilder } from './jobs/index'\nexport type {\n BunderstackJobContext,\n BunderstackJobsBuilder,\n BackgroundDefinition,\n BackgroundDefs,\n CronDefinition,\n CronInvocation,\n EnqueueOptions,\n JobContext,\n JobDefinition,\n JobsDefs,\n JobsFacade,\n JobsRuntimeFacade,\n QueueJobDefinition,\n QueueJobKeys,\n RunWorkerOptions,\n StartWorkerOptions,\n WorkerHandle,\n} from './jobs/index'\nexport {\n defineSessionUser,\n defineAccess,\n validateAndResolveAccess,\n checkAccess,\n AUTH_TABLE_NAMES,\n} from './access'\nexport type {\n TableAccessInput,\n OperationRule,\n AccessContext,\n AccessUser,\n AccessUserBase,\n SessionUserConfig,\n SessionUserExtraOf,\n SessionUserSource,\n} from './access'\nexport {\n typeid,\n generate as generateTypeId,\n parse as parseTypeId,\n asTypeId,\n} from './typeid'\nexport type { TypeId } from './typeid'\nexport type {\n DatabaseAdapter,\n DatabaseConnection,\n DatabaseConnectionResult,\n} from './database/adapter'\nexport type { StorageAdapter } from './storage/index'\nexport type {\n StorageConfigInput,\n BucketConfigInput,\n ResolvedBucket,\n} from './storage/buckets'\n// StorageFacade is declared+exported inline above.\nexport type { TransformSpec } from './storage/thumbnails'\nexport type { RealtimeAction } from './realtime/publisher'\nexport { createRealtimeFacade } from './realtime/facade'\nexport type {\n RealtimeFacade,\n RealtimeTransport,\n SchemaTable,\n} from './realtime/facade'\n\nexport { createApiBuilder, defineApi } from './api/builder'\nexport type { BunderstackApiBuilder, ApiFactory } from './api/builder'\n// Needed to declare shared middleware over the app's context, e.g.\n// `os.$context<ApiContext<typeof schema>>().middleware(...)`.\nexport type { ApiContext } from './api/context'\nexport type {\n CrudApiRouterFor,\n ExposedApiTables,\n MergeApiRouterTypes,\n UnifiedApiRouter,\n} from './api/types'\nexport type { TableCrudProcedures } from './api/crud-router'\nexport {\n buildApiRegistry,\n mergeApiRoutersStrict,\n normalizeApiPath,\n normalizeForeignOpenAPISpec,\n} from './api/registry'\nexport { mergeOpenAPISpecs } from './api/openapi'\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AnyRouter as AnyORPCRouter } from '@orpc/server'\n// src/runtime.ts\nimport type { Auth } from 'better-auth'\n\nimport { SmartCoercionHandlerPlugin } from '@orpc/json-schema'\nimport { OpenAPIGenerator, OpenAPIGeneratorError } from '@orpc/openapi'\nimport { OpenAPIHandler } from '@orpc/openapi/fetch'\nimport { RPCHandler } from '@orpc/server/fetch'\nimport { ValibotToJsonSchemaConverter } from '@orpc/valibot'\n\nimport type { AuthSessionResolver, SessionUserConfig } from './access'\nimport type { TableAccessInput } from './access'\nimport type { RealtimeApiRouter } from './api/realtime-router'\nimport type {\n CrudApiRouterFor,\n MergeApiRouterTypes,\n UnifiedApiRouter,\n} from './api/types'\nimport type { RuntimeTestingHandle } from './backend-internals'\nimport type { DatabaseConnection } from './database/adapter'\nimport type { DbFor } from './db'\nimport type { EmailFacade } from './email'\nimport type {\n BunderstackJobsBuilder,\n EnqueueOptions,\n JobsDefs,\n JobsFacade,\n StartWorkerOptions,\n WorkerHandle,\n} from './jobs/index'\nimport type { MessagingConfig, MessagingFacadesFor } from './messaging'\nimport type { MessagingAdapter } from './messaging/runtime'\nimport type {\n ResolvedStorageBuckets,\n StorageConfigInput,\n} from './storage/buckets'\nimport type { StorageAdapter } from './storage/index'\n\nimport { validateAndResolveAccess } from './access'\nimport { createApiContext } from './api/context'\nimport { buildCrudApiRouter } from './api/crud-router'\nimport { mergeOpenAPISpecs } from './api/openapi'\nimport { buildRealtimeApiRouter } from './api/realtime-router'\nimport { buildApiRegistry, normalizeForeignOpenAPISpec } from './api/registry'\nimport { buildApiRouter } from './api/router'\nimport { buildStorageApiRouter } from './api/storage-router'\nimport {\n createAuth,\n type BunderstackAuth,\n missingAuthModels,\n toAuthSessionResolver,\n withEmailAuthDefaults,\n} from './auth'\nimport {\n resolveConfig,\n type BetterAuthConfig,\n type BunderstackConfig,\n} from './config'\nimport { resolveAuthConfig, resolveRealtimeRedisUrl } from './config'\nimport { createDb } from './db'\nimport { detectDialect } from './dialect'\nimport { type EnvConfigInput, type ValidatedEnv } from './env'\nimport { buildHandler } from './handler'\nimport { withInternalTables } from './internal-tables'\nimport { createJobRunner, enqueueJob, startJobWorker } from './jobs/index'\nimport { Lifecycle, type LifecycleStatus } from './lifecycle'\nimport { consoleLogger, type BunderstackLogger } from './logging'\nimport { createMessaging } from './messaging/runtime'\nimport {\n PROVISION_INTERNALS,\n type WithProvisionInternals,\n} from './provision-internals'\nimport { buildReadinessReport } from './readiness'\nimport { createReadinessProbes } from './readiness-probes'\nimport {\n createRealtimeFacade,\n type RealtimeFacade,\n type RealtimeTransport,\n} from './realtime/facade'\nimport {\n createMemoryRealtimePublisher,\n createRedisRealtimePublisher,\n} from './realtime/publisher'\nimport {\n STORAGE_SWEEP_JOB_NAME,\n STORAGE_SWEEP_SCHEDULE,\n} from './storage/background'\nimport { deleteFileWithDerivatives } from './storage/delete'\nimport { deleteFileMetaRow, insertReadyFile } from './storage/file-meta'\nimport { createStorageOperations } from './storage/operations'\nimport { createBucketStorages } from './storage/registry'\nimport { sweepOrphans } from './storage/sweep'\n\n/** Base Better Auth contract used by framework internals and API context. */\nexport type AuthInstance = Auth\n\nexport type RuntimeOverrides = {\n database?: DatabaseConnection\n resolvedStorage?: ResolvedStorageBuckets\n messagingAdapters?: Record<string, MessagingAdapter>\n forceMemoryRealtime?: boolean\n backgroundAutoStart?: false\n authResolver?: AuthSessionResolver\n logger?: BunderstackLogger\n /** Private callback used by backend.test(); never exposed on the app. */\n captureTestingHandle?: (handle: RuntimeTestingHandle) => void\n}\n\nfunction waitForWorkerShutdown(\n signal: AbortSignal,\n installProcessListeners: boolean,\n): Promise<void> {\n if (signal.aborted) return Promise.resolve()\n\n return new Promise((resolve) => {\n const done = () => {\n signal.removeEventListener('abort', done)\n if (installProcessListeners) {\n process.removeListener('SIGINT', done)\n process.removeListener('SIGTERM', done)\n }\n resolve()\n }\n signal.addEventListener('abort', done, { once: true })\n if (installProcessListeners) {\n process.once('SIGINT', done)\n process.once('SIGTERM', done)\n }\n })\n}\n\n/** Default age before an unconfirmed `pending` file is treated as an orphan. */\nconst DEFAULT_PENDING_TTL_MS = 30 * 60_000\n/**\n * Public storage facade exposed as `app.storage`. Object-level operations live\n * on the per-bucket adapters; this surface offers the app-wide deletes that\n * must also clean the file-meta row.\n */\nexport interface StorageFacade {\n /** Delete a file row and purge all underlying storage derivatives. */\n delete(fileId: string): Promise<void>\n /** Low-level access to the underlying storage adapter for a bucket. */\n bucket(name: string): StorageAdapter | undefined\n /**\n * Reap stale `pending` uploads older than `olderThanMs` (default 30m). Runs\n * only when explicitly invoked by the host or local scheduler. Returns\n * the count reaped.\n */\n sweep(olderThanMs?: number): Promise<number>\n /**\n * Get a public or presigned download URL for a file key.\n * Returns a presigned S3 URL when S3 is configured, or local proxy route `/api/files/...` in development.\n */\n getUrl(\n key: string,\n opts?: { bucket?: string; expiresIn?: number },\n ): Promise<string>\n /**\n * Upload bytes as a ready file and register it in file_meta so it is\n * accessible via `GET /api/files/<key>`. Use this for server-generated\n * files (e.g. generated PDFs) that are not uploaded by end-users.\n */\n upload(\n key: string,\n body: ArrayBuffer | Uint8Array,\n contentType: string,\n opts?: { ownerId?: string; filename?: string },\n ): Promise<void>\n}\n\nexport type AppStartWorkerOptions = Omit<StartWorkerOptions, 'tick' | 'drain'>\nexport type AppRunWorkerOptions = AppStartWorkerOptions & {\n /**\n * Permit process-local realtime in a standalone worker.\n *\n * Use only when job handlers never call ctx.realtime.publish(). Publications\n * made through the memory broker cannot reach SSE clients in another process.\n */\n allowProcessLocalRealtime?: boolean\n}\n/** Bucket names declared in a storage config; `string` when unknowable. */\nexport type BucketNamesOf<TStorage> = TStorage extends {\n buckets: infer B extends Record<string, unknown>\n}\n ? keyof B & string\n : string\n\nexport type BunderstackApp<\n TSchema extends Record<string, unknown>,\n TAccess extends Record<string, TableAccessInput> | undefined = undefined,\n TBuckets extends string = string,\n TEnv extends EnvConfigInput | undefined = undefined,\n TJobsDefs extends JobsDefs | undefined = undefined,\n TCustomApiRouter extends AnyORPCRouter | undefined = undefined,\n TRealtime = undefined,\n TMessaging extends MessagingConfig | undefined = undefined,\n TAuthConfig extends BetterAuthConfig = BetterAuthConfig,\n> = {\n handler: (req: Request) => Promise<Response>\n db: DbFor<TSchema>\n auth: BunderstackAuth<TAuthConfig>\n storage: StorageFacade\n /** Validated env: bunderstack's base vars plus the config's `env` extension. */\n env: ValidatedEnv<TEnv>\n /** Named, provider-specific outbound messaging channels. */\n messaging: MessagingFacadesFor<TMessaging>\n /** Job queue facade; always present — enqueue throws when jobs aren't configured. */\n jobs: JobsFacade<\n TJobsDefs extends JobsDefs ? TJobsDefs : Record<never, never>\n >\n /** Typed custom row publication; enabled=false/no-op when realtime is off. */\n realtime: RealtimeFacade<TSchema>\n startWorker(options?: AppStartWorkerOptions): Promise<WorkerHandle>\n /** Run a queue worker until aborted, then close the application. */\n runWorker(options?: AppRunWorkerOptions): Promise<void>\n close(): Promise<void>\n /** True when this process is running the background tick loop. */\n readonly backgroundRunning: boolean\n readonly status: LifecycleStatus\n readonly signal: AbortSignal\n /**\n * Type-only carrier for client inference (`createClient<typeof app>()`).\n * Never assigned at runtime.\n */\n readonly $inferClient?: {\n schema: TSchema\n access: TAccess\n buckets: TBuckets\n api: MergeApiRouterTypes<\n UnifiedApiRouter<\n CrudApiRouterFor<\n TSchema,\n TAccess,\n [TRealtime] extends [false | undefined] ? false : true\n >,\n TCustomApiRouter\n >,\n [TRealtime] extends [false | undefined] ? {} : RealtimeApiRouter\n >\n }\n}\n\nexport function materializeBunderstack<\n TSchema extends Record<string, unknown>,\n const TAccess extends Record<string, TableAccessInput> | undefined =\n undefined,\n const TStorage extends StorageConfigInput | undefined = undefined,\n const TEnv extends EnvConfigInput | undefined = undefined,\n const TJobsDefs extends JobsDefs | undefined = undefined,\n TCustomApiRouter extends AnyORPCRouter | undefined = undefined,\n const TRealtime extends BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter\n >['realtime'] = undefined,\n const TMessaging extends MessagingConfig | undefined = undefined,\n const TAuthConfig extends BetterAuthConfig = BetterAuthConfig,\n const TSession extends\n | SessionUserConfig<Record<string, unknown>>\n | undefined = undefined,\n>(\n options: BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter,\n TAuthConfig,\n TSession\n > & {\n realtime?: TRealtime\n messaging?: TMessaging\n jobs?:\n | TJobsDefs\n | ((\n j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>, TMessaging>,\n ) => TJobsDefs)\n },\n source: Record<string, string | undefined>,\n overrides?: RuntimeOverrides,\n env?: ValidatedEnv<TEnv>,\n): Promise<\n BunderstackApp<\n TSchema,\n TAccess,\n BucketNamesOf<TStorage>,\n TEnv,\n TJobsDefs,\n TCustomApiRouter,\n TRealtime,\n TMessaging,\n TAuthConfig\n >\n>\nexport async function materializeBunderstack<\n TSchema extends Record<string, unknown>,\n const TAccess extends Record<string, TableAccessInput> | undefined =\n undefined,\n const TStorage extends StorageConfigInput | undefined = undefined,\n const TEnv extends EnvConfigInput | undefined = undefined,\n TCustomApiRouter extends AnyORPCRouter | undefined = undefined,\n const TRealtime extends BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter\n >['realtime'] = undefined,\n const TMessaging extends MessagingConfig | undefined = undefined,\n const TAuthConfig extends BetterAuthConfig = BetterAuthConfig,\n const TSession extends\n | SessionUserConfig<Record<string, unknown>>\n | undefined = undefined,\n>(\n options: BunderstackConfig<\n TSchema,\n TAccess,\n TStorage,\n TEnv,\n TCustomApiRouter,\n TAuthConfig,\n TSession\n > & {\n realtime?: TRealtime\n messaging?: TMessaging\n jobs?:\n | JobsDefs\n | ((\n j: BunderstackJobsBuilder<TSchema, ValidatedEnv<TEnv>, TMessaging>,\n ) => JobsDefs)\n },\n source: Record<string, string | undefined>,\n overrides: RuntimeOverrides = {},\n inspectedEnv?: ValidatedEnv<TEnv>,\n): Promise<\n BunderstackApp<\n TSchema,\n TAccess,\n BucketNamesOf<TStorage>,\n TEnv,\n JobsDefs | undefined,\n TCustomApiRouter,\n TRealtime,\n TMessaging,\n TAuthConfig\n >\n> {\n const logger = overrides.logger ?? consoleLogger\n const dialect = detectDialect(options.schema)\n const jobsDefs = options.jobs as JobsDefs | undefined\n if (!inspectedEnv) {\n throw new Error('[bunderstack] runtime requires an inspected environment')\n }\n const env = inspectedEnv\n const resolvedConfig = resolveConfig(options, env, source)\n const config = {\n ...resolvedConfig,\n database: overrides.database\n ? { ...resolvedConfig.database, ...overrides.database }\n : resolvedConfig.database,\n storage: overrides.resolvedStorage ?? resolvedConfig.storage,\n }\n // Merge bunderstack's internal tables (file-meta, idempotency) into the\n // schema used for the db client + provisioning. CRUD/access stay on the USER\n // schema so internal tables never get a CRUD route.\n const mergedSchema = withInternalTables(options.schema)\n const lifecycle = new Lifecycle()\n const {\n db,\n driver,\n close: closeDatabase,\n } = await createDb(mergedSchema, {\n ...config.database,\n dialect,\n })\n const messaging = createMessaging(\n (options.messaging ?? {}) as MessagingConfig,\n {\n env,\n db,\n adapterOverrides: overrides.messagingAdapters,\n },\n ) as MessagingFacadesFor<TMessaging>\n if (closeDatabase) lifecycle.add(closeDatabase)\n try {\n // `db` is typed with the merged schema (user tables + internal tables) so the\n // storage/idempotency code can query the internal tables. The public surface\n // and CRUD only expose the USER schema. TS can widen the merged-schema db type\n // on its own (storage/auth pass `db` directly), but it can't *narrow* a\n // generic schema view, so this single intentional cast produces the\n // user-facing, per-dialect db type. See `app.db` / crud below.\n const userDb = db as unknown as DbFor<TSchema>\n // An `auth` builder gets the user-facing db, so better-auth hooks in another\n // file can write through the app's own connection without importing the app.\n const authConfig = resolveAuthConfig(config.auth, { db: userDb, env })\n const authEmail =\n options.messaging?.email?.kind === 'email'\n ? ((messaging as Record<string, unknown>).email as EmailFacade)\n : undefined\n const auth = createAuth<TAuthConfig>(\n db,\n withEmailAuthDefaults(\n authConfig,\n authEmail ?? ({ send: async () => ({}) } satisfies EmailFacade),\n Boolean(authEmail),\n ),\n dialect,\n options.schema as Record<string, unknown>,\n )\n // Internal routers consume the narrow AuthSessionResolver contract, not the\n // raw better-auth instance. app.auth still exposes `auth` unchanged. An app\n // whose schema declares no better-auth models gets no resolver at all, so\n // every session resolves to null instead of hitting the drizzle adapter.\n const missingModels = missingAuthModels(\n options.schema as Record<string, unknown>,\n authConfig,\n )\n if (missingModels.length > 0 && options.auth !== undefined) {\n logger.warn(\n `[bunderstack] auth is configured, but the schema is ` +\n `missing better-auth tables: ${missingModels\n .map((model) => `\\`${model}\\``)\n .join(', ')}. Every session resolves to null until they are ` +\n `part of the schema.`,\n )\n }\n const declaredAuthResolver =\n options.authResolver ??\n (missingModels.length === 0\n ? toAuthSessionResolver(auth as unknown as Auth, options.session)\n : undefined)\n const authResolver = overrides.authResolver\n ? {\n api: {\n async getSession({ headers }: { headers: Headers }) {\n return (\n (await overrides.authResolver!.api.getSession({ headers })) ??\n (await declaredAuthResolver?.api.getSession({ headers })) ??\n null\n )\n },\n },\n }\n : declaredAuthResolver\n const resolvedAccess = validateAndResolveAccess(\n options.schema,\n options.access,\n )\n const realtimeBufferSize =\n typeof config.realtime === 'object'\n ? config.realtime.bufferSize\n : undefined\n const realtimeResumeSeconds =\n typeof config.realtime === 'object'\n ? config.realtime.resumeSeconds\n : undefined\n const configuredRedisUrl = config.realtime\n ? resolveRealtimeRedisUrl(config.realtime, env, source)\n : undefined\n const redisUrl = overrides.forceMemoryRealtime\n ? undefined\n : configuredRedisUrl\n const publisher = config.realtime\n ? redisUrl\n ? (() => {\n const redis = new Bun.RedisClient(redisUrl)\n const subscriber = redis.duplicate()\n lifecycle.add(async () => {\n redis.close()\n ;(await subscriber).close()\n })\n return createRedisRealtimePublisher(redis, subscriber, {\n prefix: source.BUNDERSTACK_REALTIME_PREFIX ?? 'bunderstack:',\n maxBufferedEvents: realtimeBufferSize,\n resumeSeconds: realtimeResumeSeconds,\n })\n })()\n : createMemoryRealtimePublisher({\n maxBufferedEvents: realtimeBufferSize,\n resumeSeconds: realtimeResumeSeconds,\n })\n : undefined\n const runtimeRealtimeTransport: RealtimeTransport = !publisher\n ? 'disabled'\n : redisUrl\n ? 'redis'\n : 'memory'\n const realtime = createRealtimeFacade<TSchema>(\n publisher,\n runtimeRealtimeTransport,\n options.schema,\n )\n const registry = createBucketStorages(config.storage)\n const storageOperations = createStorageOperations({\n registry,\n db,\n })\n const storageApiRouter = buildStorageApiRouter(registry, storageOperations)\n const realtimeApiRouter = buildRealtimeApiRouter(publisher, resolvedAccess)\n const storage: StorageFacade = {\n async delete(fileId) {\n const bucketName = fileId.split('/')[0] ?? ''\n const entry = registry.get(bucketName)\n if (entry) {\n await deleteFileWithDerivatives(entry.adapter, db, fileId)\n } else {\n // Unknown bucket: no adapter to clean, but still drop the meta row.\n await deleteFileMetaRow(db, fileId)\n }\n },\n bucket(name) {\n return registry.get(name)?.adapter\n },\n sweep(olderThanMs = DEFAULT_PENDING_TTL_MS) {\n return sweepOrphans(registry, db, olderThanMs)\n },\n async getUrl(key, opts = {}) {\n const bucketName =\n opts.bucket ?? key.split('/')[0] ?? config.storage.defaultBucket\n const adapter = registry.get(bucketName)?.adapter\n if (adapter?.presignGet) {\n return adapter.presignGet(key, {\n expiresIn: opts.expiresIn ?? 3600,\n })\n }\n return `/api/files/${key}`\n },\n async upload(key, body, contentType, opts = {}) {\n const bucketName = key.split('/')[0] ?? ''\n const adapter = registry.get(bucketName)?.adapter\n if (!adapter) throw new Error(`Unknown bucket: ${bucketName}`)\n const u8 = body instanceof Uint8Array ? body : new Uint8Array(body)\n const buf: ArrayBuffer = u8.buffer.slice(\n u8.byteOffset,\n u8.byteOffset + u8.byteLength,\n ) as ArrayBuffer\n await adapter.upload(key, buf, contentType)\n await insertReadyFile(db, {\n fileId: key,\n bucket: bucketName,\n ownerId: opts.ownerId ?? null,\n scopeJson: null,\n filename: opts.filename ?? key.split('/').at(-1) ?? null,\n contentType,\n size: buf.byteLength,\n })\n },\n }\n const storageConfigured = Boolean(options.storage)\n // The storage sweep used to be a hardcoded maintenance route. It is an\n // ordinary cron now, so it inherits retries, timeout and onFailed.\n const resolvedDefs: JobsDefs | undefined = storageConfigured\n ? {\n ...jobsDefs,\n [STORAGE_SWEEP_JOB_NAME]: {\n kind: 'cron',\n schedule: STORAGE_SWEEP_SCHEDULE,\n handler: async () => {\n await storage.sweep()\n },\n },\n }\n : jobsDefs\n\n const jobRunner = resolvedDefs\n ? createJobRunner({\n db,\n defs: resolvedDefs,\n ctx: { db: userDb, env, messaging, storage, realtime },\n logger,\n })\n : undefined\n let enqueueNow: number | undefined\n const jobs = {\n async enqueue(name: string, input?: unknown, opts?: EnqueueOptions) {\n if (!resolvedDefs) {\n throw new Error(\n '[bunderstack] no jobs configured — add a `jobs` key to bunderstack',\n )\n }\n const result = await enqueueJob(\n db,\n resolvedDefs,\n name,\n input,\n opts,\n enqueueNow,\n )\n return result\n },\n tick(now?: number) {\n return jobRunner\n ? jobRunner.tick(now)\n : Promise.resolve({ claimed: 0, ran: 0, failed: 0 })\n },\n }\n if (jobRunner) jobRunner.setJobsFacade(jobs)\n overrides.captureTestingHandle?.({\n async tick(now) {\n const previous = enqueueNow\n enqueueNow = now\n try {\n return await jobs.tick(now)\n } finally {\n enqueueNow = previous\n }\n },\n inspect: (now) =>\n jobRunner\n ? jobRunner.inspect(now)\n : Promise.resolve({ runnable: 0, failed: [], jobs: [] }),\n })\n const startWorker = async (\n options: AppStartWorkerOptions = {},\n ): Promise<WorkerHandle> => {\n if (!jobRunner) {\n throw new Error('[bunderstack] no queue jobs configured')\n }\n if (lifecycle.status !== 'ready') {\n throw new Error('[bunderstack] application lifecycle is closed')\n }\n const signal = options.signal\n ? AbortSignal.any([lifecycle.signal, options.signal])\n : lifecycle.signal\n const handle = startJobWorker({\n ...options,\n signal,\n tick: (now) => jobRunner.pump(now),\n drain: () => jobRunner.drain(),\n })\n const unregister = lifecycle.add(() => handle.close())\n void handle.closed.finally(unregister)\n return handle\n }\n const runWorker = async (\n options: AppRunWorkerOptions = {},\n ): Promise<void> => {\n if (\n realtime.transport === 'memory' &&\n !options.allowProcessLocalRealtime\n ) {\n throw new Error(\n '[bunderstack] runWorker() cannot deliver realtime events through the in-memory broker. Configure REDIS_URL or realtime.redis, embed the worker with startWorker(), or pass allowProcessLocalRealtime: true only when jobs never publish realtime.',\n )\n }\n const {\n allowProcessLocalRealtime: _allowProcessLocalRealtime,\n ...workerOptions\n } = options\n const handle = await startWorker(workerOptions)\n try {\n const signal = workerOptions.signal\n ? AbortSignal.any([lifecycle.signal, workerOptions.signal])\n : lifecycle.signal\n await waitForWorkerShutdown(signal, !workerOptions.signal)\n } finally {\n await handle.close()\n await lifecycle.close()\n }\n }\n const crudApiRouter = buildCrudApiRouter<\n TSchema,\n TAccess,\n [TRealtime] extends [false | undefined] ? false : true\n >(options.schema, userDb, {\n access: resolvedAccess,\n idempotency: options.idempotency,\n realtime,\n livePublisher: publisher,\n })\n\n const customApiRouter = options.api as TCustomApiRouter | undefined\n\n const readinessProbes = createReadinessProbes(userDb)\n const queueJobsDeclared = Object.values(options.jobs ?? {}).some(\n (def) => def.kind === 'job',\n )\n const readiness = () =>\n buildReadinessReport({\n ...readinessProbes,\n queueJobsDeclared,\n ...(env.BUNDERSTACK_REVISION === undefined\n ? {}\n : { revision: env.BUNDERSTACK_REVISION }),\n })\n\n const nativeRouter = buildApiRouter({\n crud: crudApiRouter as Record<string, unknown>,\n storage: storageApiRouter as Record<string, unknown>,\n realtime: realtimeApiRouter as Record<string, unknown> | undefined,\n custom: customApiRouter as Record<string, unknown> | undefined,\n middleware: options.middleware,\n readiness,\n }) as any\n\n const authOpenAPISpecRaw =\n options.openapi &&\n auth.api &&\n 'generateOpenAPISchema' in auth.api &&\n typeof auth.api.generateOpenAPISchema === 'function'\n ? await auth.api.generateOpenAPISchema()\n : undefined\n\n const authOpenAPISpec = authOpenAPISpecRaw\n ? normalizeForeignOpenAPISpec(authOpenAPISpecRaw, {\n prefix: '/api/auth',\n source: 'auth',\n })\n : undefined\n\n await buildApiRegistry({\n nativeRouter,\n foreignSpecs: authOpenAPISpec ? [authOpenAPISpec] : [],\n reservedCoreHandles: new Set([\n 'health',\n 'readiness',\n ...(publisher ? ['realtime.changes'] : []),\n ...[...registry.keys()].flatMap((name) =>\n [\n 'prepareUpload',\n 'upload',\n 'confirmUpload',\n 'download',\n 'delete',\n ].map((operation) => `files.${name}.${operation}`),\n ),\n ]),\n })\n\n const valibotConverter = new ValibotToJsonSchemaConverter()\n\n const combinedOpenAPISpec = options.openapi\n ? mergeOpenAPISpecs({\n nativeSpec: await new OpenAPIGenerator({\n converters: [\n valibotConverter,\n {\n condition: (schema: any) =>\n Boolean(\n schema?.['~standard'] && !schema['~standard'].jsonSchema,\n ),\n convert: (schema: any) => {\n const vendor = schema?.['~standard']?.vendor ?? 'unknown'\n throw new OpenAPIGeneratorError(\n `No JSON Schema converter is configured for Standard Schema vendor \"${vendor}\"`,\n )\n },\n },\n ],\n }).generate(nativeRouter),\n authSpec: authOpenAPISpec,\n })\n : undefined\n\n const openapiHandler = new OpenAPIHandler(nativeRouter, {\n // Query strings and form bodies are strings; this coerces them to the\n // types each procedure's input schema declares, so schemas stay honest\n // (`v.number()`, not a string-union pipe) and REST matches RPC.\n plugins: [\n new SmartCoercionHandlerPlugin({ converters: [valibotConverter] }),\n ],\n customErrorResponseBodyEncoder: (error: any) => {\n if (\n error?.code === 'INTERNAL_SERVER_ERROR' ||\n !error?.status ||\n error.status >= 500\n ) {\n logger.error(\n '[bunderstack-api] 500 Internal Server Error:',\n error?.cause ?? error,\n )\n }\n return {\n error: error.message,\n code: error.data?.code ?? error.code,\n // oRPC reports schema failures as `data.issues`; forwarding them tells\n // the client which field was rejected instead of just \"invalid\".\n ...(error.data?.details !== undefined\n ? { details: error.data.details }\n : error.data?.issues !== undefined\n ? { details: error.data.issues }\n : {}),\n }\n },\n interceptors: [\n async (options) => {\n const res = await options.next()\n if (options.context.resHeaders) {\n options.context.resHeaders.forEach((v: string, k: string) =>\n (res.headers[k] = v),\n )\n }\n return res\n },\n ],\n })\n // No custom error encoding here: the RPC protocol owns its error body, and\n // `mapBunderstackErrors` already logs unhandled procedure errors for every\n // transport before rethrowing them.\n const rpcHandler = new RPCHandler(nativeRouter)\n\n const apiHandler = async (req: Request): Promise<Response | null> => {\n const urlString = typeof req === 'string' ? (req as string) : req.url\n if (!urlString) return null\n const url = new URL(urlString, 'http://localhost')\n if (\n combinedOpenAPISpec &&\n url.pathname === '/api/openapi.json' &&\n req.method === 'GET'\n ) {\n return new Response(JSON.stringify(combinedOpenAPISpec), {\n headers: { 'Content-Type': 'application/json' },\n })\n }\n\n const apiCtx = createApiContext(\n {\n db: userDb,\n env,\n storage,\n messaging,\n jobs,\n realtime,\n auth: auth as unknown as AuthInstance,\n authResolver,\n logger,\n },\n req,\n )\n\n if (url.pathname.startsWith('/api/rpc')) {\n const res = await rpcHandler.handle(req, {\n prefix: '/api/rpc',\n context: apiCtx,\n })\n if (res.matched) return res.response\n }\n\n const openapiRes = await openapiHandler.handle(req, { context: apiCtx })\n if (openapiRes.matched) return openapiRes.response\n\n return null\n }\n\n const handler = buildHandler({\n authHandler: (req) => auth.handler(req),\n apiHandler,\n rateLimit: options.rateLimit,\n })\n\n // Topology is a deployment concern: the role decides whether this process\n // runs background work, so application code never has to.\n const roleWantsWorker =\n env.BUNDERSTACK_ROLE === 'all' || env.BUNDERSTACK_ROLE === 'worker'\n const autoStart =\n overrides.backgroundAutoStart === false\n ? false\n : (options.background?.autoStart ??\n (roleWantsWorker && resolvedDefs !== undefined))\n let backgroundRunning = false\n if (autoStart) {\n await startWorker()\n backgroundRunning = true\n }\n\n const app: BunderstackApp<\n TSchema,\n TAccess,\n BucketNamesOf<TStorage>,\n TEnv,\n JobsDefs | undefined,\n TCustomApiRouter,\n TRealtime,\n TMessaging,\n TAuthConfig\n > = {\n handler,\n // Internal tables live on the runtime db but stay out of the public type.\n db: userDb,\n auth,\n storage,\n env,\n messaging,\n realtime,\n // Runtime facade is untyped (JobsRuntimeFacade); the generic-typed field\n // narrows `enqueue` per-app from the declared job defs — same relationship\n // as `userDb` above.\n jobs: jobs as never,\n startWorker,\n runWorker,\n close: () => lifecycle.close(),\n backgroundRunning,\n get status() {\n return lifecycle.status\n },\n signal: lifecycle.signal,\n }\n\n // Hidden handle for the optional `bunderstack/provision` entry. Kept off the\n // public type so provisioning stays opt-in (and drizzle-kit out of this\n // module graph).\n ;(app as WithProvisionInternals)[PROVISION_INTERNALS] = {\n db,\n schema: mergedSchema,\n databaseUrl: config.database.url,\n migrationsFolder: config.database.migrations,\n dialect,\n driver,\n adapter: config.database.adapter,\n }\n\n return app\n } catch (cause) {\n try {\n await lifecycle.close()\n } catch (cleanupCause) {\n throw new AggregateError(\n [cause, cleanupCause],\n '[bunderstack] application initialization failed and cleanup failed',\n )\n }\n throw cause\n }\n}\n\nexport { listSpec } from './api/list-spec'\nexport type { ListSpecOptions } from './api/list-spec'\nexport type { BunderstackDb, BunderstackTx } from './db'\nexport { MAX_LIST_LIMIT } from './list-query'\nexport { BunderstackError } from './errors'\nexport type { BunderstackErrorCode } from './errors'\nexport { resolveConfig, resolveAuthConfig, defineAuth } from './config'\nexport type {\n AuthConfigContext,\n AuthConfigFactory,\n AuthConfigInput,\n BetterAuthConfig,\n BunderstackConfig,\n ResolvedConfig,\n} from './config'\nexport { validateEnv, createClientEnv, BunderstackEnvError } from './env'\nexport type { EnvConfigInput, BaseEnv, ValidatedEnv } from './env'\nexport { buildManifest, parseManifest } from './manifest'\nexport type { BunderstackManifest, ManifestEnvVar } from './manifest'\nexport type { EmailMessage, EmailAdapter } from './email'\nexport { createJobsBuilder } from './jobs/index'\nexport type {\n BunderstackJobContext,\n BunderstackJobsBuilder,\n BackgroundDefinition,\n BackgroundDefs,\n CronDefinition,\n CronInvocation,\n EnqueueOptions,\n JobContext,\n JobDefinition,\n JobsDefs,\n JobsFacade,\n JobsRuntimeFacade,\n QueueJobDefinition,\n QueueJobKeys,\n RunWorkerOptions,\n StartWorkerOptions,\n WorkerHandle,\n} from './jobs/index'\nexport {\n defineSessionUser,\n defineAccess,\n validateAndResolveAccess,\n checkAccess,\n AUTH_TABLE_NAMES,\n} from './access'\nexport type {\n TableAccessInput,\n OperationRule,\n AccessContext,\n AccessUser,\n AccessUserBase,\n SessionUserConfig,\n SessionUserExtraOf,\n SessionUserSource,\n} from './access'\nexport {\n typeid,\n generate as generateTypeId,\n parse as parseTypeId,\n asTypeId,\n} from './typeid'\nexport type { TypeId } from './typeid'\nexport type {\n DatabaseAdapter,\n DatabaseConnection,\n DatabaseConnectionResult,\n} from './database/adapter'\nexport type { StorageAdapter } from './storage/index'\nexport type {\n StorageConfigInput,\n BucketConfigInput,\n ResolvedBucket,\n} from './storage/buckets'\n// StorageFacade is declared+exported inline above.\nexport type { TransformSpec } from './storage/thumbnails'\nexport type { RealtimeAction } from './realtime/publisher'\nexport { createRealtimeFacade } from './realtime/facade'\nexport type {\n RealtimeFacade,\n RealtimeTransport,\n SchemaTable,\n} from './realtime/facade'\n\nexport { createApiBuilder, defineApi } from './api/builder'\nexport type { BunderstackApiBuilder, ApiFactory } from './api/builder'\n// Needed to declare shared middleware over the app's context, e.g.\n// `os.$context<ApiContext<typeof schema>>().middleware(...)`.\nexport type { ApiContext } from './api/context'\nexport type {\n CrudApiRouterFor,\n ExposedApiTables,\n MergeApiRouterTypes,\n UnifiedApiRouter,\n} from './api/types'\nexport type { TableCrudProcedures } from './api/crud-router'\nexport {\n buildApiRegistry,\n mergeApiRoutersStrict,\n normalizeApiPath,\n normalizeForeignOpenAPISpec,\n} from './api/registry'\nexport { mergeOpenAPISpecs } from './api/openapi'\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bunderstack",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.5",
|
|
4
4
|
"description": "Batteries-included backend framework for Bun: type-safe oRPC APIs, auth, storage, realtime, jobs, messaging, and validated env from one declaration.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"backend",
|
|
@@ -180,8 +180,8 @@
|
|
|
180
180
|
"typecheck": "tsc --noEmit"
|
|
181
181
|
},
|
|
182
182
|
"dependencies": {
|
|
183
|
-
"@orpc/client": "2.0.0-beta.
|
|
184
|
-
"@orpc/server": "2.0.0-beta.
|
|
183
|
+
"@orpc/client": "2.0.0-beta.37",
|
|
184
|
+
"@orpc/server": "2.0.0-beta.37",
|
|
185
185
|
"@standard-schema/spec": "1.1.0",
|
|
186
186
|
"@standardserver/core": "0.7.1",
|
|
187
187
|
"valibot": "1.4.2",
|
|
@@ -190,14 +190,14 @@
|
|
|
190
190
|
"devDependencies": {
|
|
191
191
|
"@electric-sql/pglite": ">=0.3.0",
|
|
192
192
|
"@libsql/client": ">=0.14.0",
|
|
193
|
-
"@orpc/bun": "2.0.0-beta.
|
|
194
|
-
"@orpc/client": "2.0.0-beta.
|
|
195
|
-
"@orpc/json-schema": "2.0.0-beta.
|
|
196
|
-
"@orpc/openapi": "2.0.0-beta.
|
|
197
|
-
"@orpc/publisher": "2.0.0-beta.
|
|
198
|
-
"@orpc/server": "2.0.0-beta.
|
|
199
|
-
"@orpc/tanstack-query": "2.0.0-beta.
|
|
200
|
-
"@orpc/valibot": "2.0.0-beta.
|
|
193
|
+
"@orpc/bun": "2.0.0-beta.37",
|
|
194
|
+
"@orpc/client": "2.0.0-beta.37",
|
|
195
|
+
"@orpc/json-schema": "2.0.0-beta.37",
|
|
196
|
+
"@orpc/openapi": "2.0.0-beta.37",
|
|
197
|
+
"@orpc/publisher": "2.0.0-beta.37",
|
|
198
|
+
"@orpc/server": "2.0.0-beta.37",
|
|
199
|
+
"@orpc/tanstack-query": "2.0.0-beta.37",
|
|
200
|
+
"@orpc/valibot": "2.0.0-beta.37",
|
|
201
201
|
"@standardserver/core": "0.7.1",
|
|
202
202
|
"@tanstack/db": "0.6.16",
|
|
203
203
|
"@tanstack/query-core": "^5.101.1",
|
|
@@ -218,14 +218,14 @@
|
|
|
218
218
|
"peerDependencies": {
|
|
219
219
|
"@electric-sql/pglite": ">=0.3.0",
|
|
220
220
|
"@libsql/client": ">=0.14.0",
|
|
221
|
-
"@orpc/bun": "2.0.0-beta.
|
|
222
|
-
"@orpc/client": "2.0.0-beta.
|
|
223
|
-
"@orpc/json-schema": "2.0.0-beta.
|
|
224
|
-
"@orpc/openapi": "2.0.0-beta.
|
|
225
|
-
"@orpc/publisher": "2.0.0-beta.
|
|
226
|
-
"@orpc/server": "2.0.0-beta.
|
|
227
|
-
"@orpc/tanstack-query": "2.0.0-beta.
|
|
228
|
-
"@orpc/valibot": "2.0.0-beta.
|
|
221
|
+
"@orpc/bun": "2.0.0-beta.37",
|
|
222
|
+
"@orpc/client": "2.0.0-beta.37",
|
|
223
|
+
"@orpc/json-schema": "2.0.0-beta.37",
|
|
224
|
+
"@orpc/openapi": "2.0.0-beta.37",
|
|
225
|
+
"@orpc/publisher": "2.0.0-beta.37",
|
|
226
|
+
"@orpc/server": "2.0.0-beta.37",
|
|
227
|
+
"@orpc/tanstack-query": "2.0.0-beta.37",
|
|
228
|
+
"@orpc/valibot": "2.0.0-beta.37",
|
|
229
229
|
"@tanstack/db": "0.6.16",
|
|
230
230
|
"@tanstack/query-core": "^5.101.0",
|
|
231
231
|
"@tanstack/query-db-collection": "1.1.0",
|