@mionjs/platform-vercel 0.8.0-alpha.0 → 0.8.4

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.
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const http = require("http");
4
4
  const https = require("https");
5
+ const router = require("@mionjs/router");
5
6
  const src_vercelHandler = require("./vercelHandler.cjs");
6
7
  const DEFAULT_DEV_SERVER_OPTIONS = {
7
8
  port: 3e3,
@@ -46,6 +47,7 @@ function startBunDevServer(handler, options) {
46
47
  fetch: handler.POST
47
48
  });
48
49
  console.log(`mion vercel dev server (bun) running on ${url}`);
50
+ router.setPlatformConfig({ ...options });
49
51
  const shutdownHandler = () => {
50
52
  console.log(`Shutting down mion vercel dev server on ${url}`);
51
53
  server.stop(true);
@@ -75,6 +77,7 @@ function startNodeDevServer(handler, options) {
75
77
  server.on("error", reject);
76
78
  server.listen(options.port, () => {
77
79
  console.log(`mion vercel dev server (node) running on ${options.protocol}://localhost:${options.port}`);
80
+ router.setPlatformConfig({ ...options });
78
81
  resolve(server);
79
82
  });
80
83
  const shutdownHandler = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"devServer.cjs","sources":["../../../src/devServer.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {createServer as createHttp} from 'http';\nimport {createServer as createHttps} from 'https';\nimport {createVercelHandler} from './vercelHandler.ts';\nimport type {DevServerOptions} from './types.ts';\nimport type {IncomingMessage, Server as HttpServer, ServerResponse} from 'http';\nimport type {Server as HttpsServer} from 'https';\n\nconst DEFAULT_DEV_SERVER_OPTIONS: DevServerOptions = {\n port: 3000,\n protocol: 'http',\n};\n\n/** Converts Node's IncomingMessage to a Web standard Request */\nasync function nodeIncomingToRequest(req: IncomingMessage): Promise<Request> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks);\n const host = req.headers.host || 'localhost';\n const protocol = 'http';\n const url = `${protocol}://${host}${req.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n return new Request(url, {\n method: req.method || 'GET',\n headers,\n body: body.length > 0 ? body : undefined,\n });\n}\n\n/** Writes a Web standard Response to Node's ServerResponse */\nasync function writeWebResponseToNode(webResponse: Response, res: ServerResponse): Promise<void> {\n res.statusCode = webResponse.status;\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n const buffer = Buffer.from(await webResponse.arrayBuffer());\n res.end(buffer);\n}\n\n/** Starts a dev server using Bun's native Request/Response support */\nfunction startBunDevServer(handler: ReturnType<typeof createVercelHandler>, options: DevServerOptions): any {\n const url = `${options.protocol}://localhost:${options.port}`;\n const server = (globalThis as any).Bun.serve({\n port: options.port,\n fetch: handler.POST,\n });\n console.log(`mion vercel dev server (bun) running on ${url}`);\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${url}`);\n server.stop(true);\n process.exit(0);\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n\n return server;\n}\n\n/** Starts a dev server using Node's http/https module with Request/Response adapters */\nfunction startNodeDevServer(\n handler: ReturnType<typeof createVercelHandler>,\n options: DevServerOptions\n): Promise<HttpServer | HttpsServer> {\n return new Promise((resolve, reject) => {\n const requestListener = async (req: IncomingMessage, res: ServerResponse) => {\n try {\n const webRequest = await nodeIncomingToRequest(req);\n const webResponse = await handler.POST(webRequest);\n await writeWebResponseToNode(webResponse, res);\n } catch (err) {\n if (!res.writableEnded) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n } else {\n console.error('Error handling request:', err);\n }\n }\n };\n\n const server = options.protocol === 'https' ? createHttps(requestListener) : createHttp(requestListener);\n\n server.on('error', reject);\n\n server.listen(options.port, () => {\n console.log(`mion vercel dev server (node) running on ${options.protocol}://localhost:${options.port}`);\n resolve(server);\n });\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${options.protocol}://localhost:${options.port}`);\n server.close(() => process.exit(0));\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n });\n}\n\n/** Starts a local dev server for the Vercel handler. Auto-detects Bun or Node runtime. */\nexport async function startVercelDevServer(options?: Partial<DevServerOptions>): Promise<HttpServer | HttpsServer | any> {\n const opts: DevServerOptions = {...DEFAULT_DEV_SERVER_OPTIONS, ...options};\n const handler = createVercelHandler();\n if (typeof (globalThis as any)?.Bun !== 'undefined') return startBunDevServer(handler, opts);\n return startNodeDevServer(handler, opts);\n}\n"],"names":["createHttps","createHttp","createVercelHandler"],"mappings":"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"}
1
+ {"version":3,"file":"devServer.cjs","sources":["../../../src/devServer.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {createServer as createHttp} from 'http';\nimport {createServer as createHttps} from 'https';\nimport {setPlatformConfig} from '@mionjs/router';\nimport {createVercelHandler} from './vercelHandler.ts';\nimport type {DevServerOptions} from './types.ts';\nimport type {IncomingMessage, Server as HttpServer, ServerResponse} from 'http';\nimport type {Server as HttpsServer} from 'https';\n\nconst DEFAULT_DEV_SERVER_OPTIONS: DevServerOptions = {\n port: 3000,\n protocol: 'http',\n};\n\n/** Converts Node's IncomingMessage to a Web standard Request */\nasync function nodeIncomingToRequest(req: IncomingMessage): Promise<Request> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks);\n const host = req.headers.host || 'localhost';\n const protocol = 'http';\n const url = `${protocol}://${host}${req.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n return new Request(url, {\n method: req.method || 'GET',\n headers,\n body: body.length > 0 ? body : undefined,\n });\n}\n\n/** Writes a Web standard Response to Node's ServerResponse */\nasync function writeWebResponseToNode(webResponse: Response, res: ServerResponse): Promise<void> {\n res.statusCode = webResponse.status;\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n const buffer = Buffer.from(await webResponse.arrayBuffer());\n res.end(buffer);\n}\n\n/** Starts a dev server using Bun's native Request/Response support */\nfunction startBunDevServer(handler: ReturnType<typeof createVercelHandler>, options: DevServerOptions): any {\n const url = `${options.protocol}://localhost:${options.port}`;\n const server = (globalThis as any).Bun.serve({\n port: options.port,\n fetch: handler.POST,\n });\n console.log(`mion vercel dev server (bun) running on ${url}`);\n setPlatformConfig({...options});\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${url}`);\n server.stop(true);\n process.exit(0);\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n\n return server;\n}\n\n/** Starts a dev server using Node's http/https module with Request/Response adapters */\nfunction startNodeDevServer(\n handler: ReturnType<typeof createVercelHandler>,\n options: DevServerOptions\n): Promise<HttpServer | HttpsServer> {\n return new Promise((resolve, reject) => {\n const requestListener = async (req: IncomingMessage, res: ServerResponse) => {\n try {\n const webRequest = await nodeIncomingToRequest(req);\n const webResponse = await handler.POST(webRequest);\n await writeWebResponseToNode(webResponse, res);\n } catch (err) {\n if (!res.writableEnded) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n } else {\n console.error('Error handling request:', err);\n }\n }\n };\n\n const server = options.protocol === 'https' ? createHttps(requestListener) : createHttp(requestListener);\n\n server.on('error', reject);\n\n server.listen(options.port, () => {\n console.log(`mion vercel dev server (node) running on ${options.protocol}://localhost:${options.port}`);\n setPlatformConfig({...options});\n resolve(server);\n });\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${options.protocol}://localhost:${options.port}`);\n server.close(() => process.exit(0));\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n });\n}\n\n/** Starts a local dev server for the Vercel handler. Auto-detects Bun or Node runtime. */\nexport async function startVercelDevServer(options?: Partial<DevServerOptions>): Promise<HttpServer | HttpsServer | any> {\n const opts: DevServerOptions = {...DEFAULT_DEV_SERVER_OPTIONS, ...options};\n const handler = createVercelHandler();\n if (typeof (globalThis as any)?.Bun !== 'undefined') return startBunDevServer(handler, opts);\n return startNodeDevServer(handler, opts);\n}\n"],"names":["setPlatformConfig","createHttps","createHttp","createVercelHandler"],"mappings":"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"}
@@ -16,6 +16,7 @@ function setVercelHandlerOpts(options) {
16
16
  ...options
17
17
  };
18
18
  defaultHeaders = [["server", "@mionjs"], ...Object.entries(vercelOptions.defaultResponseHeaders)];
19
+ router.setPlatformConfig({ ...vercelOptions });
19
20
  return vercelOptions;
20
21
  }
21
22
  async function handleRequest(req) {
@@ -54,7 +55,8 @@ async function handleRequest(req) {
54
55
  return fatalFail(error, responseHeaders);
55
56
  }
56
57
  }
57
- function createVercelHandler() {
58
+ function createVercelHandler(options) {
59
+ setVercelHandlerOpts(options);
58
60
  return {
59
61
  GET: handleRequest,
60
62
  POST: handleRequest,
@@ -1 +1 @@
1
- {"version":3,"file":"vercelHandler.cjs","sources":["../../../src/vercelHandler.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {dispatchRoute, getRouterFatalErrorResponse, resetRouter, decodeQueryBody, MionResponse} from '@mionjs/router';\nimport {DEFAULT_VERCEL_OPTIONS} from './constants.ts';\nimport type {VercelHandlerOptions} from './types.ts';\nimport {SerializerModes} from '@mionjs/core';\nimport type {SerializerCode} from '@mionjs/core';\nimport {RpcError} from '@mionjs/core';\n\n// ############# PRIVATE STATE #############\n\nlet vercelOptions: Readonly<VercelHandlerOptions> = {...DEFAULT_VERCEL_OPTIONS};\nlet defaultHeaders: [string, string][] = [['server', '@mionjs']];\n\nexport function resetVercelHandlerOpts() {\n vercelOptions = {...DEFAULT_VERCEL_OPTIONS};\n defaultHeaders = [['server', '@mionjs']];\n resetRouter();\n}\n\nexport function setVercelHandlerOpts(options?: Partial<VercelHandlerOptions>) {\n vercelOptions = {\n ...vercelOptions,\n ...options,\n };\n defaultHeaders = [['server', '@mionjs'], ...Object.entries(vercelOptions.defaultResponseHeaders)];\n return vercelOptions;\n}\n\n/** Main handler for Web standard Request -> Response */\nasync function handleRequest(req: Request): Promise<Response> {\n const reqUrl = req.url;\n const urlObj = new URL(reqUrl);\n const path = urlObj.pathname;\n const urlQuery = urlObj.search ? urlObj.search.slice(1) : undefined;\n const contentType = req.headers.get('content-type') || '';\n const isBinary = contentType.startsWith('application/octet-stream');\n let rawBody: any = req.body\n ? isBinary\n ? await req.arrayBuffer()\n : ((await req.json()) as Record<string, unknown>)\n : undefined;\n let reqBodyType: SerializerCode = isBinary ? SerializerModes.binary : SerializerModes.json;\n const queryBody = decodeQueryBody(urlQuery, rawBody);\n if (queryBody) {\n rawBody = queryBody.rawBody;\n reqBodyType = queryBody.bodyType;\n }\n const responseHeaders = new Headers(defaultHeaders);\n\n try {\n const platformResp = await dispatchRoute(\n path,\n rawBody,\n req.headers,\n responseHeaders,\n req,\n undefined,\n reqBodyType,\n urlQuery\n );\n return reply(platformResp, responseHeaders);\n } catch (e) {\n const error =\n e instanceof RpcError\n ? e\n : new RpcError({\n publicMessage: 'Unknown Error',\n type: 'unknown-error',\n originalError: e as Error,\n });\n return fatalFail(error, responseHeaders);\n }\n}\n\n/** Creates Next.js App Router / Vercel serverless route handlers */\nexport function createVercelHandler() {\n return {\n GET: handleRequest,\n POST: handleRequest,\n PUT: handleRequest,\n DELETE: handleRequest,\n PATCH: handleRequest,\n };\n}\n\nfunction fatalFail(err: RpcError<string>, responseHeaders: any): Response {\n const routeResponse = getRouterFatalErrorResponse(err, responseHeaders);\n return reply(routeResponse, responseHeaders);\n}\n\nfunction reply(mionResp: MionResponse, responseHeaders: any): Response {\n const bodyType = mionResp.serializer;\n switch (bodyType) {\n case SerializerModes.stringifyJson: {\n return new Response(mionResp.rawBody as string, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.json: {\n return Response.json(mionResp.body, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.binary: {\n const serializer = mionResp.binSerializer!;\n responseHeaders.set('content-length', String(serializer.getLength()));\n const response = new Response(serializer.getBufferView(), {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n serializer.markAsEnded();\n return response;\n }\n default: {\n const error = new RpcError({\n publicMessage: 'unknown-mion-response-format',\n type: 'unknown-error',\n errorData: {bodyType},\n });\n return fatalFail(error, responseHeaders);\n }\n }\n}\n"],"names":["DEFAULT_VERCEL_OPTIONS","resetRouter","SerializerModes","decodeQueryBody","dispatchRoute","RpcError","getRouterFatalErrorResponse"],"mappings":"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"}
1
+ {"version":3,"file":"vercelHandler.cjs","sources":["../../../src/vercelHandler.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {\n dispatchRoute,\n getRouterFatalErrorResponse,\n resetRouter,\n decodeQueryBody,\n setPlatformConfig,\n MionResponse,\n} from '@mionjs/router';\nimport {DEFAULT_VERCEL_OPTIONS} from './constants.ts';\nimport type {VercelHandlerOptions} from './types.ts';\nimport {SerializerModes} from '@mionjs/core';\nimport type {SerializerCode} from '@mionjs/core';\nimport {RpcError} from '@mionjs/core';\n\n// ############# PRIVATE STATE #############\n\nlet vercelOptions: Readonly<VercelHandlerOptions> = {...DEFAULT_VERCEL_OPTIONS};\nlet defaultHeaders: [string, string][] = [['server', '@mionjs']];\n\nexport function resetVercelHandlerOpts() {\n vercelOptions = {...DEFAULT_VERCEL_OPTIONS};\n defaultHeaders = [['server', '@mionjs']];\n resetRouter();\n}\n\nexport function setVercelHandlerOpts(options?: Partial<VercelHandlerOptions>) {\n vercelOptions = {\n ...vercelOptions,\n ...options,\n };\n defaultHeaders = [['server', '@mionjs'], ...Object.entries(vercelOptions.defaultResponseHeaders)];\n setPlatformConfig({...vercelOptions});\n return vercelOptions;\n}\n\n/** Main handler for Web standard Request -> Response */\nasync function handleRequest(req: Request): Promise<Response> {\n const reqUrl = req.url;\n const urlObj = new URL(reqUrl);\n const path = urlObj.pathname;\n const urlQuery = urlObj.search ? urlObj.search.slice(1) : undefined;\n const contentType = req.headers.get('content-type') || '';\n const isBinary = contentType.startsWith('application/octet-stream');\n let rawBody: any = req.body\n ? isBinary\n ? await req.arrayBuffer()\n : ((await req.json()) as Record<string, unknown>)\n : undefined;\n let reqBodyType: SerializerCode = isBinary ? SerializerModes.binary : SerializerModes.json;\n const queryBody = decodeQueryBody(urlQuery, rawBody);\n if (queryBody) {\n rawBody = queryBody.rawBody;\n reqBodyType = queryBody.bodyType;\n }\n const responseHeaders = new Headers(defaultHeaders);\n\n try {\n const platformResp = await dispatchRoute(\n path,\n rawBody,\n req.headers,\n responseHeaders,\n req,\n undefined,\n reqBodyType,\n urlQuery\n );\n return reply(platformResp, responseHeaders);\n } catch (e) {\n const error =\n e instanceof RpcError\n ? e\n : new RpcError({\n publicMessage: 'Unknown Error',\n type: 'unknown-error',\n originalError: e as Error,\n });\n return fatalFail(error, responseHeaders);\n }\n}\n\n/** Creates Next.js App Router / Vercel serverless route handlers */\nexport function createVercelHandler(options?: Partial<VercelHandlerOptions>) {\n setVercelHandlerOpts(options);\n return {\n GET: handleRequest,\n POST: handleRequest,\n PUT: handleRequest,\n DELETE: handleRequest,\n PATCH: handleRequest,\n };\n}\n\nfunction fatalFail(err: RpcError<string>, responseHeaders: any): Response {\n const routeResponse = getRouterFatalErrorResponse(err, responseHeaders);\n return reply(routeResponse, responseHeaders);\n}\n\nfunction reply(mionResp: MionResponse, responseHeaders: any): Response {\n const bodyType = mionResp.serializer;\n switch (bodyType) {\n case SerializerModes.stringifyJson: {\n return new Response(mionResp.rawBody as string, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.json: {\n return Response.json(mionResp.body, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.binary: {\n const serializer = mionResp.binSerializer!;\n responseHeaders.set('content-length', String(serializer.getLength()));\n const response = new Response(serializer.getBufferView(), {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n serializer.markAsEnded();\n return response;\n }\n default: {\n const error = new RpcError({\n publicMessage: 'unknown-mion-response-format',\n type: 'unknown-error',\n errorData: {bodyType},\n });\n return fatalFail(error, responseHeaders);\n }\n }\n}\n"],"names":["DEFAULT_VERCEL_OPTIONS","resetRouter","setPlatformConfig","SerializerModes","decodeQueryBody","dispatchRoute","RpcError","getRouterFatalErrorResponse"],"mappings":";;;;;AAuBA,IAAI,gBAAgD,EAAC,GAAGA,qCAAA;AACxD,IAAI,iBAAqC,CAAC,CAAC,UAAU,SAAS,CAAC;AAExD,SAAS,yBAAyB;AACrC,kBAAgB,EAAC,GAAGA,qCAAA;AACpB,mBAAiB,CAAC,CAAC,UAAU,SAAS,CAAC;AACvCC,qBAAA;AACJ;AAEO,SAAS,qBAAqB,SAAyC;AAC1E,kBAAgB;AAAA,IACZ,GAAG;AAAA,IACH,GAAG;AAAA,EAAA;AAEP,mBAAiB,CAAC,CAAC,UAAU,SAAS,GAAG,GAAG,OAAO,QAAQ,cAAc,sBAAsB,CAAC;AAChGC,2BAAkB,EAAC,GAAG,eAAc;AACpC,SAAO;AACX;AAGA,eAAe,cAAc,KAAiC;AAC1D,QAAM,SAAS,IAAI;AACnB,QAAM,SAAS,IAAI,IAAI,MAAM;AAC7B,QAAM,OAAO,OAAO;AACpB,QAAM,WAAW,OAAO,SAAS,OAAO,OAAO,MAAM,CAAC,IAAI;AAC1D,QAAM,cAAc,IAAI,QAAQ,IAAI,cAAc,KAAK;AACvD,QAAM,WAAW,YAAY,WAAW,0BAA0B;AAClE,MAAI,UAAe,IAAI,OACjB,WACI,MAAM,IAAI,gBACR,MAAM,IAAI,KAAA,IAChB;AACN,MAAI,cAA8B,WAAWC,KAAAA,gBAAgB,SAASA,KAAAA,gBAAgB;AACtF,QAAM,YAAYC,OAAAA,gBAAgB,UAAU,OAAO;AACnD,MAAI,WAAW;AACX,cAAU,UAAU;AACpB,kBAAc,UAAU;AAAA,EAC5B;AACA,QAAM,kBAAkB,IAAI,QAAQ,cAAc;AAElD,MAAI;AACA,UAAM,eAAe,MAAMC,OAAAA;AAAAA,MACvB;AAAA,MACA;AAAA,MACA,IAAI;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAEJ,WAAO,MAAM,cAAc,eAAe;AAAA,EAC9C,SAAS,GAAG;AACR,UAAM,QACF,aAAaC,KAAAA,WACP,IACA,IAAIA,KAAAA,SAAS;AAAA,MACT,eAAe;AAAA,MACf,MAAM;AAAA,MACN,eAAe;AAAA,IAAA,CAClB;AACX,WAAO,UAAU,OAAO,eAAe;AAAA,EAC3C;AACJ;AAGO,SAAS,oBAAoB,SAAyC;AACzE,uBAAqB,OAAO;AAC5B,SAAO;AAAA,IACH,KAAK;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,OAAO;AAAA,EAAA;AAEf;AAEA,SAAS,UAAU,KAAuB,iBAAgC;AACtE,QAAM,gBAAgBC,OAAAA,4BAA4B,KAAK,eAAe;AACtE,SAAO,MAAM,eAAe,eAAe;AAC/C;AAEA,SAAS,MAAM,UAAwB,iBAAgC;AACnE,QAAM,WAAW,SAAS;AAC1B,UAAQ,UAAA;AAAA,IACJ,KAAKJ,KAAAA,gBAAgB,eAAe;AAChC,aAAO,IAAI,SAAS,SAAS,SAAmB;AAAA,QAC5C,QAAQ,SAAS;AAAA,QACjB,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAAA,IACA,KAAKA,KAAAA,gBAAgB,MAAM;AACvB,aAAO,SAAS,KAAK,SAAS,MAAM;AAAA,QAChC,QAAQ,SAAS;AAAA,QACjB,SAAS;AAAA,MAAA,CACZ;AAAA,IACL;AAAA,IACA,KAAKA,KAAAA,gBAAgB,QAAQ;AACzB,YAAM,aAAa,SAAS;AAC5B,sBAAgB,IAAI,kBAAkB,OAAO,WAAW,UAAA,CAAW,CAAC;AACpE,YAAM,WAAW,IAAI,SAAS,WAAW,iBAAiB;AAAA,QACtD,QAAQ,SAAS;AAAA,QACjB,SAAS;AAAA,MAAA,CACZ;AACD,iBAAW,YAAA;AACX,aAAO;AAAA,IACX;AAAA,IACA,SAAS;AACL,YAAM,QAAQ,IAAIG,cAAS;AAAA,QACvB,eAAe;AAAA,QACf,MAAM;AAAA,QACN,WAAW,EAAC,SAAA;AAAA,MAAQ,CACvB;AACD,aAAO,UAAU,OAAO,eAAe;AAAA,IAC3C;AAAA,EAAA;AAER;;;;"}
@@ -2,7 +2,7 @@ import { VercelHandlerOptions } from './types.ts';
2
2
  export declare function resetVercelHandlerOpts(): void;
3
3
  export declare function setVercelHandlerOpts(options?: Partial<VercelHandlerOptions>): Readonly<VercelHandlerOptions>;
4
4
  declare function handleRequest(req: Request): Promise<Response>;
5
- export declare function createVercelHandler(): {
5
+ export declare function createVercelHandler(options?: Partial<VercelHandlerOptions>): {
6
6
  GET: typeof handleRequest;
7
7
  POST: typeof handleRequest;
8
8
  PUT: typeof handleRequest;
@@ -1,5 +1,6 @@
1
1
  import { createServer as createServer$1 } from "http";
2
2
  import { createServer } from "https";
3
+ import { setPlatformConfig } from "@mionjs/router";
3
4
  import { createVercelHandler } from "./vercelHandler.js";
4
5
  const DEFAULT_DEV_SERVER_OPTIONS = {
5
6
  port: 3e3,
@@ -44,6 +45,7 @@ function startBunDevServer(handler, options) {
44
45
  fetch: handler.POST
45
46
  });
46
47
  console.log(`mion vercel dev server (bun) running on ${url}`);
48
+ setPlatformConfig({ ...options });
47
49
  const shutdownHandler = () => {
48
50
  console.log(`Shutting down mion vercel dev server on ${url}`);
49
51
  server.stop(true);
@@ -73,6 +75,7 @@ function startNodeDevServer(handler, options) {
73
75
  server.on("error", reject);
74
76
  server.listen(options.port, () => {
75
77
  console.log(`mion vercel dev server (node) running on ${options.protocol}://localhost:${options.port}`);
78
+ setPlatformConfig({ ...options });
76
79
  resolve(server);
77
80
  });
78
81
  const shutdownHandler = () => {
@@ -1 +1 @@
1
- {"version":3,"file":"devServer.js","sources":["../../../src/devServer.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {createServer as createHttp} from 'http';\nimport {createServer as createHttps} from 'https';\nimport {createVercelHandler} from './vercelHandler.ts';\nimport type {DevServerOptions} from './types.ts';\nimport type {IncomingMessage, Server as HttpServer, ServerResponse} from 'http';\nimport type {Server as HttpsServer} from 'https';\n\nconst DEFAULT_DEV_SERVER_OPTIONS: DevServerOptions = {\n port: 3000,\n protocol: 'http',\n};\n\n/** Converts Node's IncomingMessage to a Web standard Request */\nasync function nodeIncomingToRequest(req: IncomingMessage): Promise<Request> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks);\n const host = req.headers.host || 'localhost';\n const protocol = 'http';\n const url = `${protocol}://${host}${req.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n return new Request(url, {\n method: req.method || 'GET',\n headers,\n body: body.length > 0 ? body : undefined,\n });\n}\n\n/** Writes a Web standard Response to Node's ServerResponse */\nasync function writeWebResponseToNode(webResponse: Response, res: ServerResponse): Promise<void> {\n res.statusCode = webResponse.status;\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n const buffer = Buffer.from(await webResponse.arrayBuffer());\n res.end(buffer);\n}\n\n/** Starts a dev server using Bun's native Request/Response support */\nfunction startBunDevServer(handler: ReturnType<typeof createVercelHandler>, options: DevServerOptions): any {\n const url = `${options.protocol}://localhost:${options.port}`;\n const server = (globalThis as any).Bun.serve({\n port: options.port,\n fetch: handler.POST,\n });\n console.log(`mion vercel dev server (bun) running on ${url}`);\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${url}`);\n server.stop(true);\n process.exit(0);\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n\n return server;\n}\n\n/** Starts a dev server using Node's http/https module with Request/Response adapters */\nfunction startNodeDevServer(\n handler: ReturnType<typeof createVercelHandler>,\n options: DevServerOptions\n): Promise<HttpServer | HttpsServer> {\n return new Promise((resolve, reject) => {\n const requestListener = async (req: IncomingMessage, res: ServerResponse) => {\n try {\n const webRequest = await nodeIncomingToRequest(req);\n const webResponse = await handler.POST(webRequest);\n await writeWebResponseToNode(webResponse, res);\n } catch (err) {\n if (!res.writableEnded) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n } else {\n console.error('Error handling request:', err);\n }\n }\n };\n\n const server = options.protocol === 'https' ? createHttps(requestListener) : createHttp(requestListener);\n\n server.on('error', reject);\n\n server.listen(options.port, () => {\n console.log(`mion vercel dev server (node) running on ${options.protocol}://localhost:${options.port}`);\n resolve(server);\n });\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${options.protocol}://localhost:${options.port}`);\n server.close(() => process.exit(0));\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n });\n}\n\n/** Starts a local dev server for the Vercel handler. Auto-detects Bun or Node runtime. */\nexport async function startVercelDevServer(options?: Partial<DevServerOptions>): Promise<HttpServer | HttpsServer | any> {\n const opts: DevServerOptions = {...DEFAULT_DEV_SERVER_OPTIONS, ...options};\n const handler = createVercelHandler();\n if (typeof (globalThis as any)?.Bun !== 'undefined') return startBunDevServer(handler, opts);\n return startNodeDevServer(handler, opts);\n}\n"],"names":["createHttps","createHttp"],"mappings":"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"}
1
+ {"version":3,"file":"devServer.js","sources":["../../../src/devServer.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {createServer as createHttp} from 'http';\nimport {createServer as createHttps} from 'https';\nimport {setPlatformConfig} from '@mionjs/router';\nimport {createVercelHandler} from './vercelHandler.ts';\nimport type {DevServerOptions} from './types.ts';\nimport type {IncomingMessage, Server as HttpServer, ServerResponse} from 'http';\nimport type {Server as HttpsServer} from 'https';\n\nconst DEFAULT_DEV_SERVER_OPTIONS: DevServerOptions = {\n port: 3000,\n protocol: 'http',\n};\n\n/** Converts Node's IncomingMessage to a Web standard Request */\nasync function nodeIncomingToRequest(req: IncomingMessage): Promise<Request> {\n const chunks: Buffer[] = [];\n for await (const chunk of req) {\n chunks.push(chunk as Buffer);\n }\n const body = Buffer.concat(chunks);\n const host = req.headers.host || 'localhost';\n const protocol = 'http';\n const url = `${protocol}://${host}${req.url || '/'}`;\n const headers = new Headers();\n for (const [key, value] of Object.entries(req.headers)) {\n if (value === undefined) continue;\n if (Array.isArray(value)) {\n for (const v of value) headers.append(key, v);\n } else {\n headers.set(key, value);\n }\n }\n return new Request(url, {\n method: req.method || 'GET',\n headers,\n body: body.length > 0 ? body : undefined,\n });\n}\n\n/** Writes a Web standard Response to Node's ServerResponse */\nasync function writeWebResponseToNode(webResponse: Response, res: ServerResponse): Promise<void> {\n res.statusCode = webResponse.status;\n webResponse.headers.forEach((value, key) => {\n res.setHeader(key, value);\n });\n const buffer = Buffer.from(await webResponse.arrayBuffer());\n res.end(buffer);\n}\n\n/** Starts a dev server using Bun's native Request/Response support */\nfunction startBunDevServer(handler: ReturnType<typeof createVercelHandler>, options: DevServerOptions): any {\n const url = `${options.protocol}://localhost:${options.port}`;\n const server = (globalThis as any).Bun.serve({\n port: options.port,\n fetch: handler.POST,\n });\n console.log(`mion vercel dev server (bun) running on ${url}`);\n setPlatformConfig({...options});\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${url}`);\n server.stop(true);\n process.exit(0);\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n\n return server;\n}\n\n/** Starts a dev server using Node's http/https module with Request/Response adapters */\nfunction startNodeDevServer(\n handler: ReturnType<typeof createVercelHandler>,\n options: DevServerOptions\n): Promise<HttpServer | HttpsServer> {\n return new Promise((resolve, reject) => {\n const requestListener = async (req: IncomingMessage, res: ServerResponse) => {\n try {\n const webRequest = await nodeIncomingToRequest(req);\n const webResponse = await handler.POST(webRequest);\n await writeWebResponseToNode(webResponse, res);\n } catch (err) {\n if (!res.writableEnded) {\n res.statusCode = 500;\n res.end('Internal Server Error');\n } else {\n console.error('Error handling request:', err);\n }\n }\n };\n\n const server = options.protocol === 'https' ? createHttps(requestListener) : createHttp(requestListener);\n\n server.on('error', reject);\n\n server.listen(options.port, () => {\n console.log(`mion vercel dev server (node) running on ${options.protocol}://localhost:${options.port}`);\n setPlatformConfig({...options});\n resolve(server);\n });\n\n const shutdownHandler = () => {\n console.log(`Shutting down mion vercel dev server on ${options.protocol}://localhost:${options.port}`);\n server.close(() => process.exit(0));\n };\n process.on('SIGINT', shutdownHandler);\n process.on('SIGTERM', shutdownHandler);\n });\n}\n\n/** Starts a local dev server for the Vercel handler. Auto-detects Bun or Node runtime. */\nexport async function startVercelDevServer(options?: Partial<DevServerOptions>): Promise<HttpServer | HttpsServer | any> {\n const opts: DevServerOptions = {...DEFAULT_DEV_SERVER_OPTIONS, ...options};\n const handler = createVercelHandler();\n if (typeof (globalThis as any)?.Bun !== 'undefined') return startBunDevServer(handler, opts);\n return startNodeDevServer(handler, opts);\n}\n"],"names":["createHttps","createHttp"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { VercelHandlerOptions } from './types.ts';
2
2
  export declare function resetVercelHandlerOpts(): void;
3
3
  export declare function setVercelHandlerOpts(options?: Partial<VercelHandlerOptions>): Readonly<VercelHandlerOptions>;
4
4
  declare function handleRequest(req: Request): Promise<Response>;
5
- export declare function createVercelHandler(): {
5
+ export declare function createVercelHandler(options?: Partial<VercelHandlerOptions>): {
6
6
  GET: typeof handleRequest;
7
7
  POST: typeof handleRequest;
8
8
  PUT: typeof handleRequest;
@@ -1,4 +1,4 @@
1
- import { resetRouter, decodeQueryBody, dispatchRoute, getRouterFatalErrorResponse } from "@mionjs/router";
1
+ import { resetRouter, setPlatformConfig, decodeQueryBody, dispatchRoute, getRouterFatalErrorResponse } from "@mionjs/router";
2
2
  import { DEFAULT_VERCEL_OPTIONS } from "./constants.js";
3
3
  import { SerializerModes, RpcError } from "@mionjs/core";
4
4
  let vercelOptions = { ...DEFAULT_VERCEL_OPTIONS };
@@ -14,6 +14,7 @@ function setVercelHandlerOpts(options) {
14
14
  ...options
15
15
  };
16
16
  defaultHeaders = [["server", "@mionjs"], ...Object.entries(vercelOptions.defaultResponseHeaders)];
17
+ setPlatformConfig({ ...vercelOptions });
17
18
  return vercelOptions;
18
19
  }
19
20
  async function handleRequest(req) {
@@ -52,7 +53,8 @@ async function handleRequest(req) {
52
53
  return fatalFail(error, responseHeaders);
53
54
  }
54
55
  }
55
- function createVercelHandler() {
56
+ function createVercelHandler(options) {
57
+ setVercelHandlerOpts(options);
56
58
  return {
57
59
  GET: handleRequest,
58
60
  POST: handleRequest,
@@ -1 +1 @@
1
- {"version":3,"file":"vercelHandler.js","sources":["../../../src/vercelHandler.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {dispatchRoute, getRouterFatalErrorResponse, resetRouter, decodeQueryBody, MionResponse} from '@mionjs/router';\nimport {DEFAULT_VERCEL_OPTIONS} from './constants.ts';\nimport type {VercelHandlerOptions} from './types.ts';\nimport {SerializerModes} from '@mionjs/core';\nimport type {SerializerCode} from '@mionjs/core';\nimport {RpcError} from '@mionjs/core';\n\n// ############# PRIVATE STATE #############\n\nlet vercelOptions: Readonly<VercelHandlerOptions> = {...DEFAULT_VERCEL_OPTIONS};\nlet defaultHeaders: [string, string][] = [['server', '@mionjs']];\n\nexport function resetVercelHandlerOpts() {\n vercelOptions = {...DEFAULT_VERCEL_OPTIONS};\n defaultHeaders = [['server', '@mionjs']];\n resetRouter();\n}\n\nexport function setVercelHandlerOpts(options?: Partial<VercelHandlerOptions>) {\n vercelOptions = {\n ...vercelOptions,\n ...options,\n };\n defaultHeaders = [['server', '@mionjs'], ...Object.entries(vercelOptions.defaultResponseHeaders)];\n return vercelOptions;\n}\n\n/** Main handler for Web standard Request -> Response */\nasync function handleRequest(req: Request): Promise<Response> {\n const reqUrl = req.url;\n const urlObj = new URL(reqUrl);\n const path = urlObj.pathname;\n const urlQuery = urlObj.search ? urlObj.search.slice(1) : undefined;\n const contentType = req.headers.get('content-type') || '';\n const isBinary = contentType.startsWith('application/octet-stream');\n let rawBody: any = req.body\n ? isBinary\n ? await req.arrayBuffer()\n : ((await req.json()) as Record<string, unknown>)\n : undefined;\n let reqBodyType: SerializerCode = isBinary ? SerializerModes.binary : SerializerModes.json;\n const queryBody = decodeQueryBody(urlQuery, rawBody);\n if (queryBody) {\n rawBody = queryBody.rawBody;\n reqBodyType = queryBody.bodyType;\n }\n const responseHeaders = new Headers(defaultHeaders);\n\n try {\n const platformResp = await dispatchRoute(\n path,\n rawBody,\n req.headers,\n responseHeaders,\n req,\n undefined,\n reqBodyType,\n urlQuery\n );\n return reply(platformResp, responseHeaders);\n } catch (e) {\n const error =\n e instanceof RpcError\n ? e\n : new RpcError({\n publicMessage: 'Unknown Error',\n type: 'unknown-error',\n originalError: e as Error,\n });\n return fatalFail(error, responseHeaders);\n }\n}\n\n/** Creates Next.js App Router / Vercel serverless route handlers */\nexport function createVercelHandler() {\n return {\n GET: handleRequest,\n POST: handleRequest,\n PUT: handleRequest,\n DELETE: handleRequest,\n PATCH: handleRequest,\n };\n}\n\nfunction fatalFail(err: RpcError<string>, responseHeaders: any): Response {\n const routeResponse = getRouterFatalErrorResponse(err, responseHeaders);\n return reply(routeResponse, responseHeaders);\n}\n\nfunction reply(mionResp: MionResponse, responseHeaders: any): Response {\n const bodyType = mionResp.serializer;\n switch (bodyType) {\n case SerializerModes.stringifyJson: {\n return new Response(mionResp.rawBody as string, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.json: {\n return Response.json(mionResp.body, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.binary: {\n const serializer = mionResp.binSerializer!;\n responseHeaders.set('content-length', String(serializer.getLength()));\n const response = new Response(serializer.getBufferView(), {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n serializer.markAsEnded();\n return response;\n }\n default: {\n const error = new RpcError({\n publicMessage: 'unknown-mion-response-format',\n type: 'unknown-error',\n errorData: {bodyType},\n });\n return fatalFail(error, responseHeaders);\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vercelHandler.js","sources":["../../../src/vercelHandler.ts"],"sourcesContent":["/* ########\n * 2025 mion\n * Author: Ma-jerez\n * License: MIT\n * The software is provided \"as is\", without warranty of any kind.\n * ######## */\n\nimport {\n dispatchRoute,\n getRouterFatalErrorResponse,\n resetRouter,\n decodeQueryBody,\n setPlatformConfig,\n MionResponse,\n} from '@mionjs/router';\nimport {DEFAULT_VERCEL_OPTIONS} from './constants.ts';\nimport type {VercelHandlerOptions} from './types.ts';\nimport {SerializerModes} from '@mionjs/core';\nimport type {SerializerCode} from '@mionjs/core';\nimport {RpcError} from '@mionjs/core';\n\n// ############# PRIVATE STATE #############\n\nlet vercelOptions: Readonly<VercelHandlerOptions> = {...DEFAULT_VERCEL_OPTIONS};\nlet defaultHeaders: [string, string][] = [['server', '@mionjs']];\n\nexport function resetVercelHandlerOpts() {\n vercelOptions = {...DEFAULT_VERCEL_OPTIONS};\n defaultHeaders = [['server', '@mionjs']];\n resetRouter();\n}\n\nexport function setVercelHandlerOpts(options?: Partial<VercelHandlerOptions>) {\n vercelOptions = {\n ...vercelOptions,\n ...options,\n };\n defaultHeaders = [['server', '@mionjs'], ...Object.entries(vercelOptions.defaultResponseHeaders)];\n setPlatformConfig({...vercelOptions});\n return vercelOptions;\n}\n\n/** Main handler for Web standard Request -> Response */\nasync function handleRequest(req: Request): Promise<Response> {\n const reqUrl = req.url;\n const urlObj = new URL(reqUrl);\n const path = urlObj.pathname;\n const urlQuery = urlObj.search ? urlObj.search.slice(1) : undefined;\n const contentType = req.headers.get('content-type') || '';\n const isBinary = contentType.startsWith('application/octet-stream');\n let rawBody: any = req.body\n ? isBinary\n ? await req.arrayBuffer()\n : ((await req.json()) as Record<string, unknown>)\n : undefined;\n let reqBodyType: SerializerCode = isBinary ? SerializerModes.binary : SerializerModes.json;\n const queryBody = decodeQueryBody(urlQuery, rawBody);\n if (queryBody) {\n rawBody = queryBody.rawBody;\n reqBodyType = queryBody.bodyType;\n }\n const responseHeaders = new Headers(defaultHeaders);\n\n try {\n const platformResp = await dispatchRoute(\n path,\n rawBody,\n req.headers,\n responseHeaders,\n req,\n undefined,\n reqBodyType,\n urlQuery\n );\n return reply(platformResp, responseHeaders);\n } catch (e) {\n const error =\n e instanceof RpcError\n ? e\n : new RpcError({\n publicMessage: 'Unknown Error',\n type: 'unknown-error',\n originalError: e as Error,\n });\n return fatalFail(error, responseHeaders);\n }\n}\n\n/** Creates Next.js App Router / Vercel serverless route handlers */\nexport function createVercelHandler(options?: Partial<VercelHandlerOptions>) {\n setVercelHandlerOpts(options);\n return {\n GET: handleRequest,\n POST: handleRequest,\n PUT: handleRequest,\n DELETE: handleRequest,\n PATCH: handleRequest,\n };\n}\n\nfunction fatalFail(err: RpcError<string>, responseHeaders: any): Response {\n const routeResponse = getRouterFatalErrorResponse(err, responseHeaders);\n return reply(routeResponse, responseHeaders);\n}\n\nfunction reply(mionResp: MionResponse, responseHeaders: any): Response {\n const bodyType = mionResp.serializer;\n switch (bodyType) {\n case SerializerModes.stringifyJson: {\n return new Response(mionResp.rawBody as string, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.json: {\n return Response.json(mionResp.body, {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n }\n case SerializerModes.binary: {\n const serializer = mionResp.binSerializer!;\n responseHeaders.set('content-length', String(serializer.getLength()));\n const response = new Response(serializer.getBufferView(), {\n status: mionResp.statusCode,\n headers: responseHeaders,\n });\n serializer.markAsEnded();\n return response;\n }\n default: {\n const error = new RpcError({\n publicMessage: 'unknown-mion-response-format',\n type: 'unknown-error',\n errorData: {bodyType},\n });\n return fatalFail(error, responseHeaders);\n }\n }\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mionjs/platform-vercel",
3
- "version": "0.8.0-alpha.0",
3
+ "version": "0.8.4",
4
4
  "type": "module",
5
5
  "description": "mion adapter for Vercel serverless functions",
6
6
  "keywords": [
@@ -57,8 +57,8 @@
57
57
  "url": "https://github.com/MionKit/mion/issues"
58
58
  },
59
59
  "dependencies": {
60
- "@mionjs/core": "^0.8.0-alpha.0",
61
- "@mionjs/router": "^0.8.0-alpha.0"
60
+ "@mionjs/core": "^0.8.4",
61
+ "@mionjs/router": "^0.8.4"
62
62
  },
63
- "gitHead": "5d2ec524ba39d040338ce8946d8edf78aa7291a3"
63
+ "gitHead": "c53dbf8bc494d950876e0bf171cb15078356a6cf"
64
64
  }