@rpcbase/client 0.385.0 → 0.386.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/errorReporting-CVoUUKxW.js.map +1 -1
- package/dist/{getServerApiClient-BYu8h5Zd.js → getServerApiClient-C1UInaMF.js} +26 -6
- package/dist/{getServerApiClient-BYu8h5Zd.js.map → getServerApiClient-C1UInaMF.js.map} +1 -1
- package/dist/index.js +1056 -384
- package/dist/index.js.map +1 -1
- package/dist/instrument.js +6 -2
- package/dist/instrument.js.map +1 -1
- package/dist/rts/index.js +1 -1
- package/dist/{useQuery-ZWQYk25K.js → useQuery-DImVXkBa.js} +353 -197
- package/dist/{useQuery-ZWQYk25K.js.map → useQuery-DImVXkBa.js.map} +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errorReporting-CVoUUKxW.js","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"],"names":[],"mappings":"AAOA,
|
|
1
|
+
{"version":3,"file":"errorReporting-CVoUUKxW.js","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"],"names":["reporter","setClientExceptionReporter","next","reportClientException","error","context","err","Error","String","reportError","console"],"mappings":"AAOA,IAAIA;AAEG,MAAMC,6BAA6BA,CAACC,SAA8C;AACvFF,aAAWE;AACb;AAEO,MAAMC,wBAAwBA,CAACC,OAAgBC,UAAkC,OAAO;AAC7F,MAAI,CAACD,MAAO;AAEZ,QAAME,MAAMF,iBAAiBG,QAAQH,QAAQ,IAAIG,MAAMC,OAAOJ,KAAK,CAAC;AAEpE,MAAI;AACFJ,eAAWM,KAAKD,OAAO;AAAA,EACzB,SAASI,aAAa;AACpBC,YAAQN,MAAM,yCAAyCK,WAAW;AAAA,EACpE;AACF;"}
|
|
@@ -128,7 +128,11 @@ const getServerApiClient = async (app) => {
|
|
|
128
128
|
}
|
|
129
129
|
const matchPath = url.pathname;
|
|
130
130
|
const requestUrl = `${matchPath}${searchParams.toString() ? `?${searchParams.toString()}` : ""}`;
|
|
131
|
-
return {
|
|
131
|
+
return {
|
|
132
|
+
matchPath,
|
|
133
|
+
requestUrl,
|
|
134
|
+
query
|
|
135
|
+
};
|
|
132
136
|
};
|
|
133
137
|
const createMethod = (method) => {
|
|
134
138
|
return async (path, payload, ctx) => {
|
|
@@ -137,11 +141,27 @@ const getServerApiClient = async (app) => {
|
|
|
137
141
|
}
|
|
138
142
|
const normalizedMethod = method.toLowerCase();
|
|
139
143
|
if (normalizedMethod === "get") {
|
|
140
|
-
const {
|
|
141
|
-
|
|
144
|
+
const {
|
|
145
|
+
matchPath: matchPath2,
|
|
146
|
+
requestUrl: requestUrl2,
|
|
147
|
+
query: query2
|
|
148
|
+
} = buildQuery(path, payload);
|
|
149
|
+
return callRoute(app, method, matchPath2, requestUrl2, {
|
|
150
|
+
...ctx.req,
|
|
151
|
+
body: {},
|
|
152
|
+
query: query2
|
|
153
|
+
}, ctx.res);
|
|
142
154
|
}
|
|
143
|
-
const {
|
|
144
|
-
|
|
155
|
+
const {
|
|
156
|
+
matchPath,
|
|
157
|
+
requestUrl,
|
|
158
|
+
query
|
|
159
|
+
} = buildQuery(path, {});
|
|
160
|
+
return callRoute(app, method, matchPath, requestUrl, {
|
|
161
|
+
...ctx.req,
|
|
162
|
+
body: payload,
|
|
163
|
+
query
|
|
164
|
+
}, ctx.res);
|
|
145
165
|
};
|
|
146
166
|
};
|
|
147
167
|
const apiClient = {
|
|
@@ -156,4 +176,4 @@ export {
|
|
|
156
176
|
getServerApiClient as default,
|
|
157
177
|
getServerApiClient
|
|
158
178
|
};
|
|
159
|
-
//# sourceMappingURL=getServerApiClient-
|
|
179
|
+
//# sourceMappingURL=getServerApiClient-C1UInaMF.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getServerApiClient-BYu8h5Zd.js","sources":["../src/apiClient/getServerApiClient.ts"],"sourcesContent":["import { Application, IRouter, Request, Response } from \"express\"\nimport type { Ctx } from \"@rpcbase/api\"\n\n\ntype NextMiddleware = (err?: unknown) => void\ntype LayerHandler = (req: Request, res: Response, next: NextMiddleware) => void\n\ntype RouterLayer = {\n name: string\n match: (path: string) => boolean\n handle: LayerHandler\n route?: {\n methods: Record<string, boolean | undefined>\n path: string\n stack: Array<{ handle: LayerHandler }>\n }\n}\n\n\nexport const getServerApiClient = async(app: Application) => {\n const callRoute = async <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> => {\n return new Promise((resolve, reject) => {\n let isEnded = false\n let timeoutId: ReturnType<typeof setTimeout> | null = null\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 mockReq = {\n ...req,\n method: method.toUpperCase(),\n url: requestUrl\n } as Request\n\n const mockRes = {\n ...res,\n json: (data: unknown) => {\n resolveRequest(data as TResponse)\n },\n status: (statusCode: number) => {\n console.log(\"Status:\", statusCode, mockReq.method, mockReq.url)\n return mockRes\n },\n } as Response\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 processLayer = async (index: number) => {\n if (index >= apiStack.length || isEnded) return\n\n const layer = apiStack[index]\n\n const isNonMatchingLayer = !layer.match(matchPath)\n if (isNonMatchingLayer) {\n // console.log(\"not machthing route:\", matchPath, \"to layer:\", index, layer.name, layer, \"reason: \", {isNonMatchingLayer})\n await processLayer(index + 1)\n return\n }\n\n const runHandler = async(handler: LayerHandler) => new Promise<void>((resolveMiddleware, rejectMiddleware) => {\n handler(mockReq, mockRes, (err?: unknown) => {\n if (err) {\n console.error(\"Middleware error:\", err)\n rejectMiddleware(err)\n return\n }\n resolveMiddleware()\n })\n })\n\n if (layer.route) {\n if (!layer.route.methods[method.toLowerCase()]) {\n // console.log(\"not machthing route:\", matchPath, \"to route layer:\", index, layer.name, layer, \"reason: method not matching\")\n await processLayer(index + 1)\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 await runHandler(layer.route.stack[0].handle)\n\n } else {\n await runHandler(layer.handle)\n }\n\n if (!isEnded) {\n await processLayer(index + 1)\n }\n }\n\n void processLayer(0).catch((err) => {\n rejectRequest(err)\n })\n\n // Set a timeout to prevent hanging\n timeoutId = setTimeout(() => {\n rejectRequest(new Error(\"Route handler timed out\"))\n }, 30000)\n })\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 ctx?: Ctx,\n ): Promise<TResponse> => {\n if (!ctx) {\n throw new Error(\"Context must be provided in SSR mode\")\n }\n\n const normalizedMethod = method.toLowerCase()\n\n if (normalizedMethod === \"get\") {\n const { matchPath, requestUrl, query } = buildQuery(path, payload)\n return callRoute<TResponse>(app, method, matchPath, requestUrl, { ...ctx.req, body: {}, query }, ctx.res)\n }\n\n const { matchPath, requestUrl, query } = buildQuery(path, {})\n return callRoute<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"],"names":["app","converted","matchPath","requestUrl","query"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"getServerApiClient-C1UInaMF.js","sources":["../src/apiClient/getServerApiClient.ts"],"sourcesContent":["import { Application, IRouter, Request, Response } from \"express\"\nimport type { Ctx } from \"@rpcbase/api\"\n\n\ntype NextMiddleware = (err?: unknown) => void\ntype LayerHandler = (req: Request, res: Response, next: NextMiddleware) => void\n\ntype RouterLayer = {\n name: string\n match: (path: string) => boolean\n handle: LayerHandler\n route?: {\n methods: Record<string, boolean | undefined>\n path: string\n stack: Array<{ handle: LayerHandler }>\n }\n}\n\n\nexport const getServerApiClient = async(app: Application) => {\n const callRoute = async <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> => {\n return new Promise((resolve, reject) => {\n let isEnded = false\n let timeoutId: ReturnType<typeof setTimeout> | null = null\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 mockReq = {\n ...req,\n method: method.toUpperCase(),\n url: requestUrl\n } as Request\n\n const mockRes = {\n ...res,\n json: (data: unknown) => {\n resolveRequest(data as TResponse)\n },\n status: (statusCode: number) => {\n console.log(\"Status:\", statusCode, mockReq.method, mockReq.url)\n return mockRes\n },\n } as Response\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 processLayer = async (index: number) => {\n if (index >= apiStack.length || isEnded) return\n\n const layer = apiStack[index]\n\n const isNonMatchingLayer = !layer.match(matchPath)\n if (isNonMatchingLayer) {\n // console.log(\"not machthing route:\", matchPath, \"to layer:\", index, layer.name, layer, \"reason: \", {isNonMatchingLayer})\n await processLayer(index + 1)\n return\n }\n\n const runHandler = async(handler: LayerHandler) => new Promise<void>((resolveMiddleware, rejectMiddleware) => {\n handler(mockReq, mockRes, (err?: unknown) => {\n if (err) {\n console.error(\"Middleware error:\", err)\n rejectMiddleware(err)\n return\n }\n resolveMiddleware()\n })\n })\n\n if (layer.route) {\n if (!layer.route.methods[method.toLowerCase()]) {\n // console.log(\"not machthing route:\", matchPath, \"to route layer:\", index, layer.name, layer, \"reason: method not matching\")\n await processLayer(index + 1)\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 await runHandler(layer.route.stack[0].handle)\n\n } else {\n await runHandler(layer.handle)\n }\n\n if (!isEnded) {\n await processLayer(index + 1)\n }\n }\n\n void processLayer(0).catch((err) => {\n rejectRequest(err)\n })\n\n // Set a timeout to prevent hanging\n timeoutId = setTimeout(() => {\n rejectRequest(new Error(\"Route handler timed out\"))\n }, 30000)\n })\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 ctx?: Ctx,\n ): Promise<TResponse> => {\n if (!ctx) {\n throw new Error(\"Context must be provided in SSR mode\")\n }\n\n const normalizedMethod = method.toLowerCase()\n\n if (normalizedMethod === \"get\") {\n const { matchPath, requestUrl, query } = buildQuery(path, payload)\n return callRoute<TResponse>(app, method, matchPath, requestUrl, { ...ctx.req, body: {}, query }, ctx.res)\n }\n\n const { matchPath, requestUrl, query } = buildQuery(path, {})\n return callRoute<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"],"names":["getServerApiClient","app","callRoute","method","matchPath","requestUrl","req","res","Promise","resolve","reject","isEnded","timeoutId","resolveRequest","data","rejectRequest","error","mockReq","toUpperCase","url","mockRes","json","status","statusCode","console","log","routerStack","router","stack","firstApiMiddlewareIndex","findIndex","layer","name","Error","apiStack","slice","processLayer","index","length","isNonMatchingLayer","match","runHandler","handler","resolveMiddleware","rejectMiddleware","err","route","methods","toLowerCase","path","handle","catch","setTimeout","mergeQueryValues","target","key","value","existing","Array","isArray","push","toQueryValue","Number","isFinite","String","Date","toISOString","buildQuery","payload","URL","query","searchParams","rawValue","Object","entries","item","converted","URLSearchParams","append","pathname","toString","createMethod","ctx","normalizedMethod","body","apiClient","get","post","put","delete"],"mappings":"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"}
|