@milaboratories/pframes-rs-serv 1.0.63 → 1.0.64

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.
@@ -1 +1 @@
1
- {"version":3,"file":"export.cjs","sources":["../src/export.ts"],"sourcesContent":["import { RequestListener } from 'http';\nimport { FileSystemStore } from './fs-store';\nimport { createRequestHandler } from './handler';\nimport { serve } from './serve';\nimport { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\nexport const HttpHelpers: PFrameInternal.HttpHelpers = {\n createFsStore: async (\n options: PFrameInternal.FsStoreOptions\n ): Promise<PFrameInternal.ObjectStore> => {\n return await FileSystemStore.init(options);\n },\n createRequestHandler: (\n options: PFrameInternal.RequestHandlerOptions\n ): RequestListener => {\n return createRequestHandler(options);\n },\n createHttpServer: async (\n options: PFrameInternal.HttpServerOptions\n ): Promise<PFrameInternal.HttpServer> => {\n return await serve(options);\n }\n};\n"],"names":["FileSystemStore","createRequestHandler","serve"],"mappings":";;;;;;AAMO,MAAM,WAAW,GAA+B;AACrD,IAAA,aAAa,EAAE,OACb,OAAsC,KACC;AACvC,QAAA,OAAO,MAAMA,uBAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5C,CAAC;AACD,IAAA,oBAAoB,EAAE,CACpB,OAA6C,KAC1B;AACnB,QAAA,OAAOC,4BAAoB,CAAC,OAAO,CAAC;IACtC,CAAC;AACD,IAAA,gBAAgB,EAAE,OAChB,OAAyC,KACH;AACtC,QAAA,OAAO,MAAMC,WAAK,CAAC,OAAO,CAAC;IAC7B;;;;;"}
1
+ {"version":3,"file":"export.cjs","sources":["../src/export.ts"],"sourcesContent":["import type { RequestListener } from 'node:http';\nimport { FileSystemStore } from './fs-store';\nimport { createRequestHandler } from './handler';\nimport { serve } from './serve';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\nexport const HttpHelpers: PFrameInternal.HttpHelpers = {\n createFsStore: async (\n options: PFrameInternal.FsStoreOptions\n ): Promise<PFrameInternal.ObjectStore> => {\n return await FileSystemStore.init(options);\n },\n createRequestHandler: (\n options: PFrameInternal.RequestHandlerOptions\n ): RequestListener => {\n return createRequestHandler(options);\n },\n createHttpServer: async (\n options: PFrameInternal.HttpServerOptions\n ): Promise<PFrameInternal.HttpServer> => {\n return await serve(options);\n }\n};\n"],"names":["FileSystemStore","createRequestHandler","serve"],"mappings":";;;;;;AAMO,MAAM,WAAW,GAA+B;AACrD,IAAA,aAAa,EAAE,OACb,OAAsC,KACC;AACvC,QAAA,OAAO,MAAMA,uBAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5C,CAAC;AACD,IAAA,oBAAoB,EAAE,CACpB,OAA6C,KAC1B;AACnB,QAAA,OAAOC,4BAAoB,CAAC,OAAO,CAAC;IACtC,CAAC;AACD,IAAA,gBAAgB,EAAE,OAChB,OAAyC,KACH;AACtC,QAAA,OAAO,MAAMC,WAAK,CAAC,OAAO,CAAC;IAC7B;;;;;"}
package/dist/export.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
2
  export declare const HttpHelpers: PFrameInternal.HttpHelpers;
3
3
  //# sourceMappingURL=export.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,WAgBxC,CAAC"}
1
+ {"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../src/export.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E,eAAO,MAAM,WAAW,EAAE,cAAc,CAAC,WAgBxC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sources":["../src/export.ts"],"sourcesContent":["import { RequestListener } from 'http';\nimport { FileSystemStore } from './fs-store';\nimport { createRequestHandler } from './handler';\nimport { serve } from './serve';\nimport { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\nexport const HttpHelpers: PFrameInternal.HttpHelpers = {\n createFsStore: async (\n options: PFrameInternal.FsStoreOptions\n ): Promise<PFrameInternal.ObjectStore> => {\n return await FileSystemStore.init(options);\n },\n createRequestHandler: (\n options: PFrameInternal.RequestHandlerOptions\n ): RequestListener => {\n return createRequestHandler(options);\n },\n createHttpServer: async (\n options: PFrameInternal.HttpServerOptions\n ): Promise<PFrameInternal.HttpServer> => {\n return await serve(options);\n }\n};\n"],"names":[],"mappings":";;;;AAMO,MAAM,WAAW,GAA+B;AACrD,IAAA,aAAa,EAAE,OACb,OAAsC,KACC;AACvC,QAAA,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5C,CAAC;AACD,IAAA,oBAAoB,EAAE,CACpB,OAA6C,KAC1B;AACnB,QAAA,OAAO,oBAAoB,CAAC,OAAO,CAAC;IACtC,CAAC;AACD,IAAA,gBAAgB,EAAE,OAChB,OAAyC,KACH;AACtC,QAAA,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC;IAC7B;;;;;"}
1
+ {"version":3,"file":"export.js","sources":["../src/export.ts"],"sourcesContent":["import type { RequestListener } from 'node:http';\nimport { FileSystemStore } from './fs-store';\nimport { createRequestHandler } from './handler';\nimport { serve } from './serve';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\nexport const HttpHelpers: PFrameInternal.HttpHelpers = {\n createFsStore: async (\n options: PFrameInternal.FsStoreOptions\n ): Promise<PFrameInternal.ObjectStore> => {\n return await FileSystemStore.init(options);\n },\n createRequestHandler: (\n options: PFrameInternal.RequestHandlerOptions\n ): RequestListener => {\n return createRequestHandler(options);\n },\n createHttpServer: async (\n options: PFrameInternal.HttpServerOptions\n ): Promise<PFrameInternal.HttpServer> => {\n return await serve(options);\n }\n};\n"],"names":[],"mappings":";;;;AAMO,MAAM,WAAW,GAA+B;AACrD,IAAA,aAAa,EAAE,OACb,OAAsC,KACC;AACvC,QAAA,OAAO,MAAM,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC;IAC5C,CAAC;AACD,IAAA,oBAAoB,EAAE,CACpB,OAA6C,KAC1B;AACnB,QAAA,OAAO,oBAAoB,CAAC,OAAO,CAAC;IACtC,CAAC;AACD,IAAA,gBAAgB,EAAE,OAChB,OAAyC,KACH;AACtC,QAAA,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC;IAC7B;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"serve.cjs","sources":["../src/serve.ts"],"sourcesContent":["import {\n createServer as createHttpServer,\n RequestListener,\n type Server as HttpServer,\n type ServerOptions\n} from 'node:http';\nimport {\n createServer as createHttpsServer,\n Server as HttpsServer\n} from 'node:https';\nimport { AddressInfo } from 'node:net';\nimport { Deferred } from '@milaboratories/helpers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport {\n base64Encode,\n Base64Encoded,\n ensureError,\n PFrameError\n} from '@milaboratories/pl-model-common';\nimport { generate, type GenerateResult } from 'selfsigned';\nimport { randomUUID } from 'node:crypto';\nimport { authorizeRequestHandler } from './handler';\n\n/** Generate a self-signed certificate for localhost */\nasync function generateCertificate(): Promise<GenerateResult> {\n const generateResult = new Deferred<GenerateResult>();\n generate(\n [{ name: 'commonName', value: 'localhost' }],\n {\n keySize: 2048,\n algorithm: 'sha256',\n extensions: [\n {\n name: 'subjectAltName',\n altNames: [\n { type: 2, value: 'localhost' }, // DNS\n { type: 7, ip: '127.0.0.1' }, // IPv4\n { type: 7, ip: '::1' } // IPv6\n ]\n }\n ]\n },\n (error, result) => {\n if (error) {\n generateResult.reject(error);\n } else {\n generateResult.resolve(result);\n }\n }\n );\n return await generateResult.promise;\n}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(\n info: AddressInfo,\n http?: true\n): PFrameInternal.ObjectStoreUrl {\n const protocol = http ? 'http' : 'https';\n switch (info.family) {\n case 'IPv4':\n return `${protocol}://${info.address}:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n case 'IPv6':\n return `${protocol}://[${info.address}]:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n default:\n throw new PFrameError(\n `PFrame helper HTTP(S) server bound to 'localhost' has unknown address family: ${info.family}`\n );\n }\n}\n\n/**\n * Serve HTTP requests using the provided handler.\n * Returns a promise that resolves when the server is stopped.\n */\nexport async function serve({\n handler,\n port = 0,\n http,\n noAuth\n}: PFrameInternal.HttpServerOptions): Promise<PFrameInternal.HttpServer> {\n const started = new Deferred<PFrameInternal.HttpServer>();\n try {\n let stopped: Deferred<void> | null = null;\n\n let authToken: PFrameInternal.HttpAuthorizationToken | undefined;\n let effectiveHandler: RequestListener = handler;\n if (!noAuth) {\n authToken = randomUUID() as PFrameInternal.HttpAuthorizationToken;\n effectiveHandler = authorizeRequestHandler(effectiveHandler, authToken);\n }\n\n // Create HTTP server\n let certificateBase64:\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true\n };\n let server: HttpServer | HttpsServer;\n\n if (http) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n certificateBase64 = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer(\n { ...defaultOptions, cert, key, ca },\n effectiveHandler\n );\n }\n\n const abortController = new AbortController();\n server\n .on('listening', () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const address = createObjectStoreUrl(\n server.address() as AddressInfo,\n http\n );\n stopped = new Deferred<void>();\n\n started.resolve({\n get address(): PFrameInternal.ObjectStoreUrl {\n return address;\n },\n get authToken(): PFrameInternal.HttpAuthorizationToken | undefined {\n return authToken;\n },\n get encodedCaCert():\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined {\n return certificateBase64;\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n abortController.abort();\n return stopped!.promise;\n }\n });\n })\n .on('error', (err) => {\n started.reject(err);\n stopped?.reject(err);\n })\n .on('close', () => stopped?.resolve())\n .listen({\n host: 'localhost',\n port,\n signal: abortController.signal\n });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"names":["Deferred","generate","PFrameError","handler","randomUUID","authorizeRequestHandler","createHttpServer","base64Encode","createHttpsServer","ensureError"],"mappings":"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"}
1
+ {"version":3,"file":"serve.cjs","sources":["../src/serve.ts"],"sourcesContent":["import {\n createServer as createHttpServer,\n type RequestListener,\n type Server as HttpServer,\n type ServerOptions\n} from 'node:http';\nimport {\n createServer as createHttpsServer,\n type Server as HttpsServer\n} from 'node:https';\nimport type { AddressInfo } from 'node:net';\nimport { Deferred } from '@milaboratories/helpers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport {\n base64Encode,\n Base64Encoded,\n ensureError,\n PFrameError\n} from '@milaboratories/pl-model-common';\nimport { generate, type GenerateResult } from 'selfsigned';\nimport { randomUUID } from 'node:crypto';\nimport { authorizeRequestHandler } from './handler';\n\n/** Generate a self-signed certificate for localhost */\nasync function generateCertificate(): Promise<GenerateResult> {\n const generateResult = new Deferred<GenerateResult>();\n generate(\n [{ name: 'commonName', value: 'localhost' }],\n {\n keySize: 2048,\n algorithm: 'sha256',\n extensions: [\n {\n name: 'subjectAltName',\n altNames: [\n { type: 2, value: 'localhost' }, // DNS\n { type: 7, ip: '127.0.0.1' }, // IPv4\n { type: 7, ip: '::1' } // IPv6\n ]\n }\n ]\n },\n (error, result) => {\n if (error) {\n generateResult.reject(error);\n } else {\n generateResult.resolve(result);\n }\n }\n );\n return await generateResult.promise;\n}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(\n info: AddressInfo,\n http?: true\n): PFrameInternal.ObjectStoreUrl {\n const protocol = http ? 'http' : 'https';\n switch (info.family) {\n case 'IPv4':\n return `${protocol}://${info.address}:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n case 'IPv6':\n return `${protocol}://[${info.address}]:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n default:\n throw new PFrameError(\n `PFrame helper HTTP(S) server bound to 'localhost' has unknown address family: ${info.family}`\n );\n }\n}\n\n/**\n * Serve HTTP requests using the provided handler.\n * Returns a promise that resolves when the server is stopped.\n */\nexport async function serve({\n handler,\n port = 0,\n http,\n noAuth\n}: PFrameInternal.HttpServerOptions): Promise<PFrameInternal.HttpServer> {\n const started = new Deferred<PFrameInternal.HttpServer>();\n try {\n let stopped: Deferred<void> | null = null;\n\n let authToken: PFrameInternal.HttpAuthorizationToken | undefined;\n let effectiveHandler: RequestListener = handler;\n if (!noAuth) {\n authToken = randomUUID() as PFrameInternal.HttpAuthorizationToken;\n effectiveHandler = authorizeRequestHandler(effectiveHandler, authToken);\n }\n\n // Create HTTP server\n let certificateBase64:\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true\n };\n let server: HttpServer | HttpsServer;\n\n if (http) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n certificateBase64 = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer(\n { ...defaultOptions, cert, key, ca },\n effectiveHandler\n );\n }\n\n const abortController = new AbortController();\n server\n .on('listening', () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const address = createObjectStoreUrl(\n server.address() as AddressInfo,\n http\n );\n stopped = new Deferred<void>();\n\n started.resolve({\n get address(): PFrameInternal.ObjectStoreUrl {\n return address;\n },\n get authToken(): PFrameInternal.HttpAuthorizationToken | undefined {\n return authToken;\n },\n get encodedCaCert():\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined {\n return certificateBase64;\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n abortController.abort();\n return stopped!.promise;\n }\n });\n })\n .on('error', (err) => {\n started.reject(err);\n stopped?.reject(err);\n })\n .on('close', () => stopped?.resolve())\n .listen({\n host: 'localhost',\n port,\n signal: abortController.signal\n });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"names":["Deferred","generate","PFrameError","handler","randomUUID","authorizeRequestHandler","createHttpServer","base64Encode","createHttpsServer","ensureError"],"mappings":";;;;;;;;;;AAuBA;AACA,eAAe,mBAAmB,GAAA;AAChC,IAAA,MAAM,cAAc,GAAG,IAAIA,gBAAQ,EAAkB;AACrD,IAAAC,mBAAQ,CACN,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAC5C;AACE,QAAA,OAAO,EAAE,IAAI;AACb,QAAA,SAAS,EAAE,QAAQ;AACnB,QAAA,UAAU,EAAE;AACV,YAAA;AACE,gBAAA,IAAI,EAAE,gBAAgB;AACtB,gBAAA,QAAQ,EAAE;oBACR,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE;oBAC/B,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,WAAW,EAAE;oBAC5B,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE;AACvB;AACF;AACF;AACF,KAAA,EACD,CAAC,KAAK,EAAE,MAAM,KAAI;QAChB,IAAI,KAAK,EAAE;AACT,YAAA,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC;QAC9B;aAAO;AACL,YAAA,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC;QAChC;AACF,IAAA,CAAC,CACF;AACD,IAAA,OAAO,MAAM,cAAc,CAAC,OAAO;AACrC;AAEA;AACA,SAAS,oBAAoB,CAC3B,IAAiB,EACjB,IAAW,EAAA;IAEX,MAAM,QAAQ,GAAG,IAAI,GAAG,MAAM,GAAG,OAAO;AACxC,IAAA,QAAQ,IAAI,CAAC,MAAM;AACjB,QAAA,KAAK,MAAM;YACT,OAAO,CAAA,EAAG,QAAQ,CAAA,GAAA,EAAM,IAAI,CAAC,OAAO,CAAA,CAAA,EAAI,IAAI,CAAC,IAAI,CAAA,CAAA,CAAoC;AACvF,QAAA,KAAK,MAAM;YACT,OAAO,CAAA,EAAG,QAAQ,CAAA,IAAA,EAAO,IAAI,CAAC,OAAO,CAAA,EAAA,EAAK,IAAI,CAAC,IAAI,CAAA,CAAA,CAAoC;AACzF,QAAA;YACE,MAAM,IAAIC,yBAAW,CACnB,CAAA,8EAAA,EAAiF,IAAI,CAAC,MAAM,CAAA,CAAE,CAC/F;;AAEP;AAEA;;;AAGG;AACI,eAAe,KAAK,CAAC,WAC1BC,SAAO,EACP,IAAI,GAAG,CAAC,EACR,IAAI,EACJ,MAAM,EAC2B,EAAA;AACjC,IAAA,MAAM,OAAO,GAAG,IAAIH,gBAAQ,EAA6B;AACzD,IAAA,IAAI;QACF,IAAI,OAAO,GAA0B,IAAI;AAEzC,QAAA,IAAI,SAA4D;QAChE,IAAI,gBAAgB,GAAoBG,SAAO;QAC/C,IAAI,CAAC,MAAM,EAAE;YACX,SAAS,GAAGC,sBAAU,EAA2C;AACjE,YAAA,gBAAgB,GAAGC,+BAAuB,CAAC,gBAAgB,EAAE,SAAS,CAAC;QACzE;;AAGA,QAAA,IAAI,iBAES;AACb,QAAA,MAAM,cAAc,GAAkB;AACpC,YAAA,SAAS,EAAE;SACZ;AACD,QAAA,IAAI,MAAgC;QAEpC,IAAI,IAAI,EAAE;AACR,YAAA,MAAM,GAAGC,sBAAgB,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAC7D;aAAO;AACL,YAAA,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,mBAAmB,EAAE;AACtE,YAAA,iBAAiB,GAAGC,0BAAY,CAAC,IAAqC,CAAC;AACvE,YAAA,MAAM,GAAGC,uBAAiB,CACxB,EAAE,GAAG,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EACpC,gBAAgB,CACjB;QACH;AAEA,QAAA,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE;QAC7C;AACG,aAAA,EAAE,CAAC,WAAW,EAAE,MAAK;;YAEpB,MAAM,OAAO,GAAG,oBAAoB,CAClC,MAAM,CAAC,OAAO,EAAiB,EAC/B,IAAI,CACL;AACD,YAAA,OAAO,GAAG,IAAIR,gBAAQ,EAAQ;YAE9B,OAAO,CAAC,OAAO,CAAC;AACd,gBAAA,IAAI,OAAO,GAAA;AACT,oBAAA,OAAO,OAAO;gBAChB,CAAC;AACD,gBAAA,IAAI,SAAS,GAAA;AACX,oBAAA,OAAO,SAAS;gBAClB,CAAC;AACD,gBAAA,IAAI,aAAa,GAAA;AAGf,oBAAA,OAAO,iBAAiB;gBAC1B,CAAC;AACD,gBAAA,IAAI,OAAO,GAAA;oBACT,OAAO,OAAQ,CAAC,OAAO;gBACzB,CAAC;gBACD,IAAI,GAAA;oBACF,eAAe,CAAC,KAAK,EAAE;oBACvB,OAAO,OAAQ,CAAC,OAAO;gBACzB;AACD,aAAA,CAAC;AACJ,QAAA,CAAC;AACA,aAAA,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,KAAI;AACnB,YAAA,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;AACnB,YAAA,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC;AACtB,QAAA,CAAC;aACA,EAAE,CAAC,OAAO,EAAE,MAAM,OAAO,EAAE,OAAO,EAAE;AACpC,aAAA,MAAM,CAAC;AACN,YAAA,IAAI,EAAE,WAAW;YACjB,IAAI;YACJ,MAAM,EAAE,eAAe,CAAC;AACzB,SAAA,CAAC;IACN;IAAE,OAAO,KAAc,EAAE;QACvB,OAAO,CAAC,MAAM,CAACS,yBAAW,CAAC,KAAK,CAAC,CAAC;IACpC;IAEA,OAAO,OAAO,CAAC,OAAO;AACxB;;;;"}
package/dist/serve.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"serve.js","sources":["../src/serve.ts"],"sourcesContent":["import {\n createServer as createHttpServer,\n RequestListener,\n type Server as HttpServer,\n type ServerOptions\n} from 'node:http';\nimport {\n createServer as createHttpsServer,\n Server as HttpsServer\n} from 'node:https';\nimport { AddressInfo } from 'node:net';\nimport { Deferred } from '@milaboratories/helpers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport {\n base64Encode,\n Base64Encoded,\n ensureError,\n PFrameError\n} from '@milaboratories/pl-model-common';\nimport { generate, type GenerateResult } from 'selfsigned';\nimport { randomUUID } from 'node:crypto';\nimport { authorizeRequestHandler } from './handler';\n\n/** Generate a self-signed certificate for localhost */\nasync function generateCertificate(): Promise<GenerateResult> {\n const generateResult = new Deferred<GenerateResult>();\n generate(\n [{ name: 'commonName', value: 'localhost' }],\n {\n keySize: 2048,\n algorithm: 'sha256',\n extensions: [\n {\n name: 'subjectAltName',\n altNames: [\n { type: 2, value: 'localhost' }, // DNS\n { type: 7, ip: '127.0.0.1' }, // IPv4\n { type: 7, ip: '::1' } // IPv6\n ]\n }\n ]\n },\n (error, result) => {\n if (error) {\n generateResult.reject(error);\n } else {\n generateResult.resolve(result);\n }\n }\n );\n return await generateResult.promise;\n}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(\n info: AddressInfo,\n http?: true\n): PFrameInternal.ObjectStoreUrl {\n const protocol = http ? 'http' : 'https';\n switch (info.family) {\n case 'IPv4':\n return `${protocol}://${info.address}:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n case 'IPv6':\n return `${protocol}://[${info.address}]:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n default:\n throw new PFrameError(\n `PFrame helper HTTP(S) server bound to 'localhost' has unknown address family: ${info.family}`\n );\n }\n}\n\n/**\n * Serve HTTP requests using the provided handler.\n * Returns a promise that resolves when the server is stopped.\n */\nexport async function serve({\n handler,\n port = 0,\n http,\n noAuth\n}: PFrameInternal.HttpServerOptions): Promise<PFrameInternal.HttpServer> {\n const started = new Deferred<PFrameInternal.HttpServer>();\n try {\n let stopped: Deferred<void> | null = null;\n\n let authToken: PFrameInternal.HttpAuthorizationToken | undefined;\n let effectiveHandler: RequestListener = handler;\n if (!noAuth) {\n authToken = randomUUID() as PFrameInternal.HttpAuthorizationToken;\n effectiveHandler = authorizeRequestHandler(effectiveHandler, authToken);\n }\n\n // Create HTTP server\n let certificateBase64:\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true\n };\n let server: HttpServer | HttpsServer;\n\n if (http) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n certificateBase64 = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer(\n { ...defaultOptions, cert, key, ca },\n effectiveHandler\n );\n }\n\n const abortController = new AbortController();\n server\n .on('listening', () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const address = createObjectStoreUrl(\n server.address() as AddressInfo,\n http\n );\n stopped = new Deferred<void>();\n\n started.resolve({\n get address(): PFrameInternal.ObjectStoreUrl {\n return address;\n },\n get authToken(): PFrameInternal.HttpAuthorizationToken | undefined {\n return authToken;\n },\n get encodedCaCert():\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined {\n return certificateBase64;\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n abortController.abort();\n return stopped!.promise;\n }\n });\n })\n .on('error', (err) => {\n started.reject(err);\n stopped?.reject(err);\n })\n .on('close', () => stopped?.resolve())\n .listen({\n host: 'localhost',\n port,\n signal: abortController.signal\n });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"names":["createHttpServer","createHttpsServer"],"mappings":"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"}
1
+ {"version":3,"file":"serve.js","sources":["../src/serve.ts"],"sourcesContent":["import {\n createServer as createHttpServer,\n type RequestListener,\n type Server as HttpServer,\n type ServerOptions\n} from 'node:http';\nimport {\n createServer as createHttpsServer,\n type Server as HttpsServer\n} from 'node:https';\nimport type { AddressInfo } from 'node:net';\nimport { Deferred } from '@milaboratories/helpers';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport {\n base64Encode,\n Base64Encoded,\n ensureError,\n PFrameError\n} from '@milaboratories/pl-model-common';\nimport { generate, type GenerateResult } from 'selfsigned';\nimport { randomUUID } from 'node:crypto';\nimport { authorizeRequestHandler } from './handler';\n\n/** Generate a self-signed certificate for localhost */\nasync function generateCertificate(): Promise<GenerateResult> {\n const generateResult = new Deferred<GenerateResult>();\n generate(\n [{ name: 'commonName', value: 'localhost' }],\n {\n keySize: 2048,\n algorithm: 'sha256',\n extensions: [\n {\n name: 'subjectAltName',\n altNames: [\n { type: 2, value: 'localhost' }, // DNS\n { type: 7, ip: '127.0.0.1' }, // IPv4\n { type: 7, ip: '::1' } // IPv6\n ]\n }\n ]\n },\n (error, result) => {\n if (error) {\n generateResult.reject(error);\n } else {\n generateResult.resolve(result);\n }\n }\n );\n return await generateResult.promise;\n}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(\n info: AddressInfo,\n http?: true\n): PFrameInternal.ObjectStoreUrl {\n const protocol = http ? 'http' : 'https';\n switch (info.family) {\n case 'IPv4':\n return `${protocol}://${info.address}:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n case 'IPv6':\n return `${protocol}://[${info.address}]:${info.port}/` as PFrameInternal.ObjectStoreUrl;\n default:\n throw new PFrameError(\n `PFrame helper HTTP(S) server bound to 'localhost' has unknown address family: ${info.family}`\n );\n }\n}\n\n/**\n * Serve HTTP requests using the provided handler.\n * Returns a promise that resolves when the server is stopped.\n */\nexport async function serve({\n handler,\n port = 0,\n http,\n noAuth\n}: PFrameInternal.HttpServerOptions): Promise<PFrameInternal.HttpServer> {\n const started = new Deferred<PFrameInternal.HttpServer>();\n try {\n let stopped: Deferred<void> | null = null;\n\n let authToken: PFrameInternal.HttpAuthorizationToken | undefined;\n let effectiveHandler: RequestListener = handler;\n if (!noAuth) {\n authToken = randomUUID() as PFrameInternal.HttpAuthorizationToken;\n effectiveHandler = authorizeRequestHandler(effectiveHandler, authToken);\n }\n\n // Create HTTP server\n let certificateBase64:\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true\n };\n let server: HttpServer | HttpsServer;\n\n if (http) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n certificateBase64 = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer(\n { ...defaultOptions, cert, key, ca },\n effectiveHandler\n );\n }\n\n const abortController = new AbortController();\n server\n .on('listening', () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const address = createObjectStoreUrl(\n server.address() as AddressInfo,\n http\n );\n stopped = new Deferred<void>();\n\n started.resolve({\n get address(): PFrameInternal.ObjectStoreUrl {\n return address;\n },\n get authToken(): PFrameInternal.HttpAuthorizationToken | undefined {\n return authToken;\n },\n get encodedCaCert():\n | Base64Encoded<PFrameInternal.PemCertificate>\n | undefined {\n return certificateBase64;\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n abortController.abort();\n return stopped!.promise;\n }\n });\n })\n .on('error', (err) => {\n started.reject(err);\n stopped?.reject(err);\n })\n .on('close', () => stopped?.resolve())\n .listen({\n host: 'localhost',\n port,\n signal: abortController.signal\n });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"names":["createHttpServer","createHttpsServer"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"etag.cjs","sources":["../../src/utils/etag.ts"],"sourcesContent":["import { Branded } from '@milaboratories/pl-model-common';\nimport { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\n/**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-8.8.3>\n *\n * Examples:\n *\n * ```text\n * ETag: \"xyzzy\"\n * ETag: W/\"xyzzy\"\n * ```\n */\nexport type Etag = Branded<string, 'Etag'>;\n\nexport function createETag(filename: PFrameInternal.ParquetFileName): Etag {\n // For immutable files, use URL-safe base64 encoded filename as ETag\n const filenameETag = Buffer.from(filename, 'utf8').toString('base64url');\n return `\"${filenameETag}\"` as Etag;\n}\n"],"names":[],"mappings":";;AAeM,SAAU,UAAU,CAAC,QAAwC,EAAA;;AAEjE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACxE,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAW;AACpC;;;;"}
1
+ {"version":3,"file":"etag.cjs","sources":["../../src/utils/etag.ts"],"sourcesContent":["import type { Branded } from '@milaboratories/pl-model-common';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\n/**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-8.8.3>\n *\n * Examples:\n *\n * ```text\n * ETag: \"xyzzy\"\n * ETag: W/\"xyzzy\"\n * ```\n */\nexport type Etag = Branded<string, 'Etag'>;\n\nexport function createETag(filename: PFrameInternal.ParquetFileName): Etag {\n // For immutable files, use URL-safe base64 encoded filename as ETag\n const filenameETag = Buffer.from(filename, 'utf8').toString('base64url');\n return `\"${filenameETag}\"` as Etag;\n}\n"],"names":[],"mappings":";;AAeM,SAAU,UAAU,CAAC,QAAwC,EAAA;;AAEjE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACxE,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAW;AACpC;;;;"}
@@ -1,5 +1,5 @@
1
- import { Branded } from '@milaboratories/pl-model-common';
2
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
1
+ import type { Branded } from '@milaboratories/pl-model-common';
2
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
3
3
  /**
4
4
  * See <https://datatracker.ietf.org/doc/html/rfc9110#section-8.8.3>
5
5
  *
@@ -1 +1 @@
1
- {"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../../src/utils/etag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAEvE;;;;;;;;;GASG;AACH,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,eAAe,GAAG,IAAI,CAIzE"}
1
+ {"version":3,"file":"etag.d.ts","sourceRoot":"","sources":["../../src/utils/etag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAE5E;;;;;;;;;GASG;AACH,MAAM,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE3C,wBAAgB,UAAU,CAAC,QAAQ,EAAE,cAAc,CAAC,eAAe,GAAG,IAAI,CAIzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"etag.js","sources":["../../src/utils/etag.ts"],"sourcesContent":["import { Branded } from '@milaboratories/pl-model-common';\nimport { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\n/**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-8.8.3>\n *\n * Examples:\n *\n * ```text\n * ETag: \"xyzzy\"\n * ETag: W/\"xyzzy\"\n * ```\n */\nexport type Etag = Branded<string, 'Etag'>;\n\nexport function createETag(filename: PFrameInternal.ParquetFileName): Etag {\n // For immutable files, use URL-safe base64 encoded filename as ETag\n const filenameETag = Buffer.from(filename, 'utf8').toString('base64url');\n return `\"${filenameETag}\"` as Etag;\n}\n"],"names":[],"mappings":"AAeM,SAAU,UAAU,CAAC,QAAwC,EAAA;;AAEjE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACxE,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAW;AACpC;;;;"}
1
+ {"version":3,"file":"etag.js","sources":["../../src/utils/etag.ts"],"sourcesContent":["import type { Branded } from '@milaboratories/pl-model-common';\nimport type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\n\n/**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-8.8.3>\n *\n * Examples:\n *\n * ```text\n * ETag: \"xyzzy\"\n * ETag: W/\"xyzzy\"\n * ```\n */\nexport type Etag = Branded<string, 'Etag'>;\n\nexport function createETag(filename: PFrameInternal.ParquetFileName): Etag {\n // For immutable files, use URL-safe base64 encoded filename as ETag\n const filenameETag = Buffer.from(filename, 'utf8').toString('base64url');\n return `\"${filenameETag}\"` as Etag;\n}\n"],"names":[],"mappings":"AAeM,SAAU,UAAU,CAAC,QAAwC,EAAA;;AAEjE,IAAA,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;IACxE,OAAO,CAAA,CAAA,EAAI,YAAY,CAAA,CAAA,CAAW;AACpC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"filename.cjs","sources":["../../src/utils/filename.ts"],"sourcesContent":["import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { IncomingMessage } from 'node:http';\n\nconst PARQUET_FILENAME_REGEX = /^\\/([\\w\\-.]+.parquet)$/;\n\nexport function getFilenameFromUrl(\n request: IncomingMessage\n): PFrameInternal.ParquetFileName | null {\n const url = request.url;\n if (url === undefined) return null;\n\n const match = url.match(PARQUET_FILENAME_REGEX);\n if (!match) return null;\n\n return match[1] as PFrameInternal.ParquetFileName;\n}\n"],"names":[],"mappings":";;AAGA,MAAM,sBAAsB,GAAG,wBAAwB;AAEjD,SAAU,kBAAkB,CAChC,OAAwB,EAAA;AAExB,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;IACvB,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IAElC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAC/C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;AAEvB,IAAA,OAAO,KAAK,CAAC,CAAC,CAAmC;AACnD;;;;"}
1
+ {"version":3,"file":"filename.cjs","sources":["../../src/utils/filename.ts"],"sourcesContent":["import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { IncomingMessage } from 'node:http';\n\nconst PARQUET_FILENAME_REGEX = /^\\/([\\w\\-.]+.parquet)$/;\n\nexport function getFilenameFromUrl(\n request: IncomingMessage\n): PFrameInternal.ParquetFileName | null {\n const url = request.url;\n if (url === undefined) return null;\n\n const match = url.match(PARQUET_FILENAME_REGEX);\n if (!match) return null;\n\n return match[1] as PFrameInternal.ParquetFileName;\n}\n"],"names":[],"mappings":";;AAGA,MAAM,sBAAsB,GAAG,wBAAwB;AAEjD,SAAU,kBAAkB,CAChC,OAAwB,EAAA;AAExB,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;IACvB,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IAElC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAC/C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;AAEvB,IAAA,OAAO,KAAK,CAAC,CAAC,CAAmC;AACnD;;;;"}
@@ -1,4 +1,4 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
- import { IncomingMessage } from 'node:http';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
+ import type { IncomingMessage } from 'node:http';
3
3
  export declare function getFilenameFromUrl(request: IncomingMessage): PFrameInternal.ParquetFileName | null;
4
4
  //# sourceMappingURL=filename.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filename.d.ts","sourceRoot":"","sources":["../../src/utils/filename.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAI5C,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,eAAe,GAAG,IAAI,CAQvC"}
1
+ {"version":3,"file":"filename.d.ts","sourceRoot":"","sources":["../../src/utils/filename.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAIjD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,eAAe,GAAG,IAAI,CAQvC"}
@@ -1 +1 @@
1
- {"version":3,"file":"filename.js","sources":["../../src/utils/filename.ts"],"sourcesContent":["import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { IncomingMessage } from 'node:http';\n\nconst PARQUET_FILENAME_REGEX = /^\\/([\\w\\-.]+.parquet)$/;\n\nexport function getFilenameFromUrl(\n request: IncomingMessage\n): PFrameInternal.ParquetFileName | null {\n const url = request.url;\n if (url === undefined) return null;\n\n const match = url.match(PARQUET_FILENAME_REGEX);\n if (!match) return null;\n\n return match[1] as PFrameInternal.ParquetFileName;\n}\n"],"names":[],"mappings":"AAGA,MAAM,sBAAsB,GAAG,wBAAwB;AAEjD,SAAU,kBAAkB,CAChC,OAAwB,EAAA;AAExB,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;IACvB,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IAElC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAC/C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;AAEvB,IAAA,OAAO,KAAK,CAAC,CAAC,CAAmC;AACnD;;;;"}
1
+ {"version":3,"file":"filename.js","sources":["../../src/utils/filename.ts"],"sourcesContent":["import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { IncomingMessage } from 'node:http';\n\nconst PARQUET_FILENAME_REGEX = /^\\/([\\w\\-.]+.parquet)$/;\n\nexport function getFilenameFromUrl(\n request: IncomingMessage\n): PFrameInternal.ParquetFileName | null {\n const url = request.url;\n if (url === undefined) return null;\n\n const match = url.match(PARQUET_FILENAME_REGEX);\n if (!match) return null;\n\n return match[1] as PFrameInternal.ParquetFileName;\n}\n"],"names":[],"mappings":"AAGA,MAAM,sBAAsB,GAAG,wBAAwB;AAEjD,SAAU,kBAAkB,CAChC,OAAwB,EAAA;AAExB,IAAA,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG;IACvB,IAAI,GAAG,KAAK,SAAS;AAAE,QAAA,OAAO,IAAI;IAElC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAC/C,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;AAEvB,IAAA,OAAO,KAAK,CAAC,CAAC,CAAmC;AACnD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"headers.cjs","sources":["../../src/utils/headers.ts"],"sourcesContent":["'use strict';\n\n/** HTTP header names used in the parquet server handler */\nexport const HeaderName = {\n Accept: 'accept',\n AcceptRanges: 'accept-ranges',\n Allow: 'allow',\n Authorization: 'authorization',\n CacheControl: 'cache-control',\n ContentLength: 'content-length',\n ContentRange: 'content-range',\n ContentType: 'content-type',\n Date: 'date',\n ETag: 'etag',\n IfMatch: 'if-match',\n IfModifiedSince: 'if-modified-since',\n IfNoneMatch: 'if-none-match',\n IfUnmodifiedSince: 'if-unmodified-since',\n LastModified: 'last-modified',\n Range: 'range',\n WWWAuthenticate: 'www-authenticate'\n} as const;\n\n/** HTTP header values used in the parquet server handler */\nexport const HeaderValue = {\n AcceptRanges: 'bytes',\n Allow: 'GET, HEAD',\n CacheControl: 'public, immutable, max-age=31536000',\n ContentType: 'application/octet-stream',\n WWWAuthenticate: 'Bearer realm=\"parquet-server\"'\n} as const;\n"],"names":[],"mappings":";;AAEA;AACO,MAAM,UAAU,GAAG;AACxB,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,KAAK,EAAE,OAAO;AACd,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,aAAa,EAAE,gBAAgB;AAC/B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,WAAW,EAAE,cAAc;AAC3B,IACA,IAAI,EAAE,MAAM;AACZ,IAIA,YAAY,EAAE,eAAe;AAC7B,IACA,eAAe,EAAE;;AAGnB;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,YAAY,EAAE,qCAAqC;AACnD,IAAA,WAAW,EAAE,0BAA0B;AACvC,IAAA,eAAe,EAAE;;;;;;"}
1
+ {"version":3,"file":"headers.cjs","sources":["../../src/utils/headers.ts"],"sourcesContent":["/** HTTP header names used in the parquet server handler */\nexport const HeaderName = {\n Accept: 'accept',\n AcceptRanges: 'accept-ranges',\n Allow: 'allow',\n Authorization: 'authorization',\n CacheControl: 'cache-control',\n ContentLength: 'content-length',\n ContentRange: 'content-range',\n ContentType: 'content-type',\n Date: 'date',\n ETag: 'etag',\n IfMatch: 'if-match',\n IfModifiedSince: 'if-modified-since',\n IfNoneMatch: 'if-none-match',\n IfUnmodifiedSince: 'if-unmodified-since',\n LastModified: 'last-modified',\n Range: 'range',\n WWWAuthenticate: 'www-authenticate'\n} as const;\n\n/** HTTP header values used in the parquet server handler */\nexport const HeaderValue = {\n AcceptRanges: 'bytes',\n Allow: 'GET, HEAD',\n CacheControl: 'public, immutable, max-age=31536000',\n ContentType: 'application/octet-stream',\n WWWAuthenticate: 'Bearer realm=\"parquet-server\"'\n} as const;\n"],"names":[],"mappings":";;AAAA;AACO,MAAM,UAAU,GAAG;AACxB,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,KAAK,EAAE,OAAO;AACd,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,aAAa,EAAE,gBAAgB;AAC/B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,WAAW,EAAE,cAAc;AAC3B,IACA,IAAI,EAAE,MAAM;AACZ,IAIA,YAAY,EAAE,eAAe;AAC7B,IACA,eAAe,EAAE;;AAGnB;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,YAAY,EAAE,qCAAqC;AACnD,IAAA,WAAW,EAAE,0BAA0B;AACvC,IAAA,eAAe,EAAE;;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAEA,2DAA2D;AAC3D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEX,4DAA4D;AAC5D,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC"}
1
+ {"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;CAkBb,CAAC;AAEX,4DAA4D;AAC5D,eAAO,MAAM,WAAW;;;;;;CAMd,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"headers.js","sources":["../../src/utils/headers.ts"],"sourcesContent":["'use strict';\n\n/** HTTP header names used in the parquet server handler */\nexport const HeaderName = {\n Accept: 'accept',\n AcceptRanges: 'accept-ranges',\n Allow: 'allow',\n Authorization: 'authorization',\n CacheControl: 'cache-control',\n ContentLength: 'content-length',\n ContentRange: 'content-range',\n ContentType: 'content-type',\n Date: 'date',\n ETag: 'etag',\n IfMatch: 'if-match',\n IfModifiedSince: 'if-modified-since',\n IfNoneMatch: 'if-none-match',\n IfUnmodifiedSince: 'if-unmodified-since',\n LastModified: 'last-modified',\n Range: 'range',\n WWWAuthenticate: 'www-authenticate'\n} as const;\n\n/** HTTP header values used in the parquet server handler */\nexport const HeaderValue = {\n AcceptRanges: 'bytes',\n Allow: 'GET, HEAD',\n CacheControl: 'public, immutable, max-age=31536000',\n ContentType: 'application/octet-stream',\n WWWAuthenticate: 'Bearer realm=\"parquet-server\"'\n} as const;\n"],"names":[],"mappings":"AAEA;AACO,MAAM,UAAU,GAAG;AACxB,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,KAAK,EAAE,OAAO;AACd,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,aAAa,EAAE,gBAAgB;AAC/B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,WAAW,EAAE,cAAc;AAC3B,IACA,IAAI,EAAE,MAAM;AACZ,IAIA,YAAY,EAAE,eAAe;AAC7B,IACA,eAAe,EAAE;;AAGnB;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,YAAY,EAAE,qCAAqC;AACnD,IAAA,WAAW,EAAE,0BAA0B;AACvC,IAAA,eAAe,EAAE;;;;;"}
1
+ {"version":3,"file":"headers.js","sources":["../../src/utils/headers.ts"],"sourcesContent":["/** HTTP header names used in the parquet server handler */\nexport const HeaderName = {\n Accept: 'accept',\n AcceptRanges: 'accept-ranges',\n Allow: 'allow',\n Authorization: 'authorization',\n CacheControl: 'cache-control',\n ContentLength: 'content-length',\n ContentRange: 'content-range',\n ContentType: 'content-type',\n Date: 'date',\n ETag: 'etag',\n IfMatch: 'if-match',\n IfModifiedSince: 'if-modified-since',\n IfNoneMatch: 'if-none-match',\n IfUnmodifiedSince: 'if-unmodified-since',\n LastModified: 'last-modified',\n Range: 'range',\n WWWAuthenticate: 'www-authenticate'\n} as const;\n\n/** HTTP header values used in the parquet server handler */\nexport const HeaderValue = {\n AcceptRanges: 'bytes',\n Allow: 'GET, HEAD',\n CacheControl: 'public, immutable, max-age=31536000',\n ContentType: 'application/octet-stream',\n WWWAuthenticate: 'Bearer realm=\"parquet-server\"'\n} as const;\n"],"names":[],"mappings":"AAAA;AACO,MAAM,UAAU,GAAG;AACxB,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,KAAK,EAAE,OAAO;AACd,IACA,YAAY,EAAE,eAAe;AAC7B,IAAA,aAAa,EAAE,gBAAgB;AAC/B,IAAA,YAAY,EAAE,eAAe;AAC7B,IAAA,WAAW,EAAE,cAAc;AAC3B,IACA,IAAI,EAAE,MAAM;AACZ,IAIA,YAAY,EAAE,eAAe;AAC7B,IACA,eAAe,EAAE;;AAGnB;AACO,MAAM,WAAW,GAAG;AACzB,IAAA,YAAY,EAAE,OAAO;AACrB,IAAA,KAAK,EAAE,WAAW;AAClB,IAAA,YAAY,EAAE,qCAAqC;AACnD,IAAA,WAAW,EAAE,0BAA0B;AACvC,IAAA,eAAe,EAAE;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"method.cjs","sources":["../../src/utils/method.ts"],"sourcesContent":["import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { IncomingHttpHeaders } from 'node:http';\n\nexport function isGetOrHead(\n method: IncomingHttpHeaders['method']\n): method is PFrameInternal.HttpMethod {\n return method === 'GET' || method === 'HEAD';\n}\n\nexport function isGet(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'GET'> {\n return method === 'GET';\n}\n\nexport function isHead(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'HEAD'> {\n return method === 'HEAD';\n}\n"],"names":[],"mappings":";;AAGM,SAAU,WAAW,CACzB,MAAqC,EAAA;AAErC,IAAA,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;AAC9C;AAEM,SAAU,KAAK,CACnB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,KAAK;AACzB;AAEM,SAAU,MAAM,CACpB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,MAAM;AAC1B;;;;;;"}
1
+ {"version":3,"file":"method.cjs","sources":["../../src/utils/method.ts"],"sourcesContent":["import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { IncomingHttpHeaders } from 'node:http';\n\nexport function isGetOrHead(\n method: IncomingHttpHeaders['method']\n): method is PFrameInternal.HttpMethod {\n return method === 'GET' || method === 'HEAD';\n}\n\nexport function isGet(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'GET'> {\n return method === 'GET';\n}\n\nexport function isHead(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'HEAD'> {\n return method === 'HEAD';\n}\n"],"names":[],"mappings":";;AAGM,SAAU,WAAW,CACzB,MAAqC,EAAA;AAErC,IAAA,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;AAC9C;AAEM,SAAU,KAAK,CACnB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,KAAK;AACzB;AAEM,SAAU,MAAM,CACpB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,MAAM;AAC1B;;;;;;"}
@@ -1,5 +1,5 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
- import { IncomingHttpHeaders } from 'node:http';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
+ import type { IncomingHttpHeaders } from 'node:http';
3
3
  export declare function isGetOrHead(method: IncomingHttpHeaders['method']): method is PFrameInternal.HttpMethod;
4
4
  export declare function isGet(method: PFrameInternal.HttpMethod): method is Extract<PFrameInternal.HttpMethod, 'GET'>;
5
5
  export declare function isHead(method: PFrameInternal.HttpMethod): method is Extract<PFrameInternal.HttpMethod, 'HEAD'>;
@@ -1 +1 @@
1
- {"version":3,"file":"method.d.ts","sourceRoot":"","sources":["../../src/utils/method.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAEhD,wBAAgB,WAAW,CACzB,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GACpC,MAAM,IAAI,cAAc,CAAC,UAAU,CAErC;AAED,wBAAgB,KAAK,CACnB,MAAM,EAAE,cAAc,CAAC,UAAU,GAChC,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAErD;AAED,wBAAgB,MAAM,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,GAChC,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAEtD"}
1
+ {"version":3,"file":"method.d.ts","sourceRoot":"","sources":["../../src/utils/method.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AAErD,wBAAgB,WAAW,CACzB,MAAM,EAAE,mBAAmB,CAAC,QAAQ,CAAC,GACpC,MAAM,IAAI,cAAc,CAAC,UAAU,CAErC;AAED,wBAAgB,KAAK,CACnB,MAAM,EAAE,cAAc,CAAC,UAAU,GAChC,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,KAAK,CAAC,CAErD;AAED,wBAAgB,MAAM,CACpB,MAAM,EAAE,cAAc,CAAC,UAAU,GAChC,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,CAAC,CAEtD"}
@@ -1 +1 @@
1
- {"version":3,"file":"method.js","sources":["../../src/utils/method.ts"],"sourcesContent":["import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { IncomingHttpHeaders } from 'node:http';\n\nexport function isGetOrHead(\n method: IncomingHttpHeaders['method']\n): method is PFrameInternal.HttpMethod {\n return method === 'GET' || method === 'HEAD';\n}\n\nexport function isGet(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'GET'> {\n return method === 'GET';\n}\n\nexport function isHead(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'HEAD'> {\n return method === 'HEAD';\n}\n"],"names":[],"mappings":"AAGM,SAAU,WAAW,CACzB,MAAqC,EAAA;AAErC,IAAA,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;AAC9C;AAEM,SAAU,KAAK,CACnB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,KAAK;AACzB;AAEM,SAAU,MAAM,CACpB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,MAAM;AAC1B;;;;"}
1
+ {"version":3,"file":"method.js","sources":["../../src/utils/method.ts"],"sourcesContent":["import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { IncomingHttpHeaders } from 'node:http';\n\nexport function isGetOrHead(\n method: IncomingHttpHeaders['method']\n): method is PFrameInternal.HttpMethod {\n return method === 'GET' || method === 'HEAD';\n}\n\nexport function isGet(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'GET'> {\n return method === 'GET';\n}\n\nexport function isHead(\n method: PFrameInternal.HttpMethod\n): method is Extract<PFrameInternal.HttpMethod, 'HEAD'> {\n return method === 'HEAD';\n}\n"],"names":[],"mappings":"AAGM,SAAU,WAAW,CACzB,MAAqC,EAAA;AAErC,IAAA,OAAO,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM;AAC9C;AAEM,SAAU,KAAK,CACnB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,KAAK;AACzB;AAEM,SAAU,MAAM,CACpB,MAAiC,EAAA;IAEjC,OAAO,MAAM,KAAK,MAAM;AAC1B;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.cjs","sources":["../../src/utils/options.ts"],"sourcesContent":["import { IncomingHttpHeaders, IncomingMessage } from 'node:http';\nimport { type Etag } from './etag';\n\ntype EtagMatchType =\n | {\n type: 'match';\n value: Etag[];\n }\n | {\n type: 'wildcard';\n };\n\nclass EtagMatch {\n private constructor(private readonly etagMatch: EtagMatchType) {}\n\n static parse(etagMatch: string | undefined): EtagMatch | null {\n if (etagMatch === undefined) return null;\n if (etagMatch === '*') {\n return new EtagMatch({ type: 'wildcard' });\n } else {\n return new EtagMatch({\n type: 'match',\n value: etagMatch.split(',').map((etag) => etag.trim() as Etag)\n });\n }\n }\n\n matches(etag: Etag): boolean {\n switch (this.etagMatch.type) {\n case 'match':\n return this.etagMatch.value.includes(etag);\n case 'wildcard':\n return true;\n }\n }\n}\n\nclass DateMatch {\n private constructor(private readonly mtime: Date) {}\n\n static parse(dateMatch: string | undefined): DateMatch | null {\n if (dateMatch === undefined) return null;\n const time = Date.parse(dateMatch);\n if (isNaN(time)) return null;\n return new DateMatch(new Date(time));\n }\n\n matches(mtime: Date): boolean {\n return this.mtime.getTime() / 1_000 === mtime.getTime() / 1_000;\n }\n}\n\nexport class Options {\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#name-if-match>\n *\n * Examples:\n *\n * ```text\n * If-Match: \"xyzzy\"\n * If-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-Match: *\n * ```\n */\n private ifMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n *\n * Examples:\n *\n * ```text\n * If-None-Match: \"xyzzy\"\n * If-None-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-None-Match: *\n * ```\n */\n private ifNoneMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n *\n * Examples:\n *\n * ```text\n * If-Modified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifModifiedSince: DateMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n *\n * Examples:\n *\n * ```text\n * If-Unmodified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifUnmodifiedSince: DateMatch | null;\n\n constructor(request: IncomingMessage) {\n this.ifMatch = EtagMatch.parse(request.headers['if-match']);\n this.ifNoneMatch = EtagMatch.parse(request.headers['if-none-match']);\n this.ifModifiedSince = DateMatch.parse(\n request.headers['if-modified-since']\n );\n this.ifUnmodifiedSince = DateMatch.parse(\n request.headers['if-unmodified-since']\n );\n }\n\n /**\n * RFC 9110 section 13.1.1: If-Match precondition evaluation\n * RFC 9110 section 13.1.4: If-Unmodified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.1>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n */\n preconditionFailed(etag: Etag, mtime: Date): boolean {\n // If-Match precondition takes precedence\n if (this.ifMatch !== null && !this.ifMatch.matches(etag)) {\n return true;\n }\n\n // If-Unmodified-Since precondition (only if no If-Match header)\n if (this.ifMatch === null && this.ifUnmodifiedSince !== null) {\n return !this.ifUnmodifiedSince.matches(mtime);\n }\n\n return false;\n }\n\n /**\n * RFC 9110 section 13.1.2: If-None-Match precondition evaluation\n * RFC 9110 section 13.1.3: If-Modified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n */\n notModified(etag: Etag, mtime: Date): boolean {\n // If-None-Match takes precedence over If-Modified-Since\n if (this.ifNoneMatch !== null) {\n return this.ifNoneMatch.matches(etag);\n }\n\n // If-Modified-Since (only if no If-None-Match header)\n if (this.ifModifiedSince !== null) {\n return this.ifModifiedSince.matches(mtime);\n }\n\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.cjs","sources":["../../src/utils/options.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport type { Etag } from './etag';\n\ntype EtagMatchType =\n | {\n type: 'match';\n value: Etag[];\n }\n | {\n type: 'wildcard';\n };\n\nclass EtagMatch {\n private constructor(private readonly etagMatch: EtagMatchType) {}\n\n static parse(etagMatch: string | undefined): EtagMatch | null {\n if (etagMatch === undefined) return null;\n if (etagMatch === '*') {\n return new EtagMatch({ type: 'wildcard' });\n } else {\n return new EtagMatch({\n type: 'match',\n value: etagMatch.split(',').map((etag) => etag.trim() as Etag)\n });\n }\n }\n\n matches(etag: Etag): boolean {\n switch (this.etagMatch.type) {\n case 'match':\n return this.etagMatch.value.includes(etag);\n case 'wildcard':\n return true;\n }\n }\n}\n\nclass DateMatch {\n private constructor(private readonly mtime: Date) {}\n\n static parse(dateMatch: string | undefined): DateMatch | null {\n if (dateMatch === undefined) return null;\n const time = Date.parse(dateMatch);\n if (isNaN(time)) return null;\n return new DateMatch(new Date(time));\n }\n\n matches(mtime: Date): boolean {\n return this.mtime.getTime() / 1_000 === mtime.getTime() / 1_000;\n }\n}\n\nexport class Options {\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#name-if-match>\n *\n * Examples:\n *\n * ```text\n * If-Match: \"xyzzy\"\n * If-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-Match: *\n * ```\n */\n private ifMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n *\n * Examples:\n *\n * ```text\n * If-None-Match: \"xyzzy\"\n * If-None-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-None-Match: *\n * ```\n */\n private ifNoneMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n *\n * Examples:\n *\n * ```text\n * If-Modified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifModifiedSince: DateMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n *\n * Examples:\n *\n * ```text\n * If-Unmodified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifUnmodifiedSince: DateMatch | null;\n\n constructor(request: IncomingMessage) {\n this.ifMatch = EtagMatch.parse(request.headers['if-match']);\n this.ifNoneMatch = EtagMatch.parse(request.headers['if-none-match']);\n this.ifModifiedSince = DateMatch.parse(\n request.headers['if-modified-since']\n );\n this.ifUnmodifiedSince = DateMatch.parse(\n request.headers['if-unmodified-since']\n );\n }\n\n /**\n * RFC 9110 section 13.1.1: If-Match precondition evaluation\n * RFC 9110 section 13.1.4: If-Unmodified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.1>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n */\n preconditionFailed(etag: Etag, mtime: Date): boolean {\n // If-Match precondition takes precedence\n if (this.ifMatch !== null && !this.ifMatch.matches(etag)) {\n return true;\n }\n\n // If-Unmodified-Since precondition (only if no If-Match header)\n if (this.ifMatch === null && this.ifUnmodifiedSince !== null) {\n return !this.ifUnmodifiedSince.matches(mtime);\n }\n\n return false;\n }\n\n /**\n * RFC 9110 section 13.1.2: If-None-Match precondition evaluation\n * RFC 9110 section 13.1.3: If-Modified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n */\n notModified(etag: Etag, mtime: Date): boolean {\n // If-None-Match takes precedence over If-Modified-Since\n if (this.ifNoneMatch !== null) {\n return this.ifNoneMatch.matches(etag);\n }\n\n // If-Modified-Since (only if no If-None-Match header)\n if (this.ifModifiedSince !== null) {\n return this.ifModifiedSince.matches(mtime);\n }\n\n return false;\n }\n}\n"],"names":[],"mappings":";;AAYA,MAAM,SAAS,CAAA;AACwB,IAAA,SAAA;AAArC,IAAA,WAAA,CAAqC,SAAwB,EAAA;QAAxB,IAAA,CAAA,SAAS,GAAT,SAAS;IAAkB;IAEhE,OAAO,KAAK,CAAC,SAA6B,EAAA;QACxC,IAAI,SAAS,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;AACxC,QAAA,IAAI,SAAS,KAAK,GAAG,EAAE;YACrB,OAAO,IAAI,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC5C;aAAO;YACL,OAAO,IAAI,SAAS,CAAC;AACnB,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,EAAU;AAC9D,aAAA,CAAC;QACJ;IACF;AAEA,IAAA,OAAO,CAAC,IAAU,EAAA;AAChB,QAAA,QAAQ,IAAI,CAAC,SAAS,CAAC,IAAI;AACzB,YAAA,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC;AAC5C,YAAA,KAAK,UAAU;AACb,gBAAA,OAAO,IAAI;;IAEjB;AACD;AAED,MAAM,SAAS,CAAA;AACwB,IAAA,KAAA;AAArC,IAAA,WAAA,CAAqC,KAAW,EAAA;QAAX,IAAA,CAAA,KAAK,GAAL,KAAK;IAAS;IAEnD,OAAO,KAAK,CAAC,SAA6B,EAAA;QACxC,IAAI,SAAS,KAAK,SAAS;AAAE,YAAA,OAAO,IAAI;QACxC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAClC,IAAI,KAAK,CAAC,IAAI,CAAC;AAAE,YAAA,OAAO,IAAI;QAC5B,OAAO,IAAI,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC;AAEA,IAAA,OAAO,CAAC,KAAW,EAAA;AACjB,QAAA,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK,KAAK,KAAK,CAAC,OAAO,EAAE,GAAG,KAAK;IACjE;AACD;MAEY,OAAO,CAAA;AAClB;;;;;;;;;;AAUG;AACK,IAAA,OAAO;AAEf;;;;;;;;;;AAUG;AACK,IAAA,WAAW;AAEnB;;;;;;;;AAQG;AACK,IAAA,eAAe;AAEvB;;;;;;;;AAQG;AACK,IAAA,iBAAiB;AAEzB,IAAA,WAAA,CAAY,OAAwB,EAAA;AAClC,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,WAAW,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;AACpE,QAAA,IAAI,CAAC,eAAe,GAAG,SAAS,CAAC,KAAK,CACpC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,CACrC;AACD,QAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC,KAAK,CACtC,OAAO,CAAC,OAAO,CAAC,qBAAqB,CAAC,CACvC;IACH;AAEA;;;;;AAKG;IACH,kBAAkB,CAAC,IAAU,EAAE,KAAW,EAAA;;AAExC,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACxD,YAAA,OAAO,IAAI;QACb;;AAGA,QAAA,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,IAAI,IAAI,CAAC,iBAAiB,KAAK,IAAI,EAAE;YAC5D,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,CAAC;QAC/C;AAEA,QAAA,OAAO,KAAK;IACd;AAEA;;;;;AAKG;IACH,WAAW,CAAC,IAAU,EAAE,KAAW,EAAA;;AAEjC,QAAA,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,EAAE;YAC7B,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC;QACvC;;AAGA,QAAA,IAAI,IAAI,CAAC,eAAe,KAAK,IAAI,EAAE;YACjC,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC;QAC5C;AAEA,QAAA,OAAO,KAAK;IACd;AACD;;;;"}
@@ -1,5 +1,5 @@
1
- import { IncomingMessage } from 'node:http';
2
- import { type Etag } from './etag';
1
+ import type { IncomingMessage } from 'node:http';
2
+ import type { Etag } from './etag';
3
3
  export declare class Options {
4
4
  /**
5
5
  * See <https://datatracker.ietf.org/doc/html/rfc9110#name-if-match>
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/utils/options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,eAAe,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,EAAE,KAAK,IAAI,EAAE,MAAM,QAAQ,CAAC;AAmDnC,qBAAa,OAAO;IAClB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO,CAAmB;IAElC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW,CAAmB;IAEtC;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe,CAAmB;IAE1C;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB,CAAmB;gBAEhC,OAAO,EAAE,eAAe;IAWpC;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO;IAcpD;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO;CAa9C"}
1
+ {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/utils/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAmDnC,qBAAa,OAAO;IAClB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,OAAO,CAAmB;IAElC;;;;;;;;;;OAUG;IACH,OAAO,CAAC,WAAW,CAAmB;IAEtC;;;;;;;;OAQG;IACH,OAAO,CAAC,eAAe,CAAmB;IAE1C;;;;;;;;OAQG;IACH,OAAO,CAAC,iBAAiB,CAAmB;gBAEhC,OAAO,EAAE,eAAe;IAWpC;;;;;OAKG;IACH,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO;IAcpD;;;;;OAKG;IACH,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO;CAa9C"}
@@ -1 +1 @@
1
- {"version":3,"file":"options.js","sources":["../../src/utils/options.ts"],"sourcesContent":["import { IncomingHttpHeaders, IncomingMessage } from 'node:http';\nimport { type Etag } from './etag';\n\ntype EtagMatchType =\n | {\n type: 'match';\n value: Etag[];\n }\n | {\n type: 'wildcard';\n };\n\nclass EtagMatch {\n private constructor(private readonly etagMatch: EtagMatchType) {}\n\n static parse(etagMatch: string | undefined): EtagMatch | null {\n if (etagMatch === undefined) return null;\n if (etagMatch === '*') {\n return new EtagMatch({ type: 'wildcard' });\n } else {\n return new EtagMatch({\n type: 'match',\n value: etagMatch.split(',').map((etag) => etag.trim() as Etag)\n });\n }\n }\n\n matches(etag: Etag): boolean {\n switch (this.etagMatch.type) {\n case 'match':\n return this.etagMatch.value.includes(etag);\n case 'wildcard':\n return true;\n }\n }\n}\n\nclass DateMatch {\n private constructor(private readonly mtime: Date) {}\n\n static parse(dateMatch: string | undefined): DateMatch | null {\n if (dateMatch === undefined) return null;\n const time = Date.parse(dateMatch);\n if (isNaN(time)) return null;\n return new DateMatch(new Date(time));\n }\n\n matches(mtime: Date): boolean {\n return this.mtime.getTime() / 1_000 === mtime.getTime() / 1_000;\n }\n}\n\nexport class Options {\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#name-if-match>\n *\n * Examples:\n *\n * ```text\n * If-Match: \"xyzzy\"\n * If-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-Match: *\n * ```\n */\n private ifMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n *\n * Examples:\n *\n * ```text\n * If-None-Match: \"xyzzy\"\n * If-None-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-None-Match: *\n * ```\n */\n private ifNoneMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n *\n * Examples:\n *\n * ```text\n * If-Modified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifModifiedSince: DateMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n *\n * Examples:\n *\n * ```text\n * If-Unmodified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifUnmodifiedSince: DateMatch | null;\n\n constructor(request: IncomingMessage) {\n this.ifMatch = EtagMatch.parse(request.headers['if-match']);\n this.ifNoneMatch = EtagMatch.parse(request.headers['if-none-match']);\n this.ifModifiedSince = DateMatch.parse(\n request.headers['if-modified-since']\n );\n this.ifUnmodifiedSince = DateMatch.parse(\n request.headers['if-unmodified-since']\n );\n }\n\n /**\n * RFC 9110 section 13.1.1: If-Match precondition evaluation\n * RFC 9110 section 13.1.4: If-Unmodified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.1>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n */\n preconditionFailed(etag: Etag, mtime: Date): boolean {\n // If-Match precondition takes precedence\n if (this.ifMatch !== null && !this.ifMatch.matches(etag)) {\n return true;\n }\n\n // If-Unmodified-Since precondition (only if no If-Match header)\n if (this.ifMatch === null && this.ifUnmodifiedSince !== null) {\n return !this.ifUnmodifiedSince.matches(mtime);\n }\n\n return false;\n }\n\n /**\n * RFC 9110 section 13.1.2: If-None-Match precondition evaluation\n * RFC 9110 section 13.1.3: If-Modified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n */\n notModified(etag: Etag, mtime: Date): boolean {\n // If-None-Match takes precedence over If-Modified-Since\n if (this.ifNoneMatch !== null) {\n return this.ifNoneMatch.matches(etag);\n }\n\n // If-Modified-Since (only if no If-None-Match header)\n if (this.ifModifiedSince !== null) {\n return this.ifModifiedSince.matches(mtime);\n }\n\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"options.js","sources":["../../src/utils/options.ts"],"sourcesContent":["import type { IncomingMessage } from 'node:http';\nimport type { Etag } from './etag';\n\ntype EtagMatchType =\n | {\n type: 'match';\n value: Etag[];\n }\n | {\n type: 'wildcard';\n };\n\nclass EtagMatch {\n private constructor(private readonly etagMatch: EtagMatchType) {}\n\n static parse(etagMatch: string | undefined): EtagMatch | null {\n if (etagMatch === undefined) return null;\n if (etagMatch === '*') {\n return new EtagMatch({ type: 'wildcard' });\n } else {\n return new EtagMatch({\n type: 'match',\n value: etagMatch.split(',').map((etag) => etag.trim() as Etag)\n });\n }\n }\n\n matches(etag: Etag): boolean {\n switch (this.etagMatch.type) {\n case 'match':\n return this.etagMatch.value.includes(etag);\n case 'wildcard':\n return true;\n }\n }\n}\n\nclass DateMatch {\n private constructor(private readonly mtime: Date) {}\n\n static parse(dateMatch: string | undefined): DateMatch | null {\n if (dateMatch === undefined) return null;\n const time = Date.parse(dateMatch);\n if (isNaN(time)) return null;\n return new DateMatch(new Date(time));\n }\n\n matches(mtime: Date): boolean {\n return this.mtime.getTime() / 1_000 === mtime.getTime() / 1_000;\n }\n}\n\nexport class Options {\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#name-if-match>\n *\n * Examples:\n *\n * ```text\n * If-Match: \"xyzzy\"\n * If-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-Match: *\n * ```\n */\n private ifMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n *\n * Examples:\n *\n * ```text\n * If-None-Match: \"xyzzy\"\n * If-None-Match: \"xyzzy\", \"r2d2xxxx\", \"c3piozzzz\"\n * If-None-Match: *\n * ```\n */\n private ifNoneMatch: EtagMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n *\n * Examples:\n *\n * ```text\n * If-Modified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifModifiedSince: DateMatch | null;\n\n /**\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n *\n * Examples:\n *\n * ```text\n * If-Unmodified-Since: Mon, 07 Jan 2002 19:43:36 GMT\n * ```\n */\n private ifUnmodifiedSince: DateMatch | null;\n\n constructor(request: IncomingMessage) {\n this.ifMatch = EtagMatch.parse(request.headers['if-match']);\n this.ifNoneMatch = EtagMatch.parse(request.headers['if-none-match']);\n this.ifModifiedSince = DateMatch.parse(\n request.headers['if-modified-since']\n );\n this.ifUnmodifiedSince = DateMatch.parse(\n request.headers['if-unmodified-since']\n );\n }\n\n /**\n * RFC 9110 section 13.1.1: If-Match precondition evaluation\n * RFC 9110 section 13.1.4: If-Unmodified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.1>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.4>\n */\n preconditionFailed(etag: Etag, mtime: Date): boolean {\n // If-Match precondition takes precedence\n if (this.ifMatch !== null && !this.ifMatch.matches(etag)) {\n return true;\n }\n\n // If-Unmodified-Since precondition (only if no If-Match header)\n if (this.ifMatch === null && this.ifUnmodifiedSince !== null) {\n return !this.ifUnmodifiedSince.matches(mtime);\n }\n\n return false;\n }\n\n /**\n * RFC 9110 section 13.1.2: If-None-Match precondition evaluation\n * RFC 9110 section 13.1.3: If-Modified-Since precondition evaluation\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.2>\n * See <https://datatracker.ietf.org/doc/html/rfc9110#section-13.1.3>\n */\n notModified(etag: Etag, mtime: Date): boolean {\n // If-None-Match takes precedence over If-Modified-Since\n if (this.ifNoneMatch !== null) {\n return this.ifNoneMatch.matches(etag);\n }\n\n // If-Modified-Since (only if no If-None-Match header)\n if (this.ifModifiedSince !== null) {\n return this.ifModifiedSince.matches(mtime);\n }\n\n return false;\n }\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"range.cjs","sources":["../../src/utils/range.ts"],"sourcesContent":["import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { IncomingMessage } from 'node:http';\n\nexport function parseRange(\n request: IncomingMessage\n): PFrameInternal.HttpRange | null | undefined {\n const range = request.headers['range'];\n if (range === undefined) return undefined;\n\n const match = range.match(/^bytes=(\\d*)-(\\d*)$/);\n if (!match) return null;\n\n const [, startStr, endStr] = match;\n const start = startStr ? parseInt(startStr, 10) : null;\n const end = endStr ? parseInt(endStr, 10) : null;\n if (\n (start !== null && (isNaN(start) || start < 0)) ||\n (end !== null && (isNaN(end) || end < 0)) ||\n (start !== null && end !== null && start > end)\n )\n return null;\n\n // Both start and end are specified - bounded range\n if (start !== null && end !== null) {\n return { type: 'bounded', start, end };\n }\n\n // Only start is specified - offset range (e.g., bytes=500-)\n if (start !== null && end === null) {\n return { type: 'offset', offset: start };\n }\n\n // Only end is specified - suffix range (e.g., bytes=-500)\n if (start === null && end !== null) {\n return { type: 'suffix', suffix: end };\n }\n\n // Neither start nor end specified (bytes=-) - invalid\n return null;\n}\n"],"names":[],"mappings":";;AAGM,SAAU,UAAU,CACxB,OAAwB,EAAA;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC;AAChD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;IAEvB,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK;AAClC,IAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,IAAI;AACtD,IAAA,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI;AAChD,IAAA,IACE,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC9C,SAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SACxC,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;AAE/C,QAAA,OAAO,IAAI;;IAGb,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1C;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE;IACxC;;AAGA,IAAA,OAAO,IAAI;AACb;;;;"}
1
+ {"version":3,"file":"range.cjs","sources":["../../src/utils/range.ts"],"sourcesContent":["import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { IncomingMessage } from 'node:http';\n\nexport function parseRange(\n request: IncomingMessage\n): PFrameInternal.HttpRange | null | undefined {\n const range = request.headers['range'];\n if (range === undefined) return undefined;\n\n const match = range.match(/^bytes=(\\d*)-(\\d*)$/);\n if (!match) return null;\n\n const [, startStr, endStr] = match;\n const start = startStr ? parseInt(startStr, 10) : null;\n const end = endStr ? parseInt(endStr, 10) : null;\n if (\n (start !== null && (isNaN(start) || start < 0)) ||\n (end !== null && (isNaN(end) || end < 0)) ||\n (start !== null && end !== null && start > end)\n )\n return null;\n\n // Both start and end are specified - bounded range\n if (start !== null && end !== null) {\n return { type: 'bounded', start, end };\n }\n\n // Only start is specified - offset range (e.g., bytes=500-)\n if (start !== null && end === null) {\n return { type: 'offset', offset: start };\n }\n\n // Only end is specified - suffix range (e.g., bytes=-500)\n if (start === null && end !== null) {\n return { type: 'suffix', suffix: end };\n }\n\n // Neither start nor end specified (bytes=-) - invalid\n return null;\n}\n"],"names":[],"mappings":";;AAGM,SAAU,UAAU,CACxB,OAAwB,EAAA;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC;AAChD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;IAEvB,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK;AAClC,IAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,IAAI;AACtD,IAAA,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI;AAChD,IAAA,IACE,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC9C,SAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SACxC,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;AAE/C,QAAA,OAAO,IAAI;;IAGb,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1C;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE;IACxC;;AAGA,IAAA,OAAO,IAAI;AACb;;;;"}
@@ -1,4 +1,4 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
- import { IncomingMessage } from 'node:http';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
+ import type { IncomingMessage } from 'node:http';
3
3
  export declare function parseRange(request: IncomingMessage): PFrameInternal.HttpRange | null | undefined;
4
4
  //# sourceMappingURL=range.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/utils/range.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AACvE,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAE5C,wBAAgB,UAAU,CACxB,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAkC7C"}
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../../src/utils/range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,wBAAgB,UAAU,CACxB,OAAO,EAAE,eAAe,GACvB,cAAc,CAAC,SAAS,GAAG,IAAI,GAAG,SAAS,CAkC7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"range.js","sources":["../../src/utils/range.ts"],"sourcesContent":["import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport { IncomingMessage } from 'node:http';\n\nexport function parseRange(\n request: IncomingMessage\n): PFrameInternal.HttpRange | null | undefined {\n const range = request.headers['range'];\n if (range === undefined) return undefined;\n\n const match = range.match(/^bytes=(\\d*)-(\\d*)$/);\n if (!match) return null;\n\n const [, startStr, endStr] = match;\n const start = startStr ? parseInt(startStr, 10) : null;\n const end = endStr ? parseInt(endStr, 10) : null;\n if (\n (start !== null && (isNaN(start) || start < 0)) ||\n (end !== null && (isNaN(end) || end < 0)) ||\n (start !== null && end !== null && start > end)\n )\n return null;\n\n // Both start and end are specified - bounded range\n if (start !== null && end !== null) {\n return { type: 'bounded', start, end };\n }\n\n // Only start is specified - offset range (e.g., bytes=500-)\n if (start !== null && end === null) {\n return { type: 'offset', offset: start };\n }\n\n // Only end is specified - suffix range (e.g., bytes=-500)\n if (start === null && end !== null) {\n return { type: 'suffix', suffix: end };\n }\n\n // Neither start nor end specified (bytes=-) - invalid\n return null;\n}\n"],"names":[],"mappings":"AAGM,SAAU,UAAU,CACxB,OAAwB,EAAA;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC;AAChD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;IAEvB,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK;AAClC,IAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,IAAI;AACtD,IAAA,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI;AAChD,IAAA,IACE,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC9C,SAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SACxC,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;AAE/C,QAAA,OAAO,IAAI;;IAGb,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1C;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE;IACxC;;AAGA,IAAA,OAAO,IAAI;AACb;;;;"}
1
+ {"version":3,"file":"range.js","sources":["../../src/utils/range.ts"],"sourcesContent":["import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';\nimport type { IncomingMessage } from 'node:http';\n\nexport function parseRange(\n request: IncomingMessage\n): PFrameInternal.HttpRange | null | undefined {\n const range = request.headers['range'];\n if (range === undefined) return undefined;\n\n const match = range.match(/^bytes=(\\d*)-(\\d*)$/);\n if (!match) return null;\n\n const [, startStr, endStr] = match;\n const start = startStr ? parseInt(startStr, 10) : null;\n const end = endStr ? parseInt(endStr, 10) : null;\n if (\n (start !== null && (isNaN(start) || start < 0)) ||\n (end !== null && (isNaN(end) || end < 0)) ||\n (start !== null && end !== null && start > end)\n )\n return null;\n\n // Both start and end are specified - bounded range\n if (start !== null && end !== null) {\n return { type: 'bounded', start, end };\n }\n\n // Only start is specified - offset range (e.g., bytes=500-)\n if (start !== null && end === null) {\n return { type: 'offset', offset: start };\n }\n\n // Only end is specified - suffix range (e.g., bytes=-500)\n if (start === null && end !== null) {\n return { type: 'suffix', suffix: end };\n }\n\n // Neither start nor end specified (bytes=-) - invalid\n return null;\n}\n"],"names":[],"mappings":"AAGM,SAAU,UAAU,CACxB,OAAwB,EAAA;IAExB,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC;IACtC,IAAI,KAAK,KAAK,SAAS;AAAE,QAAA,OAAO,SAAS;IAEzC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC;AAChD,IAAA,IAAI,CAAC,KAAK;AAAE,QAAA,OAAO,IAAI;IAEvB,MAAM,GAAG,QAAQ,EAAE,MAAM,CAAC,GAAG,KAAK;AAClC,IAAA,MAAM,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,IAAI;AACtD,IAAA,MAAM,GAAG,GAAG,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,IAAI;AAChD,IAAA,IACE,CAAC,KAAK,KAAK,IAAI,KAAK,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAC9C,SAAC,GAAG,KAAK,IAAI,KAAK,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;SACxC,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,GAAG,GAAG,CAAC;AAE/C,QAAA,OAAO,IAAI;;IAGb,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;IACxC;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAC1C;;IAGA,IAAI,KAAK,KAAK,IAAI,IAAI,GAAG,KAAK,IAAI,EAAE;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE;IACxC;;AAGA,IAAA,OAAO,IAAI;AACb;;;;"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@milaboratories/pframes-rs-serv",
3
3
  "description": "PFrames - Node.js HTTP(S) Parquet Server",
4
- "version": "1.0.63",
4
+ "version": "1.0.64",
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",
7
7
  "main": "./dist/index.js",
@@ -20,18 +20,20 @@
20
20
  "dist/**/*",
21
21
  "bin/**/*"
22
22
  ],
23
- "devDependencies": {
23
+ "dependencies": {
24
24
  "@milaboratories/helpers": "1.6.22",
25
- "@milaboratories/pl-model-common": "1.19.13",
26
- "@milaboratories/pl-model-middle-layer": "1.8.15",
25
+ "@milaboratories/pl-model-common": "1.19.14",
26
+ "@milaboratories/pl-model-middle-layer": "1.8.16",
27
+ "commander": "^14.0.0",
28
+ "selfsigned": "^3.0.1"
29
+ },
30
+ "devDependencies": {
27
31
  "@milaboratories/ts-builder": "1.0.5",
28
32
  "@milaboratories/ts-configs": "1.0.6",
29
33
  "@types/autocannon": "^7.12.7",
30
34
  "@types/node": "^20.19.11",
31
35
  "@vitest/coverage-istanbul": "^3.2.4",
32
36
  "autocannon": "^8.0.0",
33
- "commander": "^14.0.0",
34
- "selfsigned": "^3.0.1",
35
37
  "typescript": "^5.9.2",
36
38
  "undici": "^7.14.0",
37
39
  "vite": "^7.1.3",
package/src/export.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { RequestListener } from 'http';
1
+ import type { RequestListener } from 'node:http';
2
2
  import { FileSystemStore } from './fs-store';
3
3
  import { createRequestHandler } from './handler';
4
4
  import { serve } from './serve';
5
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
5
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
6
6
 
7
7
  export const HttpHelpers: PFrameInternal.HttpHelpers = {
8
8
  createFsStore: async (
package/src/serve.ts CHANGED
@@ -1,14 +1,14 @@
1
1
  import {
2
2
  createServer as createHttpServer,
3
- RequestListener,
3
+ type RequestListener,
4
4
  type Server as HttpServer,
5
5
  type ServerOptions
6
6
  } from 'node:http';
7
7
  import {
8
8
  createServer as createHttpsServer,
9
- Server as HttpsServer
9
+ type Server as HttpsServer
10
10
  } from 'node:https';
11
- import { AddressInfo } from 'node:net';
11
+ import type { AddressInfo } from 'node:net';
12
12
  import { Deferred } from '@milaboratories/helpers';
13
13
  import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
14
14
  import {
package/src/utils/etag.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { Branded } from '@milaboratories/pl-model-common';
2
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
1
+ import type { Branded } from '@milaboratories/pl-model-common';
2
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
3
3
 
4
4
  /**
5
5
  * See <https://datatracker.ietf.org/doc/html/rfc9110#section-8.8.3>
@@ -1,5 +1,5 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
- import { IncomingMessage } from 'node:http';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
+ import type { IncomingMessage } from 'node:http';
3
3
 
4
4
  const PARQUET_FILENAME_REGEX = /^\/([\w\-.]+.parquet)$/;
5
5
 
@@ -1,5 +1,3 @@
1
- 'use strict';
2
-
3
1
  /** HTTP header names used in the parquet server handler */
4
2
  export const HeaderName = {
5
3
  Accept: 'accept',
@@ -1,5 +1,5 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
- import { IncomingHttpHeaders } from 'node:http';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
+ import type { IncomingHttpHeaders } from 'node:http';
3
3
 
4
4
  export function isGetOrHead(
5
5
  method: IncomingHttpHeaders['method']
@@ -1,5 +1,5 @@
1
- import { IncomingHttpHeaders, IncomingMessage } from 'node:http';
2
- import { type Etag } from './etag';
1
+ import type { IncomingMessage } from 'node:http';
2
+ import type { Etag } from './etag';
3
3
 
4
4
  type EtagMatchType =
5
5
  | {
@@ -1,5 +1,5 @@
1
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
- import { IncomingMessage } from 'node:http';
1
+ import type { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
2
+ import type { IncomingMessage } from 'node:http';
3
3
 
4
4
  export function parseRange(
5
5
  request: IncomingMessage