@rpcbase/client 0.491.0 → 0.493.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/RootProvider/index.d.ts +1 -1
- package/dist/RootProvider/index.d.ts.map +1 -1
- package/dist/components/RouteErrorBoundary.d.ts +1 -1
- package/dist/components/RouteErrorBoundary.d.ts.map +1 -1
- package/dist/components/SsrErrorFallback.d.ts +1 -1
- package/dist/components/SsrErrorFallback.d.ts.map +1 -1
- package/dist/errorReporting-BaPe0tII.js.map +1 -1
- package/dist/getServerApiClient-Dv6Onzp4.js.map +1 -1
- package/dist/index.js +235 -538
- package/dist/index.js.map +1 -1
- package/dist/instrument.js.map +1 -1
- package/dist/notificationsRealtime.d.ts +1 -1
- package/dist/notificationsRealtime.d.ts.map +1 -1
- package/dist/rts/index.js +1 -1
- package/dist/rts/ssrHydration.d.ts +1 -1
- package/dist/rts/ssrHydration.d.ts.map +1 -1
- package/dist/{rts-C9lvbdZX.js → rts-CAi9JFYq.js} +2 -2
- package/dist/rts-CAi9JFYq.js.map +1 -0
- package/dist/spatial-nav/index.js +271 -431
- package/dist/spatial-nav/index.js.map +1 -1
- package/dist/{throttle-BFr_Yc5g.js → throttle-BJaYdH4P.js} +26 -24
- package/dist/throttle-BJaYdH4P.js.map +1 -0
- package/dist/toast.d.ts +1 -1
- package/dist/toast.d.ts.map +1 -1
- package/package.json +4 -4
- package/dist/rts-C9lvbdZX.js.map +0 -1
- package/dist/throttle-BFr_Yc5g.js.map +0 -1
|
@@ -4,6 +4,6 @@ type RootProviderProps = {
|
|
|
4
4
|
children: ReactNode;
|
|
5
5
|
routePrefetch?: Omit<RoutePrefetchProviderProps, "children">;
|
|
6
6
|
};
|
|
7
|
-
export declare const RootProvider: ({ children, routePrefetch }: RootProviderProps) => import("react
|
|
7
|
+
export declare const RootProvider: ({ children, routePrefetch }: RootProviderProps) => import("react").JSX.Element;
|
|
8
8
|
export {};
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/RootProvider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAKxF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,aAAa,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAA;CAC7D,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,6BAA2B,iBAAiB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/RootProvider/index.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AACjC,OAAO,EAAyB,KAAK,0BAA0B,EAAE,MAAM,iBAAiB,CAAA;AAKxF,KAAK,iBAAiB,GAAG;IACvB,QAAQ,EAAE,SAAS,CAAA;IACnB,aAAa,CAAC,EAAE,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAA;CAC7D,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,6BAA2B,iBAAiB,gCAWxE,CAAA"}
|
|
@@ -4,6 +4,6 @@ type RenderErrorExtra = (state: SsrErrorStatePayload) => ReactNode;
|
|
|
4
4
|
type RouteErrorBoundaryProps = {
|
|
5
5
|
renderErrorExtra?: RenderErrorExtra;
|
|
6
6
|
};
|
|
7
|
-
export declare const RouteErrorBoundary: ({ renderErrorExtra }: RouteErrorBoundaryProps) => import("react
|
|
7
|
+
export declare const RouteErrorBoundary: ({ renderErrorExtra }: RouteErrorBoundaryProps) => import("react").JSX.Element;
|
|
8
8
|
export {};
|
|
9
9
|
//# sourceMappingURL=RouteErrorBoundary.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RouteErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/RouteErrorBoundary.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAIjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAGvD,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAA;AAElE,KAAK,uBAAuB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAkDD,eAAO,MAAM,kBAAkB,GAAI,sBAAsB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"RouteErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/components/RouteErrorBoundary.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAIjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAGvD,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAA;AAElE,KAAK,uBAAuB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAkDD,eAAO,MAAM,kBAAkB,GAAI,sBAAsB,uBAAuB,gCAU/E,CAAA"}
|
|
@@ -5,6 +5,6 @@ type SsrErrorFallbackProps = {
|
|
|
5
5
|
state: SsrErrorStatePayload;
|
|
6
6
|
renderErrorExtra?: RenderErrorExtra;
|
|
7
7
|
};
|
|
8
|
-
export declare const SsrErrorFallback: ({ state, renderErrorExtra }: SsrErrorFallbackProps) => import("react
|
|
8
|
+
export declare const SsrErrorFallback: ({ state, renderErrorExtra }: SsrErrorFallbackProps) => import("react").JSX.Element;
|
|
9
9
|
export {};
|
|
10
10
|
//# sourceMappingURL=SsrErrorFallback.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SsrErrorFallback.d.ts","sourceRoot":"","sources":["../../src/components/SsrErrorFallback.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAGvD,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAA;AAElE,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,oBAAoB,CAAA;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAKD,eAAO,MAAM,gBAAgB,GAAI,6BAA6B,qBAAqB,
|
|
1
|
+
{"version":3,"file":"SsrErrorFallback.d.ts","sourceRoot":"","sources":["../../src/components/SsrErrorFallback.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAEjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAGvD,KAAK,gBAAgB,GAAG,CAAC,KAAK,EAAE,oBAAoB,KAAK,SAAS,CAAA;AAElE,KAAK,qBAAqB,GAAG;IAC3B,KAAK,EAAE,oBAAoB,CAAA;IAC3B,gBAAgB,CAAC,EAAE,gBAAgB,CAAA;CACpC,CAAA;AAKD,eAAO,MAAM,gBAAgB,GAAI,6BAA6B,qBAAqB,gCAoClF,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorReporting-BaPe0tII.js","names":[
|
|
1
|
+
{"version":3,"file":"errorReporting-BaPe0tII.js","names":[],"sources":["../src/errorReporting.ts"],"sourcesContent":["export type ClientExceptionContext = {\n reactContext?: \"uncaught\" | \"caught\" | \"recoverable\"\n componentStack?: string\n}\n\nexport type ClientExceptionReporter = (error: Error, context: ClientExceptionContext) => void\n\nlet reporter: ClientExceptionReporter | undefined\n\nexport const setClientExceptionReporter = (next: ClientExceptionReporter | undefined) => {\n reporter = next\n}\n\nexport const reportClientException = (error: unknown, context: ClientExceptionContext = {}) => {\n if (!error) return\n\n const err = error instanceof Error ? error : new Error(String(error))\n\n try {\n reporter?.(err, context)\n } catch (reportError) {\n console.error(\"[rb/client] exception reporter failed\", reportError)\n }\n}\n\n"],"mappings":";AAOA,IAAI;AAEJ,IAAa,8BAA8B,SAA8C;CACvF,WAAW;AACb;AAEA,IAAa,yBAAyB,OAAgB,UAAkC,CAAC,MAAM;CAC7F,IAAI,CAAC,OAAO;CAEZ,MAAM,MAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,KAAK,CAAC;CAEpE,IAAI;EACF,WAAW,KAAK,OAAO;CACzB,SAAS,aAAa;EACpB,QAAQ,MAAM,yCAAyC,WAAW;CACpE;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getServerApiClient-Dv6Onzp4.js","names":["randomUUID","Application","IRouter","Request","Response","createApiClientError","NextMiddleware","err","LayerHandler","req","res","next","ErrorLayerHandler","error","RouterLayer","name","match","path","handle","route","methods","Record","stack","Array","DispatchState","hasError","HandlerOutcome","responded","NO_ERROR","callServerApiRoute","app","method","matchPath","requestUrl","Partial","Promise","TResponse","resolve","reject","isEnded","timeoutId","ReturnType","setTimeout","statusCode","headersSent","responseHeaders","Map","responseWaiters","Set","resolveRequest","data","clearTimeout","rejectRequest","responseHeadersObject","Object","fromEntries","entries","rejectUnhandledError","requestId","get","set","success","status","headers","cause","notifyResponse","waiter","clear","finishResponse","mockReq","toUpperCase","url","originalUrl","mockRes","locals","defineProperties","configurable","value","json","send","end","sendStatus","String","setHeader","toLowerCase","getHeader","getHeaders","hasHeader","has","removeHeader","delete","field","headerValue","header","type","routerStack","router","firstApiMiddlewareIndex","findIndex","layer","Error","apiStack","slice","runHandler","handler","state","resolveHandler","settled","settle","outcome","onResponse","add","undefined","result","PromiseLike","then","catch","processLayer","index","length","isNonMatchingLayer","isErrorHandler","Application","Ctx","callServerApiRoute","ApiClientRequestOptions","signal","AbortSignal","getServerApiClient","app","isCtx","value","createAbortError","error","Error","name","mergeQueryValues","target","Record","key","existing","Array","isArray","push","toQueryValue","Number","isFinite","String","Date","toISOString","buildQuery","path","payload","url","URL","query","searchParams","rawValue","Object","entries","item","converted","URLSearchParams","append","matchPath","pathname","requestUrl","toString","createMethod","method","ctxOrOptions","options","Promise","TResponse","ctx","undefined","requestOptions","aborted","normalizedMethod","toLowerCase","req","body","res","apiClient","get","post","put","delete"],"sources":["../src/apiClient/callServerApiRoute.ts","../src/apiClient/getServerApiClient.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\"\n\nimport type { Application, IRouter, Request, Response } from \"express\"\n\nimport { createApiClientError } from \"./ApiClientError\"\n\n\ntype NextMiddleware = (err?: unknown) => void\ntype LayerHandler = (req: Request, res: Response, next: NextMiddleware) => unknown\ntype ErrorLayerHandler = (error: unknown, req: Request, res: Response, next: NextMiddleware) => unknown\n\ntype RouterLayer = {\n name: string\n match: (path: string) => boolean\n handle: LayerHandler | ErrorLayerHandler\n route?: {\n methods: Record<string, boolean | undefined>\n path: string\n stack: Array<{ handle: LayerHandler }>\n }\n}\n\ntype DispatchState =\n | { hasError: false }\n | { hasError: true; error: unknown }\n\ntype HandlerOutcome = DispatchState | { responded: true }\n\nconst NO_ERROR: DispatchState = { hasError: false }\n\n\nexport const callServerApiRoute = <TResponse = Record<string, unknown>>(\n app: Application,\n method: string,\n matchPath: string,\n requestUrl: string,\n req: Partial<Request>,\n res: Partial<Response>,\n): Promise<TResponse> => new Promise((resolve, reject) => {\n let isEnded = false\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n let statusCode = 200\n let headersSent = false\n const responseHeaders = new Map<string, unknown>()\n const responseWaiters = new Set<() => void>()\n\n const resolveRequest = (data: TResponse) => {\n if (isEnded) return\n isEnded = true\n if (timeoutId) clearTimeout(timeoutId)\n resolve(data)\n }\n\n const rejectRequest = (error: unknown) => {\n if (isEnded) return\n isEnded = true\n if (timeoutId) clearTimeout(timeoutId)\n reject(error)\n }\n\n const responseHeadersObject = () => Object.fromEntries(responseHeaders.entries())\n\n const rejectUnhandledError = (error: unknown) => {\n if (isEnded) return\n\n let requestId = responseHeaders.get(\"x-request-id\")\n if (typeof requestId !== \"string\" || !requestId) {\n requestId = randomUUID()\n responseHeaders.set(\"x-request-id\", requestId)\n }\n\n const data = {\n success: false,\n error: \"internal_error\",\n requestId,\n }\n\n rejectRequest(createApiClientError({\n status: 500,\n data,\n headers: responseHeadersObject(),\n cause: error,\n }))\n }\n\n const notifyResponse = () => {\n for (const waiter of responseWaiters) waiter()\n responseWaiters.clear()\n }\n\n const finishResponse = (data: unknown) => {\n if (isEnded) return\n headersSent = true\n notifyResponse()\n\n if (statusCode < 200 || statusCode >= 300) {\n rejectRequest(createApiClientError({\n status: statusCode,\n data,\n headers: responseHeadersObject(),\n }))\n return\n }\n\n resolveRequest(data as TResponse)\n }\n\n const mockReq = {\n ...req,\n method: method.toUpperCase(),\n url: requestUrl,\n originalUrl: requestUrl,\n } as Request\n\n const mockRes = {\n ...res,\n locals: { ...(res.locals ?? {}) },\n } as Response\n\n Object.defineProperties(mockRes, {\n headersSent: {\n configurable: true,\n get: () => headersSent,\n },\n statusCode: {\n configurable: true,\n get: () => statusCode,\n set: (value: number) => {\n statusCode = value\n },\n },\n })\n\n mockRes.status = ((value: number) => {\n statusCode = value\n return mockRes\n }) as Response[\"status\"]\n mockRes.json = ((data: unknown) => {\n finishResponse(data)\n return mockRes\n }) as Response[\"json\"]\n mockRes.send = ((data: unknown) => {\n finishResponse(data)\n return mockRes\n }) as Response[\"send\"]\n mockRes.end = ((data?: unknown) => {\n finishResponse(data)\n return mockRes\n }) as Response[\"end\"]\n mockRes.sendStatus = ((value: number) => {\n statusCode = value\n finishResponse(String(value))\n return mockRes\n }) as Response[\"sendStatus\"]\n mockRes.setHeader = ((name: string, value: unknown) => {\n responseHeaders.set(name.toLowerCase(), value)\n return mockRes\n }) as Response[\"setHeader\"]\n mockRes.getHeader = ((name: string) => responseHeaders.get(name.toLowerCase())) as Response[\"getHeader\"]\n mockRes.getHeaders = (() => responseHeadersObject()) as Response[\"getHeaders\"]\n mockRes.hasHeader = ((name: string) => responseHeaders.has(name.toLowerCase())) as Response[\"hasHeader\"]\n mockRes.removeHeader = ((name: string) => {\n responseHeaders.delete(name.toLowerCase())\n }) as Response[\"removeHeader\"]\n mockRes.set = ((field: string | Record<string, unknown>, value?: unknown) => {\n if (typeof field === \"string\") {\n responseHeaders.set(field.toLowerCase(), value)\n } else {\n for (const [name, headerValue] of Object.entries(field)) {\n responseHeaders.set(name.toLowerCase(), headerValue)\n }\n }\n return mockRes\n }) as Response[\"set\"]\n mockRes.header = mockRes.set\n mockRes.type = ((value: string) => {\n responseHeaders.set(\"content-type\", value)\n return mockRes\n }) as Response[\"type\"]\n\n const routerStack = (app.router as unknown as IRouter).stack as unknown as RouterLayer[]\n\n const firstApiMiddlewareIndex = routerStack.findIndex((layer) => layer.name === \"__FIRST_API_MIDDLEWARE__\")\n if (!(firstApiMiddlewareIndex > -1)) {\n throw new Error(\"middleware: __FIRST_API_MIDDLEWARE__ was not found in stack\")\n }\n\n const apiStack = routerStack.slice(firstApiMiddlewareIndex + 1)\n\n const runHandler = (\n handler: LayerHandler | ErrorLayerHandler,\n state: DispatchState,\n ): Promise<HandlerOutcome> => new Promise((resolveHandler) => {\n let settled = false\n\n const settle = (outcome: HandlerOutcome) => {\n if (settled) return\n settled = true\n responseWaiters.delete(onResponse)\n resolveHandler(outcome)\n }\n\n const onResponse = () => settle({ responded: true })\n responseWaiters.add(onResponse)\n\n const next: NextMiddleware = (error) => {\n settle(error === undefined || error === null\n ? NO_ERROR\n : { hasError: true, error })\n }\n\n try {\n const result = state.hasError\n ? (handler as ErrorLayerHandler)(state.error, mockReq, mockRes, next)\n : (handler as LayerHandler)(mockReq, mockRes, next)\n\n if (result && typeof (result as PromiseLike<unknown>).then === \"function\") {\n void Promise.resolve(result).catch(next)\n }\n } catch (error) {\n next(error)\n }\n })\n\n const processLayer = async (index: number, state: DispatchState): Promise<void> => {\n if (isEnded) return\n if (index >= apiStack.length) {\n if (state.hasError) rejectUnhandledError(state.error)\n return\n }\n\n const layer = apiStack[index]\n\n let isNonMatchingLayer: boolean\n try {\n isNonMatchingLayer = !layer.match(matchPath)\n } catch (error) {\n await processLayer(index + 1, { hasError: true, error })\n return\n }\n\n if (isNonMatchingLayer) {\n await processLayer(index + 1, state)\n return\n }\n\n if (layer.route) {\n if (state.hasError) {\n await processLayer(index + 1, state)\n return\n }\n\n if (!layer.route.methods[method.toLowerCase()]) {\n await processLayer(index + 1, state)\n return\n }\n\n if (layer.route.stack.length !== 1) {\n throw new Error(`expected only one handler per route for route: ${layer.route.path}`)\n }\n\n const outcome = await runHandler(layer.route.stack[0].handle, state)\n if (\"responded\" in outcome) return\n await processLayer(index + 1, outcome)\n return\n }\n\n const isErrorHandler = layer.handle.length === 4\n if (state.hasError !== isErrorHandler) {\n await processLayer(index + 1, state)\n return\n }\n\n const outcome = await runHandler(layer.handle, state)\n if (\"responded\" in outcome) return\n await processLayer(index + 1, outcome)\n }\n\n timeoutId = setTimeout(() => {\n rejectRequest(new Error(\"Route handler timed out\"))\n }, 30000)\n\n void processLayer(0, NO_ERROR).catch(rejectUnhandledError)\n })\n","import type { Application } from \"express\"\nimport type { Ctx } from \"@rpcbase/api\"\n\nimport { callServerApiRoute } from \"./callServerApiRoute\"\n\n\ntype ApiClientRequestOptions = {\n signal?: AbortSignal\n}\n\n\nexport const getServerApiClient = async(app: Application) => {\n const isCtx = (value: unknown): value is Ctx => {\n if (!value || typeof value !== \"object\") return false\n return \"req\" in value && \"res\" in value\n }\n\n const createAbortError = () => {\n const error = new Error(\"The operation was aborted.\")\n error.name = \"AbortError\"\n return error\n }\n\n const mergeQueryValues = (target: Record<string, string | string[]>, key: string, value: string) => {\n const existing = target[key]\n if (Array.isArray(existing)) {\n existing.push(value)\n return\n }\n\n if (typeof existing === \"string\") {\n target[key] = [existing, value]\n return\n }\n\n target[key] = value\n }\n\n const toQueryValue = (value: unknown): string | null => {\n if (typeof value === \"string\") return value\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : null\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\"\n if (typeof value === \"bigint\") return String(value)\n if (value instanceof Date) return value.toISOString()\n return null\n }\n\n const buildQuery = (path: string, payload: Record<string, unknown>) => {\n const url = new URL(path, \"http://localhost\")\n\n const query: Record<string, string | string[]> = {}\n for (const [key, value] of url.searchParams) {\n mergeQueryValues(query, key, value)\n }\n\n for (const [key, rawValue] of Object.entries(payload)) {\n if (!key) continue\n\n if (Array.isArray(rawValue)) {\n for (const item of rawValue) {\n const converted = toQueryValue(item)\n if (converted !== null) mergeQueryValues(query, key, converted)\n }\n continue\n }\n\n const converted = toQueryValue(rawValue)\n if (converted !== null) mergeQueryValues(query, key, converted)\n }\n\n const searchParams = new URLSearchParams()\n for (const [key, rawValue] of Object.entries(query)) {\n if (Array.isArray(rawValue)) {\n for (const value of rawValue) {\n searchParams.append(key, value)\n }\n continue\n }\n\n searchParams.append(key, rawValue)\n }\n\n const matchPath = url.pathname\n const requestUrl = `${matchPath}${searchParams.toString() ? `?${searchParams.toString()}` : \"\"}`\n\n return { matchPath, requestUrl, query }\n }\n\n const createMethod = (method: string) => {\n return async <TResponse = Record<string, unknown>>(\n path: string,\n payload: Record<string, unknown>,\n ctxOrOptions?: Ctx | ApiClientRequestOptions,\n options?: ApiClientRequestOptions,\n ): Promise<TResponse> => {\n const ctx = isCtx(ctxOrOptions) ? ctxOrOptions : undefined\n const requestOptions = isCtx(ctxOrOptions) ? options : ctxOrOptions\n if (!ctx) {\n throw new Error(\"Context must be provided in SSR mode\")\n }\n if (requestOptions?.signal?.aborted) {\n throw createAbortError()\n }\n\n const normalizedMethod = method.toLowerCase()\n\n if (normalizedMethod === \"get\") {\n const { matchPath, requestUrl, query } = buildQuery(path, payload)\n return callServerApiRoute<TResponse>(app, method, matchPath, requestUrl, { ...ctx.req, body: {}, query }, ctx.res)\n }\n\n const { matchPath, requestUrl, query } = buildQuery(path, {})\n return callServerApiRoute<TResponse>(app, method, matchPath, requestUrl, { ...ctx.req, body: payload, query }, ctx.res)\n }\n }\n\n const apiClient = {\n get: createMethod(\"get\"),\n post: createMethod(\"post\"),\n put: createMethod(\"put\"),\n delete: createMethod(\"delete\")\n }\n\n return apiClient\n}\n\nexport default getServerApiClient\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"getServerApiClient-Dv6Onzp4.js","names":[],"sources":["../src/apiClient/callServerApiRoute.ts","../src/apiClient/getServerApiClient.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\"\n\nimport type { Application, IRouter, Request, Response } from \"express\"\n\nimport { createApiClientError } from \"./ApiClientError\"\n\n\ntype NextMiddleware = (err?: unknown) => void\ntype LayerHandler = (req: Request, res: Response, next: NextMiddleware) => unknown\ntype ErrorLayerHandler = (error: unknown, req: Request, res: Response, next: NextMiddleware) => unknown\n\ntype RouterLayer = {\n name: string\n match: (path: string) => boolean\n handle: LayerHandler | ErrorLayerHandler\n route?: {\n methods: Record<string, boolean | undefined>\n path: string\n stack: Array<{ handle: LayerHandler }>\n }\n}\n\ntype DispatchState =\n | { hasError: false }\n | { hasError: true; error: unknown }\n\ntype HandlerOutcome = DispatchState | { responded: true }\n\nconst NO_ERROR: DispatchState = { hasError: false }\n\n\nexport const callServerApiRoute = <TResponse = Record<string, unknown>>(\n app: Application,\n method: string,\n matchPath: string,\n requestUrl: string,\n req: Partial<Request>,\n res: Partial<Response>,\n): Promise<TResponse> => new Promise((resolve, reject) => {\n let isEnded = false\n let timeoutId: ReturnType<typeof setTimeout> | null = null\n let statusCode = 200\n let headersSent = false\n const responseHeaders = new Map<string, unknown>()\n const responseWaiters = new Set<() => void>()\n\n const resolveRequest = (data: TResponse) => {\n if (isEnded) return\n isEnded = true\n if (timeoutId) clearTimeout(timeoutId)\n resolve(data)\n }\n\n const rejectRequest = (error: unknown) => {\n if (isEnded) return\n isEnded = true\n if (timeoutId) clearTimeout(timeoutId)\n reject(error)\n }\n\n const responseHeadersObject = () => Object.fromEntries(responseHeaders.entries())\n\n const rejectUnhandledError = (error: unknown) => {\n if (isEnded) return\n\n let requestId = responseHeaders.get(\"x-request-id\")\n if (typeof requestId !== \"string\" || !requestId) {\n requestId = randomUUID()\n responseHeaders.set(\"x-request-id\", requestId)\n }\n\n const data = {\n success: false,\n error: \"internal_error\",\n requestId,\n }\n\n rejectRequest(createApiClientError({\n status: 500,\n data,\n headers: responseHeadersObject(),\n cause: error,\n }))\n }\n\n const notifyResponse = () => {\n for (const waiter of responseWaiters) waiter()\n responseWaiters.clear()\n }\n\n const finishResponse = (data: unknown) => {\n if (isEnded) return\n headersSent = true\n notifyResponse()\n\n if (statusCode < 200 || statusCode >= 300) {\n rejectRequest(createApiClientError({\n status: statusCode,\n data,\n headers: responseHeadersObject(),\n }))\n return\n }\n\n resolveRequest(data as TResponse)\n }\n\n const mockReq = {\n ...req,\n method: method.toUpperCase(),\n url: requestUrl,\n originalUrl: requestUrl,\n } as Request\n\n const mockRes = {\n ...res,\n locals: { ...(res.locals ?? {}) },\n } as Response\n\n Object.defineProperties(mockRes, {\n headersSent: {\n configurable: true,\n get: () => headersSent,\n },\n statusCode: {\n configurable: true,\n get: () => statusCode,\n set: (value: number) => {\n statusCode = value\n },\n },\n })\n\n mockRes.status = ((value: number) => {\n statusCode = value\n return mockRes\n }) as Response[\"status\"]\n mockRes.json = ((data: unknown) => {\n finishResponse(data)\n return mockRes\n }) as Response[\"json\"]\n mockRes.send = ((data: unknown) => {\n finishResponse(data)\n return mockRes\n }) as Response[\"send\"]\n mockRes.end = ((data?: unknown) => {\n finishResponse(data)\n return mockRes\n }) as Response[\"end\"]\n mockRes.sendStatus = ((value: number) => {\n statusCode = value\n finishResponse(String(value))\n return mockRes\n }) as Response[\"sendStatus\"]\n mockRes.setHeader = ((name: string, value: unknown) => {\n responseHeaders.set(name.toLowerCase(), value)\n return mockRes\n }) as Response[\"setHeader\"]\n mockRes.getHeader = ((name: string) => responseHeaders.get(name.toLowerCase())) as Response[\"getHeader\"]\n mockRes.getHeaders = (() => responseHeadersObject()) as Response[\"getHeaders\"]\n mockRes.hasHeader = ((name: string) => responseHeaders.has(name.toLowerCase())) as Response[\"hasHeader\"]\n mockRes.removeHeader = ((name: string) => {\n responseHeaders.delete(name.toLowerCase())\n }) as Response[\"removeHeader\"]\n mockRes.set = ((field: string | Record<string, unknown>, value?: unknown) => {\n if (typeof field === \"string\") {\n responseHeaders.set(field.toLowerCase(), value)\n } else {\n for (const [name, headerValue] of Object.entries(field)) {\n responseHeaders.set(name.toLowerCase(), headerValue)\n }\n }\n return mockRes\n }) as Response[\"set\"]\n mockRes.header = mockRes.set\n mockRes.type = ((value: string) => {\n responseHeaders.set(\"content-type\", value)\n return mockRes\n }) as Response[\"type\"]\n\n const routerStack = (app.router as unknown as IRouter).stack as unknown as RouterLayer[]\n\n const firstApiMiddlewareIndex = routerStack.findIndex((layer) => layer.name === \"__FIRST_API_MIDDLEWARE__\")\n if (!(firstApiMiddlewareIndex > -1)) {\n throw new Error(\"middleware: __FIRST_API_MIDDLEWARE__ was not found in stack\")\n }\n\n const apiStack = routerStack.slice(firstApiMiddlewareIndex + 1)\n\n const runHandler = (\n handler: LayerHandler | ErrorLayerHandler,\n state: DispatchState,\n ): Promise<HandlerOutcome> => new Promise((resolveHandler) => {\n let settled = false\n\n const settle = (outcome: HandlerOutcome) => {\n if (settled) return\n settled = true\n responseWaiters.delete(onResponse)\n resolveHandler(outcome)\n }\n\n const onResponse = () => settle({ responded: true })\n responseWaiters.add(onResponse)\n\n const next: NextMiddleware = (error) => {\n settle(error === undefined || error === null\n ? NO_ERROR\n : { hasError: true, error })\n }\n\n try {\n const result = state.hasError\n ? (handler as ErrorLayerHandler)(state.error, mockReq, mockRes, next)\n : (handler as LayerHandler)(mockReq, mockRes, next)\n\n if (result && typeof (result as PromiseLike<unknown>).then === \"function\") {\n void Promise.resolve(result).catch(next)\n }\n } catch (error) {\n next(error)\n }\n })\n\n const processLayer = async (index: number, state: DispatchState): Promise<void> => {\n if (isEnded) return\n if (index >= apiStack.length) {\n if (state.hasError) rejectUnhandledError(state.error)\n return\n }\n\n const layer = apiStack[index]\n\n let isNonMatchingLayer: boolean\n try {\n isNonMatchingLayer = !layer.match(matchPath)\n } catch (error) {\n await processLayer(index + 1, { hasError: true, error })\n return\n }\n\n if (isNonMatchingLayer) {\n await processLayer(index + 1, state)\n return\n }\n\n if (layer.route) {\n if (state.hasError) {\n await processLayer(index + 1, state)\n return\n }\n\n if (!layer.route.methods[method.toLowerCase()]) {\n await processLayer(index + 1, state)\n return\n }\n\n if (layer.route.stack.length !== 1) {\n throw new Error(`expected only one handler per route for route: ${layer.route.path}`)\n }\n\n const outcome = await runHandler(layer.route.stack[0].handle, state)\n if (\"responded\" in outcome) return\n await processLayer(index + 1, outcome)\n return\n }\n\n const isErrorHandler = layer.handle.length === 4\n if (state.hasError !== isErrorHandler) {\n await processLayer(index + 1, state)\n return\n }\n\n const outcome = await runHandler(layer.handle, state)\n if (\"responded\" in outcome) return\n await processLayer(index + 1, outcome)\n }\n\n timeoutId = setTimeout(() => {\n rejectRequest(new Error(\"Route handler timed out\"))\n }, 30000)\n\n void processLayer(0, NO_ERROR).catch(rejectUnhandledError)\n })\n","import type { Application } from \"express\"\nimport type { Ctx } from \"@rpcbase/api\"\n\nimport { callServerApiRoute } from \"./callServerApiRoute\"\n\n\ntype ApiClientRequestOptions = {\n signal?: AbortSignal\n}\n\n\nexport const getServerApiClient = async(app: Application) => {\n const isCtx = (value: unknown): value is Ctx => {\n if (!value || typeof value !== \"object\") return false\n return \"req\" in value && \"res\" in value\n }\n\n const createAbortError = () => {\n const error = new Error(\"The operation was aborted.\")\n error.name = \"AbortError\"\n return error\n }\n\n const mergeQueryValues = (target: Record<string, string | string[]>, key: string, value: string) => {\n const existing = target[key]\n if (Array.isArray(existing)) {\n existing.push(value)\n return\n }\n\n if (typeof existing === \"string\") {\n target[key] = [existing, value]\n return\n }\n\n target[key] = value\n }\n\n const toQueryValue = (value: unknown): string | null => {\n if (typeof value === \"string\") return value\n if (typeof value === \"number\") return Number.isFinite(value) ? String(value) : null\n if (typeof value === \"boolean\") return value ? \"true\" : \"false\"\n if (typeof value === \"bigint\") return String(value)\n if (value instanceof Date) return value.toISOString()\n return null\n }\n\n const buildQuery = (path: string, payload: Record<string, unknown>) => {\n const url = new URL(path, \"http://localhost\")\n\n const query: Record<string, string | string[]> = {}\n for (const [key, value] of url.searchParams) {\n mergeQueryValues(query, key, value)\n }\n\n for (const [key, rawValue] of Object.entries(payload)) {\n if (!key) continue\n\n if (Array.isArray(rawValue)) {\n for (const item of rawValue) {\n const converted = toQueryValue(item)\n if (converted !== null) mergeQueryValues(query, key, converted)\n }\n continue\n }\n\n const converted = toQueryValue(rawValue)\n if (converted !== null) mergeQueryValues(query, key, converted)\n }\n\n const searchParams = new URLSearchParams()\n for (const [key, rawValue] of Object.entries(query)) {\n if (Array.isArray(rawValue)) {\n for (const value of rawValue) {\n searchParams.append(key, value)\n }\n continue\n }\n\n searchParams.append(key, rawValue)\n }\n\n const matchPath = url.pathname\n const requestUrl = `${matchPath}${searchParams.toString() ? `?${searchParams.toString()}` : \"\"}`\n\n return { matchPath, requestUrl, query }\n }\n\n const createMethod = (method: string) => {\n return async <TResponse = Record<string, unknown>>(\n path: string,\n payload: Record<string, unknown>,\n ctxOrOptions?: Ctx | ApiClientRequestOptions,\n options?: ApiClientRequestOptions,\n ): Promise<TResponse> => {\n const ctx = isCtx(ctxOrOptions) ? ctxOrOptions : undefined\n const requestOptions = isCtx(ctxOrOptions) ? options : ctxOrOptions\n if (!ctx) {\n throw new Error(\"Context must be provided in SSR mode\")\n }\n if (requestOptions?.signal?.aborted) {\n throw createAbortError()\n }\n\n const normalizedMethod = method.toLowerCase()\n\n if (normalizedMethod === \"get\") {\n const { matchPath, requestUrl, query } = buildQuery(path, payload)\n return callServerApiRoute<TResponse>(app, method, matchPath, requestUrl, { ...ctx.req, body: {}, query }, ctx.res)\n }\n\n const { matchPath, requestUrl, query } = buildQuery(path, {})\n return callServerApiRoute<TResponse>(app, method, matchPath, requestUrl, { ...ctx.req, body: payload, query }, ctx.res)\n }\n }\n\n const apiClient = {\n get: createMethod(\"get\"),\n post: createMethod(\"post\"),\n put: createMethod(\"put\"),\n delete: createMethod(\"delete\")\n }\n\n return apiClient\n}\n\nexport default getServerApiClient\n"],"mappings":"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"}
|