@milaboratories/pframes-rs-serv 1.1.18 → 1.1.19

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.
Files changed (82) hide show
  1. package/dist/export.cjs +16 -17
  2. package/dist/export.cjs.map +1 -1
  3. package/dist/export.d.ts +6 -2
  4. package/dist/export.d.ts.map +1 -1
  5. package/dist/export.js +16 -15
  6. package/dist/export.js.map +1 -1
  7. package/dist/fs-store.cjs +83 -87
  8. package/dist/fs-store.cjs.map +1 -1
  9. package/dist/fs-store.d.ts +14 -10
  10. package/dist/fs-store.d.ts.map +1 -1
  11. package/dist/fs-store.js +83 -85
  12. package/dist/fs-store.js.map +1 -1
  13. package/dist/handler.cjs +132 -157
  14. package/dist/handler.cjs.map +1 -1
  15. package/dist/handler.d.ts +8 -4
  16. package/dist/handler.d.ts.map +1 -1
  17. package/dist/handler.js +132 -155
  18. package/dist/handler.js.map +1 -1
  19. package/dist/index.cjs +13 -18
  20. package/dist/index.d.ts +6 -6
  21. package/dist/index.js +6 -6
  22. package/dist/parquet-server.cjs +95 -101
  23. package/dist/parquet-server.cjs.map +1 -1
  24. package/dist/parquet-server.d.ts +16 -12
  25. package/dist/parquet-server.d.ts.map +1 -1
  26. package/dist/parquet-server.js +95 -98
  27. package/dist/parquet-server.js.map +1 -1
  28. package/dist/serve.cjs +98 -94
  29. package/dist/serve.cjs.map +1 -1
  30. package/dist/serve.d.ts +11 -2
  31. package/dist/serve.d.ts.map +1 -1
  32. package/dist/serve.js +98 -92
  33. package/dist/serve.js.map +1 -1
  34. package/dist/utils/etag.cjs +5 -7
  35. package/dist/utils/etag.cjs.map +1 -1
  36. package/dist/utils/etag.js +5 -5
  37. package/dist/utils/etag.js.map +1 -1
  38. package/dist/utils/filename.cjs +9 -11
  39. package/dist/utils/filename.cjs.map +1 -1
  40. package/dist/utils/filename.js +9 -9
  41. package/dist/utils/filename.js.map +1 -1
  42. package/dist/utils/headers.cjs +28 -21
  43. package/dist/utils/headers.cjs.map +1 -1
  44. package/dist/utils/headers.js +28 -19
  45. package/dist/utils/headers.js.map +1 -1
  46. package/dist/utils/method.cjs +7 -7
  47. package/dist/utils/method.cjs.map +1 -1
  48. package/dist/utils/method.js +7 -5
  49. package/dist/utils/method.js.map +1 -1
  50. package/dist/utils/options.cjs +111 -134
  51. package/dist/utils/options.cjs.map +1 -1
  52. package/dist/utils/options.js +111 -132
  53. package/dist/utils/options.js.map +1 -1
  54. package/dist/utils/range.cjs +26 -31
  55. package/dist/utils/range.cjs.map +1 -1
  56. package/dist/utils/range.js +26 -29
  57. package/dist/utils/range.js.map +1 -1
  58. package/dist/utils/status.cjs +17 -17
  59. package/dist/utils/status.cjs.map +1 -1
  60. package/dist/utils/status.js +17 -15
  61. package/dist/utils/status.js.map +1 -1
  62. package/package.json +4 -4
  63. package/src/parquet-server.ts +16 -2
  64. package/dist/index.cjs.map +0 -1
  65. package/dist/index.d.ts.map +0 -1
  66. package/dist/index.js.map +0 -1
  67. package/dist/utils/etag.d.ts +0 -15
  68. package/dist/utils/etag.d.ts.map +0 -1
  69. package/dist/utils/filename.d.ts +0 -4
  70. package/dist/utils/filename.d.ts.map +0 -1
  71. package/dist/utils/headers.d.ts +0 -31
  72. package/dist/utils/headers.d.ts.map +0 -1
  73. package/dist/utils/index.d.ts +0 -8
  74. package/dist/utils/index.d.ts.map +0 -1
  75. package/dist/utils/method.d.ts +0 -6
  76. package/dist/utils/method.d.ts.map +0 -1
  77. package/dist/utils/options.d.ts +0 -64
  78. package/dist/utils/options.d.ts.map +0 -1
  79. package/dist/utils/range.d.ts +0 -4
  80. package/dist/utils/range.d.ts.map +0 -1
  81. package/dist/utils/status.d.ts +0 -17
  82. package/dist/utils/status.d.ts.map +0 -1
package/dist/serve.cjs CHANGED
@@ -1,103 +1,107 @@
1
- 'use strict';
2
-
3
- var node_http = require('node:http');
4
- var node_https = require('node:https');
5
- var helpers = require('@milaboratories/helpers');
6
- var plModelCommon = require('@milaboratories/pl-model-common');
7
- var selfsigned = require('selfsigned');
8
- var node_crypto = require('node:crypto');
9
- var handler = require('./handler.cjs');
10
-
1
+ const require_handler = require("./handler.cjs");
2
+ let node_crypto = require("node:crypto");
3
+ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
4
+ let node_http = require("node:http");
5
+ let node_https = require("node:https");
6
+ let _milaboratories_helpers = require("@milaboratories/helpers");
7
+ let selfsigned = require("selfsigned");
8
+ //#region src/serve.ts
11
9
  /** Generate a self-signed certificate for localhost */
12
10
  async function generateCertificate() {
13
- return await selfsigned.generate([{ name: "commonName", value: "localhost" }], {
14
- keySize: 2048,
15
- algorithm: "sha256",
16
- extensions: [
17
- {
18
- name: "subjectAltName",
19
- altNames: [
20
- { type: 2, value: "localhost" }, // DNS
21
- { type: 7, ip: "127.0.0.1" }, // IPv4
22
- { type: 7, ip: "::1" }, // IPv6
23
- ],
24
- },
25
- ],
26
- });
11
+ return await (0, selfsigned.generate)([{
12
+ name: "commonName",
13
+ value: "localhost"
14
+ }], {
15
+ keySize: 2048,
16
+ algorithm: "sha256",
17
+ extensions: [{
18
+ name: "subjectAltName",
19
+ altNames: [
20
+ {
21
+ type: 2,
22
+ value: "localhost"
23
+ },
24
+ {
25
+ type: 7,
26
+ ip: "127.0.0.1"
27
+ },
28
+ {
29
+ type: 7,
30
+ ip: "::1"
31
+ }
32
+ ]
33
+ }]
34
+ });
27
35
  }
28
36
  /** Create an object store URL from the server address info. */
29
37
  function createObjectStoreUrl(info, noHttps) {
30
- const protocol = noHttps ? "http" : "https";
31
- switch (info.family) {
32
- case "IPv4":
33
- return `${protocol}://${info.address}:${info.port}/`;
34
- case "IPv6":
35
- return `${protocol}://[${info.address}]:${info.port}/`;
36
- default:
37
- return `${protocol}://localhost:${info.port}/`;
38
- }
38
+ const protocol = noHttps ? "http" : "https";
39
+ switch (info.family) {
40
+ case "IPv4": return `${protocol}://${info.address}:${info.port}/`;
41
+ case "IPv6": return `${protocol}://[${info.address}]:${info.port}/`;
42
+ default: return `${protocol}://localhost:${info.port}/`;
43
+ }
39
44
  }
40
45
  /**
41
- * Serve HTTP requests using the provided handler.
42
- * Returns a promise that resolves when the server is stopped.
43
- */
44
- async function serve({ handler: handler$1, port = 0, noHttps, noAuth, }) {
45
- const started = new helpers.Deferred();
46
- try {
47
- let stopped = null;
48
- let authToken;
49
- let effectiveHandler = handler$1;
50
- if (!noAuth) {
51
- authToken = node_crypto.randomUUID();
52
- effectiveHandler = handler.authorizeRequestHandler(effectiveHandler, authToken);
53
- }
54
- // Create HTTP server
55
- let encodedCaCert;
56
- const defaultOptions = {
57
- keepAlive: true,
58
- };
59
- let server;
60
- if (noHttps) {
61
- server = node_http.createServer(defaultOptions, effectiveHandler);
62
- }
63
- else {
64
- const { cert, private: key, public: ca } = await generateCertificate();
65
- encodedCaCert = plModelCommon.base64Encode(cert);
66
- server = node_https.createServer({ ...defaultOptions, cert, key, ca }, effectiveHandler);
67
- }
68
- server
69
- .on("listening", () => {
70
- // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>
71
- const url = createObjectStoreUrl(server.address(), noHttps);
72
- stopped = new helpers.Deferred();
73
- started.resolve({
74
- get info() {
75
- return { url, authToken, encodedCaCert };
76
- },
77
- get stopped() {
78
- return stopped.promise;
79
- },
80
- stop() {
81
- server.close();
82
- return stopped.promise;
83
- },
84
- });
85
- })
86
- .on("error", (err) => {
87
- started.reject(err);
88
- stopped?.reject(err);
89
- })
90
- .on("close", () => stopped?.resolve())
91
- .listen({
92
- host: "localhost",
93
- port,
94
- });
95
- }
96
- catch (error) {
97
- started.reject(plModelCommon.ensureError(error));
98
- }
99
- return started.promise;
46
+ * Serve HTTP requests using the provided handler.
47
+ * Returns a promise that resolves when the server is stopped.
48
+ */
49
+ async function serve({ handler, port = 0, noHttps, noAuth }) {
50
+ const started = new _milaboratories_helpers.Deferred();
51
+ try {
52
+ let stopped = null;
53
+ let authToken;
54
+ let effectiveHandler = handler;
55
+ if (!noAuth) {
56
+ authToken = (0, node_crypto.randomUUID)();
57
+ effectiveHandler = require_handler.authorizeRequestHandler(effectiveHandler, authToken);
58
+ }
59
+ let encodedCaCert;
60
+ const defaultOptions = { keepAlive: true };
61
+ let server;
62
+ if (noHttps) server = (0, node_http.createServer)(defaultOptions, effectiveHandler);
63
+ else {
64
+ const { cert, private: key, public: ca } = await generateCertificate();
65
+ encodedCaCert = (0, _milaboratories_pl_model_common.base64Encode)(cert);
66
+ server = (0, node_https.createServer)({
67
+ ...defaultOptions,
68
+ cert,
69
+ key,
70
+ ca
71
+ }, effectiveHandler);
72
+ }
73
+ server.on("listening", () => {
74
+ const url = createObjectStoreUrl(server.address(), noHttps);
75
+ stopped = new _milaboratories_helpers.Deferred();
76
+ started.resolve({
77
+ get info() {
78
+ return {
79
+ url,
80
+ authToken,
81
+ encodedCaCert
82
+ };
83
+ },
84
+ get stopped() {
85
+ return stopped.promise;
86
+ },
87
+ stop() {
88
+ server.close();
89
+ return stopped.promise;
90
+ }
91
+ });
92
+ }).on("error", (err) => {
93
+ started.reject(err);
94
+ stopped?.reject(err);
95
+ }).on("close", () => stopped?.resolve()).listen({
96
+ host: "localhost",
97
+ port
98
+ });
99
+ } catch (error) {
100
+ started.reject((0, _milaboratories_pl_model_common.ensureError)(error));
101
+ }
102
+ return started.promise;
100
103
  }
101
-
104
+ //#endregion
102
105
  exports.serve = serve;
103
- //# sourceMappingURL=serve.cjs.map
106
+
107
+ //# sourceMappingURL=serve.cjs.map
@@ -1 +1 @@
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 { createServer as createHttpsServer, type Server as HttpsServer } from \"node:https\";\nimport type { AddressInfo } from \"node:net\";\nimport { Deferred } from \"@milaboratories/helpers\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { base64Encode, Base64Encoded, ensureError } 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 return await generate([{ name: \"commonName\", value: \"localhost\" }], {\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}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(info: AddressInfo, noHttps?: true): PFrameInternal.ObjectStoreUrl {\n const protocol = noHttps ? \"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 return `${protocol}://localhost:${info.port}/` as PFrameInternal.ObjectStoreUrl;\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 noHttps,\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 encodedCaCert: Base64Encoded<PFrameInternal.PemCertificate> | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true,\n };\n let server: HttpServer | HttpsServer;\n\n if (noHttps) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n encodedCaCert = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer({ ...defaultOptions, cert, key, ca }, effectiveHandler);\n }\n\n server\n .on(\"listening\", () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const url = createObjectStoreUrl(server.address() as AddressInfo, noHttps);\n stopped = new Deferred<void>();\n\n started.resolve({\n get info(): PFrameInternal.HttpServerInfo {\n return { url, authToken, encodedCaCert };\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n server.close();\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 });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"names":["generate","handler","Deferred","randomUUID","authorizeRequestHandler","createHttpServer","base64Encode","createHttpsServer","ensureError"],"mappings":";;;;;;;;;;AAeA;AACA,eAAe,mBAAmB,GAAA;AAChC,IAAA,OAAO,MAAMA,mBAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE;AAClE,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,iBAAA;AACF,aAAA;AACF,SAAA;AACF,KAAA,CAAC;AACJ;AAEA;AACA,SAAS,oBAAoB,CAAC,IAAiB,EAAE,OAAc,EAAA;IAC7D,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO;AAC3C,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;AACE,YAAA,OAAO,GAAG,QAAQ,CAAA,aAAA,EAAgB,IAAI,CAAC,IAAI,GAAoC;;AAErF;AAEA;;;AAGG;AACI,eAAe,KAAK,CAAC,WAC1BC,SAAO,EACP,IAAI,GAAG,CAAC,EACR,OAAO,EACP,MAAM,GAC2B,EAAA;AACjC,IAAA,MAAM,OAAO,GAAG,IAAIC,gBAAQ,EAA6B;AACzD,IAAA,IAAI;QACF,IAAI,OAAO,GAA0B,IAAI;AAEzC,QAAA,IAAI,SAA4D;QAChE,IAAI,gBAAgB,GAAoBD,SAAO;QAC/C,IAAI,CAAC,MAAM,EAAE;YACX,SAAS,GAAGE,sBAAU,EAA2C;AACjE,YAAA,gBAAgB,GAAGC,+BAAuB,CAAC,gBAAgB,EAAE,SAAS,CAAC;QACzE;;AAGA,QAAA,IAAI,aAAuE;AAC3E,QAAA,MAAM,cAAc,GAAkB;AACpC,YAAA,SAAS,EAAE,IAAI;SAChB;AACD,QAAA,IAAI,MAAgC;QAEpC,IAAI,OAAO,EAAE;AACX,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,aAAa,GAAGC,0BAAY,CAAC,IAAqC,CAAC;AACnE,YAAA,MAAM,GAAGC,uBAAiB,CAAC,EAAE,GAAG,cAAc,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,gBAAgB,CAAC;QACpF;QAEA;AACG,aAAA,EAAE,CAAC,WAAW,EAAE,MAAK;;YAEpB,MAAM,GAAG,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,EAAiB,EAAE,OAAO,CAAC;AAC1E,YAAA,OAAO,GAAG,IAAIL,gBAAQ,EAAQ;YAE9B,OAAO,CAAC,OAAO,CAAC;AACd,gBAAA,IAAI,IAAI,GAAA;AACN,oBAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,aAAa,EAAE;gBAC1C,CAAC;AACD,gBAAA,IAAI,OAAO,GAAA;oBACT,OAAO,OAAQ,CAAC,OAAO;gBACzB,CAAC;gBACD,IAAI,GAAA;oBACF,MAAM,CAAC,KAAK,EAAE;oBACd,OAAO,OAAQ,CAAC,OAAO;gBACzB,CAAC;AACF,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;AACL,SAAA,CAAC;IACN;IAAE,OAAO,KAAc,EAAE;QACvB,OAAO,CAAC,MAAM,CAACM,yBAAW,CAAC,KAAK,CAAC,CAAC;IACpC;IAEA,OAAO,OAAO,CAAC,OAAO;AACxB;;;;"}
1
+ {"version":3,"file":"serve.cjs","names":["Deferred","authorizeRequestHandler"],"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 { createServer as createHttpsServer, type Server as HttpsServer } from \"node:https\";\nimport type { AddressInfo } from \"node:net\";\nimport { Deferred } from \"@milaboratories/helpers\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { base64Encode, Base64Encoded, ensureError } 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 return await generate([{ name: \"commonName\", value: \"localhost\" }], {\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}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(info: AddressInfo, noHttps?: true): PFrameInternal.ObjectStoreUrl {\n const protocol = noHttps ? \"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 return `${protocol}://localhost:${info.port}/` as PFrameInternal.ObjectStoreUrl;\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 noHttps,\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 encodedCaCert: Base64Encoded<PFrameInternal.PemCertificate> | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true,\n };\n let server: HttpServer | HttpsServer;\n\n if (noHttps) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n encodedCaCert = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer({ ...defaultOptions, cert, key, ca }, effectiveHandler);\n }\n\n server\n .on(\"listening\", () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const url = createObjectStoreUrl(server.address() as AddressInfo, noHttps);\n stopped = new Deferred<void>();\n\n started.resolve({\n get info(): PFrameInternal.HttpServerInfo {\n return { url, authToken, encodedCaCert };\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n server.close();\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 });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"mappings":";;;;;;;;;AAgBA,eAAe,sBAA+C;AAC5D,QAAO,OAAA,GAAA,WAAA,UAAe,CAAC;EAAE,MAAM;EAAc,OAAO;EAAa,CAAC,EAAE;EAClE,SAAS;EACT,WAAW;EACX,YAAY,CACV;GACE,MAAM;GACN,UAAU;IACR;KAAE,MAAM;KAAG,OAAO;KAAa;IAC/B;KAAE,MAAM;KAAG,IAAI;KAAa;IAC5B;KAAE,MAAM;KAAG,IAAI;KAAO;IACvB;GACF,CACF;EACF,CAAC;;;AAIJ,SAAS,qBAAqB,MAAmB,SAA+C;CAC9F,MAAM,WAAW,UAAU,SAAS;AACpC,SAAQ,KAAK,QAAb;EACE,KAAK,OACH,QAAO,GAAG,SAAS,KAAK,KAAK,QAAQ,GAAG,KAAK,KAAK;EACpD,KAAK,OACH,QAAO,GAAG,SAAS,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;EACtD,QACE,QAAO,GAAG,SAAS,eAAe,KAAK,KAAK;;;;;;;AAQlD,eAAsB,MAAM,EAC1B,SACA,OAAO,GACP,SACA,UACuE;CACvE,MAAM,UAAU,IAAIA,wBAAAA,UAAqC;AACzD,KAAI;EACF,IAAI,UAAiC;EAErC,IAAI;EACJ,IAAI,mBAAoC;AACxC,MAAI,CAAC,QAAQ;AACX,gBAAA,GAAA,YAAA,aAAwB;AACxB,sBAAmBC,gBAAAA,wBAAwB,kBAAkB,UAAU;;EAIzE,IAAI;EACJ,MAAM,iBAAgC,EACpC,WAAW,MACZ;EACD,IAAI;AAEJ,MAAI,QACF,WAAA,GAAA,UAAA,cAA0B,gBAAgB,iBAAiB;OACtD;GACL,MAAM,EAAE,MAAM,SAAS,KAAK,QAAQ,OAAO,MAAM,qBAAqB;AACtE,oBAAA,GAAA,gCAAA,cAA6B,KAAsC;AACnE,aAAA,GAAA,WAAA,cAA2B;IAAE,GAAG;IAAgB;IAAM;IAAK;IAAI,EAAE,iBAAiB;;AAGpF,SACG,GAAG,mBAAmB;GAErB,MAAM,MAAM,qBAAqB,OAAO,SAAS,EAAiB,QAAQ;AAC1E,aAAU,IAAID,wBAAAA,UAAgB;AAE9B,WAAQ,QAAQ;IACd,IAAI,OAAsC;AACxC,YAAO;MAAE;MAAK;MAAW;MAAe;;IAE1C,IAAI,UAAyB;AAC3B,YAAO,QAAS;;IAElB,OAAsB;AACpB,YAAO,OAAO;AACd,YAAO,QAAS;;IAEnB,CAAC;IACF,CACD,GAAG,UAAU,QAAQ;AACpB,WAAQ,OAAO,IAAI;AACnB,YAAS,OAAO,IAAI;IACpB,CACD,GAAG,eAAe,SAAS,SAAS,CAAC,CACrC,OAAO;GACN,MAAM;GACN;GACD,CAAC;UACG,OAAgB;AACvB,UAAQ,QAAA,GAAA,gCAAA,aAAmB,MAAM,CAAC;;AAGpC,QAAO,QAAQ"}
package/dist/serve.d.ts CHANGED
@@ -1,7 +1,16 @@
1
- import type { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
1
+ import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
2
+
3
+ //#region src/serve.d.ts
2
4
  /**
3
5
  * Serve HTTP requests using the provided handler.
4
6
  * Returns a promise that resolves when the server is stopped.
5
7
  */
6
- export declare function serve({ handler, port, noHttps, noAuth, }: PFrameInternal.HttpServerOptions): Promise<PFrameInternal.HttpServer>;
8
+ declare function serve({
9
+ handler,
10
+ port,
11
+ noHttps,
12
+ noAuth
13
+ }: PFrameInternal.HttpServerOptions): Promise<PFrameInternal.HttpServer>;
14
+ //#endregion
15
+ export { serve };
7
16
  //# sourceMappingURL=serve.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAqC5E;;;GAGG;AACH,wBAAsB,KAAK,CAAC,EAC1B,OAAO,EACP,IAAQ,EACR,OAAO,EACP,MAAM,GACP,EAAE,cAAc,CAAC,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,UAAU,CAAC,CA4DvE"}
1
+ {"version":3,"file":"serve.d.ts","names":[],"sources":["../src/serve.ts"],"mappings":";;;;;AAkDA;;iBAAsB,KAAA,CAAA;EACpB,OAAA;EACA,IAAA;EACA,OAAA;EACA;AAAA,GACC,cAAA,CAAe,iBAAA,GAAoB,OAAA,CAAQ,cAAA,CAAe,UAAA"}
package/dist/serve.js CHANGED
@@ -1,101 +1,107 @@
1
- import { createServer } from 'node:http';
2
- import { createServer as createServer$1 } from 'node:https';
3
- import { Deferred } from '@milaboratories/helpers';
4
- import { base64Encode, ensureError } from '@milaboratories/pl-model-common';
5
- import { generate } from 'selfsigned';
6
- import { randomUUID } from 'node:crypto';
7
- import { authorizeRequestHandler } from './handler.js';
8
-
1
+ import { authorizeRequestHandler } from "./handler.js";
2
+ import { randomUUID } from "node:crypto";
3
+ import { base64Encode, ensureError } from "@milaboratories/pl-model-common";
4
+ import { createServer } from "node:http";
5
+ import { createServer as createServer$1 } from "node:https";
6
+ import { Deferred } from "@milaboratories/helpers";
7
+ import { generate } from "selfsigned";
8
+ //#region src/serve.ts
9
9
  /** Generate a self-signed certificate for localhost */
10
10
  async function generateCertificate() {
11
- return await generate([{ name: "commonName", value: "localhost" }], {
12
- keySize: 2048,
13
- algorithm: "sha256",
14
- extensions: [
15
- {
16
- name: "subjectAltName",
17
- altNames: [
18
- { type: 2, value: "localhost" }, // DNS
19
- { type: 7, ip: "127.0.0.1" }, // IPv4
20
- { type: 7, ip: "::1" }, // IPv6
21
- ],
22
- },
23
- ],
24
- });
11
+ return await generate([{
12
+ name: "commonName",
13
+ value: "localhost"
14
+ }], {
15
+ keySize: 2048,
16
+ algorithm: "sha256",
17
+ extensions: [{
18
+ name: "subjectAltName",
19
+ altNames: [
20
+ {
21
+ type: 2,
22
+ value: "localhost"
23
+ },
24
+ {
25
+ type: 7,
26
+ ip: "127.0.0.1"
27
+ },
28
+ {
29
+ type: 7,
30
+ ip: "::1"
31
+ }
32
+ ]
33
+ }]
34
+ });
25
35
  }
26
36
  /** Create an object store URL from the server address info. */
27
37
  function createObjectStoreUrl(info, noHttps) {
28
- const protocol = noHttps ? "http" : "https";
29
- switch (info.family) {
30
- case "IPv4":
31
- return `${protocol}://${info.address}:${info.port}/`;
32
- case "IPv6":
33
- return `${protocol}://[${info.address}]:${info.port}/`;
34
- default:
35
- return `${protocol}://localhost:${info.port}/`;
36
- }
38
+ const protocol = noHttps ? "http" : "https";
39
+ switch (info.family) {
40
+ case "IPv4": return `${protocol}://${info.address}:${info.port}/`;
41
+ case "IPv6": return `${protocol}://[${info.address}]:${info.port}/`;
42
+ default: return `${protocol}://localhost:${info.port}/`;
43
+ }
37
44
  }
38
45
  /**
39
- * Serve HTTP requests using the provided handler.
40
- * Returns a promise that resolves when the server is stopped.
41
- */
42
- async function serve({ handler, port = 0, noHttps, noAuth, }) {
43
- const started = new Deferred();
44
- try {
45
- let stopped = null;
46
- let authToken;
47
- let effectiveHandler = handler;
48
- if (!noAuth) {
49
- authToken = randomUUID();
50
- effectiveHandler = authorizeRequestHandler(effectiveHandler, authToken);
51
- }
52
- // Create HTTP server
53
- let encodedCaCert;
54
- const defaultOptions = {
55
- keepAlive: true,
56
- };
57
- let server;
58
- if (noHttps) {
59
- server = createServer(defaultOptions, effectiveHandler);
60
- }
61
- else {
62
- const { cert, private: key, public: ca } = await generateCertificate();
63
- encodedCaCert = base64Encode(cert);
64
- server = createServer$1({ ...defaultOptions, cert, key, ca }, effectiveHandler);
65
- }
66
- server
67
- .on("listening", () => {
68
- // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>
69
- const url = createObjectStoreUrl(server.address(), noHttps);
70
- stopped = new Deferred();
71
- started.resolve({
72
- get info() {
73
- return { url, authToken, encodedCaCert };
74
- },
75
- get stopped() {
76
- return stopped.promise;
77
- },
78
- stop() {
79
- server.close();
80
- return stopped.promise;
81
- },
82
- });
83
- })
84
- .on("error", (err) => {
85
- started.reject(err);
86
- stopped?.reject(err);
87
- })
88
- .on("close", () => stopped?.resolve())
89
- .listen({
90
- host: "localhost",
91
- port,
92
- });
93
- }
94
- catch (error) {
95
- started.reject(ensureError(error));
96
- }
97
- return started.promise;
46
+ * Serve HTTP requests using the provided handler.
47
+ * Returns a promise that resolves when the server is stopped.
48
+ */
49
+ async function serve({ handler, port = 0, noHttps, noAuth }) {
50
+ const started = new Deferred();
51
+ try {
52
+ let stopped = null;
53
+ let authToken;
54
+ let effectiveHandler = handler;
55
+ if (!noAuth) {
56
+ authToken = randomUUID();
57
+ effectiveHandler = authorizeRequestHandler(effectiveHandler, authToken);
58
+ }
59
+ let encodedCaCert;
60
+ const defaultOptions = { keepAlive: true };
61
+ let server;
62
+ if (noHttps) server = createServer(defaultOptions, effectiveHandler);
63
+ else {
64
+ const { cert, private: key, public: ca } = await generateCertificate();
65
+ encodedCaCert = base64Encode(cert);
66
+ server = createServer$1({
67
+ ...defaultOptions,
68
+ cert,
69
+ key,
70
+ ca
71
+ }, effectiveHandler);
72
+ }
73
+ server.on("listening", () => {
74
+ const url = createObjectStoreUrl(server.address(), noHttps);
75
+ stopped = new Deferred();
76
+ started.resolve({
77
+ get info() {
78
+ return {
79
+ url,
80
+ authToken,
81
+ encodedCaCert
82
+ };
83
+ },
84
+ get stopped() {
85
+ return stopped.promise;
86
+ },
87
+ stop() {
88
+ server.close();
89
+ return stopped.promise;
90
+ }
91
+ });
92
+ }).on("error", (err) => {
93
+ started.reject(err);
94
+ stopped?.reject(err);
95
+ }).on("close", () => stopped?.resolve()).listen({
96
+ host: "localhost",
97
+ port
98
+ });
99
+ } catch (error) {
100
+ started.reject(ensureError(error));
101
+ }
102
+ return started.promise;
98
103
  }
99
-
104
+ //#endregion
100
105
  export { serve };
101
- //# sourceMappingURL=serve.js.map
106
+
107
+ //# sourceMappingURL=serve.js.map
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 type RequestListener,\n type Server as HttpServer,\n type ServerOptions,\n} from \"node:http\";\nimport { createServer as createHttpsServer, type Server as HttpsServer } from \"node:https\";\nimport type { AddressInfo } from \"node:net\";\nimport { Deferred } from \"@milaboratories/helpers\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { base64Encode, Base64Encoded, ensureError } 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 return await generate([{ name: \"commonName\", value: \"localhost\" }], {\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}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(info: AddressInfo, noHttps?: true): PFrameInternal.ObjectStoreUrl {\n const protocol = noHttps ? \"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 return `${protocol}://localhost:${info.port}/` as PFrameInternal.ObjectStoreUrl;\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 noHttps,\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 encodedCaCert: Base64Encoded<PFrameInternal.PemCertificate> | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true,\n };\n let server: HttpServer | HttpsServer;\n\n if (noHttps) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n encodedCaCert = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer({ ...defaultOptions, cert, key, ca }, effectiveHandler);\n }\n\n server\n .on(\"listening\", () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const url = createObjectStoreUrl(server.address() as AddressInfo, noHttps);\n stopped = new Deferred<void>();\n\n started.resolve({\n get info(): PFrameInternal.HttpServerInfo {\n return { url, authToken, encodedCaCert };\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n server.close();\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 });\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","names":["createHttpServer","createHttpsServer"],"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 { createServer as createHttpsServer, type Server as HttpsServer } from \"node:https\";\nimport type { AddressInfo } from \"node:net\";\nimport { Deferred } from \"@milaboratories/helpers\";\nimport type { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { base64Encode, Base64Encoded, ensureError } 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 return await generate([{ name: \"commonName\", value: \"localhost\" }], {\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}\n\n/** Create an object store URL from the server address info. */\nfunction createObjectStoreUrl(info: AddressInfo, noHttps?: true): PFrameInternal.ObjectStoreUrl {\n const protocol = noHttps ? \"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 return `${protocol}://localhost:${info.port}/` as PFrameInternal.ObjectStoreUrl;\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 noHttps,\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 encodedCaCert: Base64Encoded<PFrameInternal.PemCertificate> | undefined;\n const defaultOptions: ServerOptions = {\n keepAlive: true,\n };\n let server: HttpServer | HttpsServer;\n\n if (noHttps) {\n server = createHttpServer(defaultOptions, effectiveHandler);\n } else {\n const { cert, private: key, public: ca } = await generateCertificate();\n encodedCaCert = base64Encode(cert as PFrameInternal.PemCertificate);\n server = createHttpsServer({ ...defaultOptions, cert, key, ca }, effectiveHandler);\n }\n\n server\n .on(\"listening\", () => {\n // Cast is safe by specification <https://nodejs.org/api/net.html#serveraddress>\n const url = createObjectStoreUrl(server.address() as AddressInfo, noHttps);\n stopped = new Deferred<void>();\n\n started.resolve({\n get info(): PFrameInternal.HttpServerInfo {\n return { url, authToken, encodedCaCert };\n },\n get stopped(): Promise<void> {\n return stopped!.promise;\n },\n stop(): Promise<void> {\n server.close();\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 });\n } catch (error: unknown) {\n started.reject(ensureError(error));\n }\n\n return started.promise;\n}\n"],"mappings":";;;;;;;;;AAgBA,eAAe,sBAA+C;AAC5D,QAAO,MAAM,SAAS,CAAC;EAAE,MAAM;EAAc,OAAO;EAAa,CAAC,EAAE;EAClE,SAAS;EACT,WAAW;EACX,YAAY,CACV;GACE,MAAM;GACN,UAAU;IACR;KAAE,MAAM;KAAG,OAAO;KAAa;IAC/B;KAAE,MAAM;KAAG,IAAI;KAAa;IAC5B;KAAE,MAAM;KAAG,IAAI;KAAO;IACvB;GACF,CACF;EACF,CAAC;;;AAIJ,SAAS,qBAAqB,MAAmB,SAA+C;CAC9F,MAAM,WAAW,UAAU,SAAS;AACpC,SAAQ,KAAK,QAAb;EACE,KAAK,OACH,QAAO,GAAG,SAAS,KAAK,KAAK,QAAQ,GAAG,KAAK,KAAK;EACpD,KAAK,OACH,QAAO,GAAG,SAAS,MAAM,KAAK,QAAQ,IAAI,KAAK,KAAK;EACtD,QACE,QAAO,GAAG,SAAS,eAAe,KAAK,KAAK;;;;;;;AAQlD,eAAsB,MAAM,EAC1B,SACA,OAAO,GACP,SACA,UACuE;CACvE,MAAM,UAAU,IAAI,UAAqC;AACzD,KAAI;EACF,IAAI,UAAiC;EAErC,IAAI;EACJ,IAAI,mBAAoC;AACxC,MAAI,CAAC,QAAQ;AACX,eAAY,YAAY;AACxB,sBAAmB,wBAAwB,kBAAkB,UAAU;;EAIzE,IAAI;EACJ,MAAM,iBAAgC,EACpC,WAAW,MACZ;EACD,IAAI;AAEJ,MAAI,QACF,UAASA,aAAiB,gBAAgB,iBAAiB;OACtD;GACL,MAAM,EAAE,MAAM,SAAS,KAAK,QAAQ,OAAO,MAAM,qBAAqB;AACtE,mBAAgB,aAAa,KAAsC;AACnE,YAASC,eAAkB;IAAE,GAAG;IAAgB;IAAM;IAAK;IAAI,EAAE,iBAAiB;;AAGpF,SACG,GAAG,mBAAmB;GAErB,MAAM,MAAM,qBAAqB,OAAO,SAAS,EAAiB,QAAQ;AAC1E,aAAU,IAAI,UAAgB;AAE9B,WAAQ,QAAQ;IACd,IAAI,OAAsC;AACxC,YAAO;MAAE;MAAK;MAAW;MAAe;;IAE1C,IAAI,UAAyB;AAC3B,YAAO,QAAS;;IAElB,OAAsB;AACpB,YAAO,OAAO;AACd,YAAO,QAAS;;IAEnB,CAAC;IACF,CACD,GAAG,UAAU,QAAQ;AACpB,WAAQ,OAAO,IAAI;AACnB,YAAS,OAAO,IAAI;IACpB,CACD,GAAG,eAAe,SAAS,SAAS,CAAC,CACrC,OAAO;GACN,MAAM;GACN;GACD,CAAC;UACG,OAAgB;AACvB,UAAQ,OAAO,YAAY,MAAM,CAAC;;AAGpC,QAAO,QAAQ"}
@@ -1,10 +1,8 @@
1
- 'use strict';
2
-
1
+ //#region src/utils/etag.ts
3
2
  function createETag(filename) {
4
- // For immutable files, use URL-safe base64 encoded filename as ETag
5
- const filenameETag = Buffer.from(filename, "utf8").toString("base64url");
6
- return `"${filenameETag}"`;
3
+ return `"${Buffer.from(filename, "utf8").toString("base64url")}"`;
7
4
  }
8
-
5
+ //#endregion
9
6
  exports.createETag = createETag;
10
- //# sourceMappingURL=etag.cjs.map
7
+
8
+ //# sourceMappingURL=etag.cjs.map
@@ -1 +1 @@
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
+ {"version":3,"file":"etag.cjs","names":[],"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"],"mappings":";AAeA,SAAgB,WAAW,UAAgD;AAGzE,QAAO,IADc,OAAO,KAAK,UAAU,OAAO,CAAC,SAAS,YAAY,CAChD"}
@@ -1,8 +1,8 @@
1
+ //#region src/utils/etag.ts
1
2
  function createETag(filename) {
2
- // For immutable files, use URL-safe base64 encoded filename as ETag
3
- const filenameETag = Buffer.from(filename, "utf8").toString("base64url");
4
- return `"${filenameETag}"`;
3
+ return `"${Buffer.from(filename, "utf8").toString("base64url")}"`;
5
4
  }
6
-
5
+ //#endregion
7
6
  export { createETag };
8
- //# sourceMappingURL=etag.js.map
7
+
8
+ //# sourceMappingURL=etag.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"etag.js","names":[],"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"],"mappings":";AAeA,SAAgB,WAAW,UAAgD;AAGzE,QAAO,IADc,OAAO,KAAK,UAAU,OAAO,CAAC,SAAS,YAAY,CAChD"}
@@ -1,15 +1,13 @@
1
- 'use strict';
2
-
1
+ //#region src/utils/filename.ts
3
2
  const PARQUET_FILENAME_REGEX = /^\/([\w\-.]+.parquet)$/;
4
3
  function getFilenameFromUrl(request) {
5
- const url = request.url;
6
- if (url === undefined)
7
- return null;
8
- const match = url.match(PARQUET_FILENAME_REGEX);
9
- if (!match)
10
- return null;
11
- return match[1];
4
+ const url = request.url;
5
+ if (url === void 0) return null;
6
+ const match = url.match(PARQUET_FILENAME_REGEX);
7
+ if (!match) return null;
8
+ return match[1];
12
9
  }
13
-
10
+ //#endregion
14
11
  exports.getFilenameFromUrl = getFilenameFromUrl;
15
- //# sourceMappingURL=filename.cjs.map
12
+
13
+ //# sourceMappingURL=filename.cjs.map
@@ -1 +1 @@
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
+ {"version":3,"file":"filename.cjs","names":[],"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"],"mappings":";AAGA,MAAM,yBAAyB;AAE/B,SAAgB,mBACd,SACuC;CACvC,MAAM,MAAM,QAAQ;AACpB,KAAI,QAAQ,KAAA,EAAW,QAAO;CAE9B,MAAM,QAAQ,IAAI,MAAM,uBAAuB;AAC/C,KAAI,CAAC,MAAO,QAAO;AAEnB,QAAO,MAAM"}
@@ -1,13 +1,13 @@
1
+ //#region src/utils/filename.ts
1
2
  const PARQUET_FILENAME_REGEX = /^\/([\w\-.]+.parquet)$/;
2
3
  function getFilenameFromUrl(request) {
3
- const url = request.url;
4
- if (url === undefined)
5
- return null;
6
- const match = url.match(PARQUET_FILENAME_REGEX);
7
- if (!match)
8
- return null;
9
- return match[1];
4
+ const url = request.url;
5
+ if (url === void 0) return null;
6
+ const match = url.match(PARQUET_FILENAME_REGEX);
7
+ if (!match) return null;
8
+ return match[1];
10
9
  }
11
-
10
+ //#endregion
12
11
  export { getFilenameFromUrl };
13
- //# sourceMappingURL=filename.js.map
12
+
13
+ //# sourceMappingURL=filename.js.map