@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/export.cjs CHANGED
@@ -1,20 +1,19 @@
1
- 'use strict';
2
-
3
- var fsStore = require('./fs-store.cjs');
4
- var handler = require('./handler.cjs');
5
- var serve = require('./serve.cjs');
6
-
1
+ const require_handler = require("./handler.cjs");
2
+ const require_fs_store = require("./fs-store.cjs");
3
+ const require_serve = require("./serve.cjs");
4
+ //#region src/export.ts
7
5
  const HttpHelpers = {
8
- createFsStore: async (options) => {
9
- return await fsStore.FileSystemStore.init(options);
10
- },
11
- createRequestHandler: (options) => {
12
- return handler.createRequestHandler(options);
13
- },
14
- createHttpServer: async (options) => {
15
- return await serve.serve(options);
16
- },
6
+ createFsStore: async (options) => {
7
+ return await require_fs_store.FileSystemStore.init(options);
8
+ },
9
+ createRequestHandler: (options) => {
10
+ return require_handler.createRequestHandler(options);
11
+ },
12
+ createHttpServer: async (options) => {
13
+ return await require_serve.serve(options);
14
+ }
17
15
  };
18
-
16
+ //#endregion
19
17
  exports.HttpHelpers = HttpHelpers;
20
- //# sourceMappingURL=export.cjs.map
18
+
19
+ //# sourceMappingURL=export.cjs.map
@@ -1 +1 @@
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: (options: PFrameInternal.RequestHandlerOptions): 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,CAAC,OAA6C,KAAqB;AACvF,QAAA,OAAOC,4BAAoB,CAAC,OAAO,CAAC;IACtC,CAAC;AACD,IAAA,gBAAgB,EAAE,OAChB,OAAyC,KACH;AACtC,QAAA,OAAO,MAAMC,WAAK,CAAC,OAAO,CAAC;IAC7B,CAAC;;;;;"}
1
+ {"version":3,"file":"export.cjs","names":["FileSystemStore","createRequestHandler","serve"],"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: (options: PFrameInternal.RequestHandlerOptions): 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"],"mappings":";;;;AAMA,MAAa,cAA0C;CACrD,eAAe,OACb,YACwC;AACxC,SAAO,MAAMA,iBAAAA,gBAAgB,KAAK,QAAQ;;CAE5C,uBAAuB,YAAmE;AACxF,SAAOC,gBAAAA,qBAAqB,QAAQ;;CAEtC,kBAAkB,OAChB,YACuC;AACvC,SAAO,MAAMC,cAAAA,MAAM,QAAQ;;CAE9B"}
package/dist/export.d.ts CHANGED
@@ -1,3 +1,7 @@
1
- import type { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
2
- export declare const HttpHelpers: PFrameInternal.HttpHelpers;
1
+ import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
2
+
3
+ //#region src/export.d.ts
4
+ declare const HttpHelpers: PFrameInternal.HttpHelpers;
5
+ //#endregion
6
+ export { HttpHelpers };
3
7
  //# sourceMappingURL=export.d.ts.map
@@ -1 +1 @@
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,WAcxC,CAAC"}
1
+ {"version":3,"file":"export.d.ts","names":[],"sources":["../src/export.ts"],"mappings":";;;cAMa,WAAA,EAAa,cAAA,CAAe,WAAA"}
package/dist/export.js CHANGED
@@ -1,18 +1,19 @@
1
- import { FileSystemStore } from './fs-store.js';
2
- import { createRequestHandler } from './handler.js';
3
- import { serve } from './serve.js';
4
-
1
+ import { createRequestHandler } from "./handler.js";
2
+ import { FileSystemStore } from "./fs-store.js";
3
+ import { serve } from "./serve.js";
4
+ //#region src/export.ts
5
5
  const HttpHelpers = {
6
- createFsStore: async (options) => {
7
- return await FileSystemStore.init(options);
8
- },
9
- createRequestHandler: (options) => {
10
- return createRequestHandler(options);
11
- },
12
- createHttpServer: async (options) => {
13
- return await serve(options);
14
- },
6
+ createFsStore: async (options) => {
7
+ return await FileSystemStore.init(options);
8
+ },
9
+ createRequestHandler: (options) => {
10
+ return createRequestHandler(options);
11
+ },
12
+ createHttpServer: async (options) => {
13
+ return await serve(options);
14
+ }
15
15
  };
16
-
16
+ //#endregion
17
17
  export { HttpHelpers };
18
- //# sourceMappingURL=export.js.map
18
+
19
+ //# sourceMappingURL=export.js.map
@@ -1 +1 @@
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: (options: PFrameInternal.RequestHandlerOptions): 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,CAAC,OAA6C,KAAqB;AACvF,QAAA,OAAO,oBAAoB,CAAC,OAAO,CAAC;IACtC,CAAC;AACD,IAAA,gBAAgB,EAAE,OAChB,OAAyC,KACH;AACtC,QAAA,OAAO,MAAM,KAAK,CAAC,OAAO,CAAC;IAC7B,CAAC;;;;;"}
1
+ {"version":3,"file":"export.js","names":[],"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: (options: PFrameInternal.RequestHandlerOptions): 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"],"mappings":";;;;AAMA,MAAa,cAA0C;CACrD,eAAe,OACb,YACwC;AACxC,SAAO,MAAM,gBAAgB,KAAK,QAAQ;;CAE5C,uBAAuB,YAAmE;AACxF,SAAO,qBAAqB,QAAQ;;CAEtC,kBAAkB,OAChB,YACuC;AACvC,SAAO,MAAM,MAAM,QAAQ;;CAE9B"}
package/dist/fs-store.cjs CHANGED
@@ -1,89 +1,85 @@
1
- 'use strict';
2
-
3
- var promises = require('node:fs/promises');
4
- var node_path = require('node:path');
5
- var plModelMiddleLayer = require('@milaboratories/pl-model-middle-layer');
6
- var plModelCommon = require('@milaboratories/pl-model-common');
7
-
1
+ let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
2
+ let node_fs_promises = require("node:fs/promises");
3
+ let node_path = require("node:path");
4
+ let _milaboratories_pl_model_middle_layer = require("@milaboratories/pl-model-middle-layer");
5
+ //#region src/fs-store.ts
8
6
  /** Object store for serving files from a local directory */
9
- class FileSystemStore extends plModelMiddleLayer.PFrameInternal.BaseObjectStore {
10
- rootDir;
11
- constructor(options) {
12
- super(options);
13
- this.rootDir = options.rootDir;
14
- }
15
- static async init(options) {
16
- const resolvedRootDir = node_path.resolve(options.rootDir);
17
- const rootStats = await promises.stat(resolvedRootDir).catch(() => {
18
- throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);
19
- });
20
- if (!rootStats.isDirectory()) {
21
- throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);
22
- }
23
- return new FileSystemStore({
24
- ...options,
25
- rootDir: resolvedRootDir,
26
- });
27
- }
28
- async request(filename, params) {
29
- let file;
30
- const respond = async (response) => {
31
- try {
32
- await params.callback(response).finally(async () => await file?.close());
33
- }
34
- catch (error) {
35
- this.logger("warn", `File system store received unexpected rejection from callback: ${plModelCommon.ensureError(error)}`);
36
- }
37
- };
38
- try {
39
- try {
40
- const path = node_path.join(this.rootDir, filename);
41
- file = await promises.open(path, "r");
42
- }
43
- catch (error) {
44
- this.logger("error", `File system store failed to open file ${filename}: ${plModelCommon.ensureError(error)}`);
45
- return await respond({ type: "NotFound" });
46
- }
47
- params.signal.throwIfAborted();
48
- let size;
49
- try {
50
- ({ size } = await file.stat());
51
- }
52
- catch (error) {
53
- this.logger("error", `File system store failed to get size of file ${filename}: ${plModelCommon.ensureError(error)}`);
54
- return await respond({ type: "InternalError" });
55
- }
56
- params.signal.throwIfAborted();
57
- const range = this.translate(size, params.range);
58
- if (!range) {
59
- return await respond({ type: "RangeNotSatisfiable", size });
60
- }
61
- if (params.method === "HEAD") {
62
- return await respond({ type: "Ok", size, range });
63
- }
64
- let data;
65
- try {
66
- data = file.createReadStream({
67
- start: range.start,
68
- end: range.end,
69
- autoClose: false,
70
- });
71
- this.logger("info", `File system store created read stream for ${filename}[${range.start}..=${range.end}]`);
72
- }
73
- catch (error) {
74
- this.logger("error", `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${plModelCommon.ensureError(error)}`);
75
- return await respond({ type: "InternalError" });
76
- }
77
- return await respond({ type: "Ok", size, range, data });
78
- }
79
- catch (error) {
80
- if (!plModelCommon.isAbortError(error)) {
81
- this.logger("warn", `File system store unhandled error: ${plModelCommon.ensureError(error)}`);
82
- }
83
- return await respond({ type: "InternalError" });
84
- }
85
- }
86
- }
87
-
7
+ var FileSystemStore = class FileSystemStore extends _milaboratories_pl_model_middle_layer.PFrameInternal.BaseObjectStore {
8
+ rootDir;
9
+ constructor(options) {
10
+ super(options);
11
+ this.rootDir = options.rootDir;
12
+ }
13
+ static async init(options) {
14
+ const resolvedRootDir = (0, node_path.resolve)(options.rootDir);
15
+ if (!(await (0, node_fs_promises.stat)(resolvedRootDir).catch(() => {
16
+ throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);
17
+ })).isDirectory()) throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);
18
+ return new FileSystemStore({
19
+ ...options,
20
+ rootDir: resolvedRootDir
21
+ });
22
+ }
23
+ async request(filename, params) {
24
+ let file;
25
+ const respond = async (response) => {
26
+ try {
27
+ await params.callback(response).finally(async () => await file?.close());
28
+ } catch (error) {
29
+ this.logger("warn", `File system store received unexpected rejection from callback: ${(0, _milaboratories_pl_model_common.ensureError)(error)}`);
30
+ }
31
+ };
32
+ try {
33
+ try {
34
+ file = await (0, node_fs_promises.open)((0, node_path.join)(this.rootDir, filename), "r");
35
+ } catch (error) {
36
+ this.logger("error", `File system store failed to open file ${filename}: ${(0, _milaboratories_pl_model_common.ensureError)(error)}`);
37
+ return await respond({ type: "NotFound" });
38
+ }
39
+ params.signal.throwIfAborted();
40
+ let size;
41
+ try {
42
+ ({size} = await file.stat());
43
+ } catch (error) {
44
+ this.logger("error", `File system store failed to get size of file ${filename}: ${(0, _milaboratories_pl_model_common.ensureError)(error)}`);
45
+ return await respond({ type: "InternalError" });
46
+ }
47
+ params.signal.throwIfAborted();
48
+ const range = this.translate(size, params.range);
49
+ if (!range) return await respond({
50
+ type: "RangeNotSatisfiable",
51
+ size
52
+ });
53
+ if (params.method === "HEAD") return await respond({
54
+ type: "Ok",
55
+ size,
56
+ range
57
+ });
58
+ let data;
59
+ try {
60
+ data = file.createReadStream({
61
+ start: range.start,
62
+ end: range.end,
63
+ autoClose: false
64
+ });
65
+ this.logger("info", `File system store created read stream for ${filename}[${range.start}..=${range.end}]`);
66
+ } catch (error) {
67
+ this.logger("error", `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${(0, _milaboratories_pl_model_common.ensureError)(error)}`);
68
+ return await respond({ type: "InternalError" });
69
+ }
70
+ return await respond({
71
+ type: "Ok",
72
+ size,
73
+ range,
74
+ data
75
+ });
76
+ } catch (error) {
77
+ if (!(0, _milaboratories_pl_model_common.isAbortError)(error)) this.logger("warn", `File system store unhandled error: ${(0, _milaboratories_pl_model_common.ensureError)(error)}`);
78
+ return await respond({ type: "InternalError" });
79
+ }
80
+ }
81
+ };
82
+ //#endregion
88
83
  exports.FileSystemStore = FileSystemStore;
89
- //# sourceMappingURL=fs-store.cjs.map
84
+
85
+ //# sourceMappingURL=fs-store.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-store.cjs","sources":["../src/fs-store.ts"],"sourcesContent":["import type { Readable } from \"node:stream\";\nimport { stat, open, type FileHandle } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { ensureError, isAbortError } from \"@milaboratories/pl-model-common\";\n\n/** Object store for serving files from a local directory */\nexport class FileSystemStore extends PFrameInternal.BaseObjectStore {\n private readonly rootDir: string;\n\n private constructor(options: PFrameInternal.FsStoreOptions) {\n super(options);\n\n this.rootDir = options.rootDir;\n }\n\n static async init(options: PFrameInternal.FsStoreOptions): Promise<FileSystemStore> {\n const resolvedRootDir = resolve(options.rootDir);\n\n const rootStats = await stat(resolvedRootDir).catch(() => {\n throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);\n });\n if (!rootStats.isDirectory()) {\n throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);\n }\n\n return new FileSystemStore({\n ...options,\n rootDir: resolvedRootDir,\n });\n }\n\n override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n let file: FileHandle | undefined;\n const respond = async (response: PFrameInternal.ObjectStoreResponse) => {\n try {\n await params.callback(response).finally(async () => await file?.close());\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `File system store received unexpected rejection from callback: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n try {\n const path = join(this.rootDir, filename);\n file = await open(path, \"r\");\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to open file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"NotFound\" });\n }\n params.signal.throwIfAborted();\n\n let size: number;\n try {\n ({ size } = await file.stat());\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to get size of file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const range = this.translate(size, params.range);\n if (!range) {\n return await respond({ type: \"RangeNotSatisfiable\", size });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({ type: \"Ok\", size, range });\n }\n\n let data: Readable;\n try {\n data = file.createReadStream({\n start: range.start,\n end: range.end,\n autoClose: false,\n });\n this.logger(\n \"info\",\n `File system store created read stream for ${filename}[${range.start}..=${range.end}]`,\n );\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n\n return await respond({ type: \"Ok\", size, range, data });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n this.logger(\"warn\", `File system store unhandled error: ${ensureError(error)}`);\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n"],"names":["PFrameInternal","resolve","stat","ensureError","join","open","isAbortError"],"mappings":"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"}
1
+ {"version":3,"file":"fs-store.cjs","names":["PFrameInternal"],"sources":["../src/fs-store.ts"],"sourcesContent":["import type { Readable } from \"node:stream\";\nimport { stat, open, type FileHandle } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { ensureError, isAbortError } from \"@milaboratories/pl-model-common\";\n\n/** Object store for serving files from a local directory */\nexport class FileSystemStore extends PFrameInternal.BaseObjectStore {\n private readonly rootDir: string;\n\n private constructor(options: PFrameInternal.FsStoreOptions) {\n super(options);\n\n this.rootDir = options.rootDir;\n }\n\n static async init(options: PFrameInternal.FsStoreOptions): Promise<FileSystemStore> {\n const resolvedRootDir = resolve(options.rootDir);\n\n const rootStats = await stat(resolvedRootDir).catch(() => {\n throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);\n });\n if (!rootStats.isDirectory()) {\n throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);\n }\n\n return new FileSystemStore({\n ...options,\n rootDir: resolvedRootDir,\n });\n }\n\n override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n let file: FileHandle | undefined;\n const respond = async (response: PFrameInternal.ObjectStoreResponse) => {\n try {\n await params.callback(response).finally(async () => await file?.close());\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `File system store received unexpected rejection from callback: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n try {\n const path = join(this.rootDir, filename);\n file = await open(path, \"r\");\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to open file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"NotFound\" });\n }\n params.signal.throwIfAborted();\n\n let size: number;\n try {\n ({ size } = await file.stat());\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to get size of file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const range = this.translate(size, params.range);\n if (!range) {\n return await respond({ type: \"RangeNotSatisfiable\", size });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({ type: \"Ok\", size, range });\n }\n\n let data: Readable;\n try {\n data = file.createReadStream({\n start: range.start,\n end: range.end,\n autoClose: false,\n });\n this.logger(\n \"info\",\n `File system store created read stream for ${filename}[${range.start}..=${range.end}]`,\n );\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n\n return await respond({ type: \"Ok\", size, range, data });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n this.logger(\"warn\", `File system store unhandled error: ${ensureError(error)}`);\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,kBAAb,MAAa,wBAAwBA,sCAAAA,eAAe,gBAAgB;CAClE;CAEA,YAAoB,SAAwC;AAC1D,QAAM,QAAQ;AAEd,OAAK,UAAU,QAAQ;;CAGzB,aAAa,KAAK,SAAkE;EAClF,MAAM,mBAAA,GAAA,UAAA,SAA0B,QAAQ,QAAQ;AAKhD,MAAI,EAHc,OAAA,GAAA,iBAAA,MAAW,gBAAgB,CAAC,YAAY;AACxD,SAAM,IAAI,MAAM,oDAAoD,kBAAkB;IACtF,EACa,aAAa,CAC1B,OAAM,IAAI,MAAM,mDAAmD,kBAAkB;AAGvF,SAAO,IAAI,gBAAgB;GACzB,GAAG;GACH,SAAS;GACV,CAAC;;CAGJ,MAAe,QACb,UACA,QAMe;EACf,IAAI;EACJ,MAAM,UAAU,OAAO,aAAiD;AACtE,OAAI;AACF,UAAM,OAAO,SAAS,SAAS,CAAC,QAAQ,YAAY,MAAM,MAAM,OAAO,CAAC;YACjE,OAAgB;AACvB,SAAK,OACH,QACA,mEAAA,GAAA,gCAAA,aAA8E,MAAM,GACrF;;;AAIL,MAAI;AACF,OAAI;AAEF,WAAO,OAAA,GAAA,iBAAA,OAAA,GAAA,UAAA,MADW,KAAK,SAAS,SAAS,EACjB,IAAI;YACrB,OAAgB;AACvB,SAAK,OACH,SACA,yCAAyC,SAAS,KAAA,GAAA,gCAAA,aAAgB,MAAM,GACzE;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,YAAY,CAAC;;AAE5C,UAAO,OAAO,gBAAgB;GAE9B,IAAI;AACJ,OAAI;AACF,KAAC,CAAE,QAAS,MAAM,KAAK,MAAM;YACtB,OAAgB;AACvB,SAAK,OACH,SACA,gDAAgD,SAAS,KAAA,GAAA,gCAAA,aAAgB,MAAM,GAChF;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC;;AAEjD,UAAO,OAAO,gBAAgB;GAE9B,MAAM,QAAQ,KAAK,UAAU,MAAM,OAAO,MAAM;AAChD,OAAI,CAAC,MACH,QAAO,MAAM,QAAQ;IAAE,MAAM;IAAuB;IAAM,CAAC;AAG7D,OAAI,OAAO,WAAW,OACpB,QAAO,MAAM,QAAQ;IAAE,MAAM;IAAM;IAAM;IAAO,CAAC;GAGnD,IAAI;AACJ,OAAI;AACF,WAAO,KAAK,iBAAiB;KAC3B,OAAO,MAAM;KACb,KAAK,MAAM;KACX,WAAW;KACZ,CAAC;AACF,SAAK,OACH,QACA,6CAA6C,SAAS,GAAG,MAAM,MAAM,KAAK,MAAM,IAAI,GACrF;YACM,OAAgB;AACvB,SAAK,OACH,SACA,sDAAsD,SAAS,GAAG,MAAM,MAAM,KAAK,MAAM,IAAI,MAAA,GAAA,gCAAA,aAAiB,MAAM,GACrH;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC;;AAGjD,UAAO,MAAM,QAAQ;IAAE,MAAM;IAAM;IAAM;IAAO;IAAM,CAAC;WAChD,OAAgB;AACvB,OAAI,EAAA,GAAA,gCAAA,cAAc,MAAM,CACtB,MAAK,OAAO,QAAQ,uCAAA,GAAA,gCAAA,aAAkD,MAAM,GAAG;AAEjF,UAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,14 +1,18 @@
1
1
  import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
2
+
3
+ //#region src/fs-store.d.ts
2
4
  /** Object store for serving files from a local directory */
3
- export declare class FileSystemStore extends PFrameInternal.BaseObjectStore {
4
- private readonly rootDir;
5
- private constructor();
6
- static init(options: PFrameInternal.FsStoreOptions): Promise<FileSystemStore>;
7
- request(filename: PFrameInternal.ParquetFileName, params: {
8
- method: PFrameInternal.HttpMethod;
9
- range?: PFrameInternal.HttpRange;
10
- signal: AbortSignal;
11
- callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;
12
- }): Promise<void>;
5
+ declare class FileSystemStore extends PFrameInternal.BaseObjectStore {
6
+ private readonly rootDir;
7
+ private constructor();
8
+ static init(options: PFrameInternal.FsStoreOptions): Promise<FileSystemStore>;
9
+ request(filename: PFrameInternal.ParquetFileName, params: {
10
+ method: PFrameInternal.HttpMethod;
11
+ range?: PFrameInternal.HttpRange;
12
+ signal: AbortSignal;
13
+ callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;
14
+ }): Promise<void>;
13
15
  }
16
+ //#endregion
17
+ export { FileSystemStore };
14
18
  //# sourceMappingURL=fs-store.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-store.d.ts","sourceRoot":"","sources":["../src/fs-store.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAGvE,4DAA4D;AAC5D,qBAAa,eAAgB,SAAQ,cAAc,CAAC,eAAe;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO;WAMM,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;IAgBpE,OAAO,CACpB,QAAQ,EAAE,cAAc,CAAC,eAAe,EACxC,MAAM,EAAE;QACN,MAAM,EAAE,cAAc,CAAC,UAAU,CAAC;QAClC,KAAK,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC;QACjC,MAAM,EAAE,WAAW,CAAC;QACpB,QAAQ,EAAE,CAAC,QAAQ,EAAE,cAAc,CAAC,mBAAmB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;KAC3E,GACA,OAAO,CAAC,IAAI,CAAC;CA0EjB"}
1
+ {"version":3,"file":"fs-store.d.ts","names":[],"sources":["../src/fs-store.ts"],"mappings":";;;;cAOa,eAAA,SAAwB,cAAA,CAAe,eAAA;EAAA,iBACjC,OAAA;EAAA,QAEV,WAAA,CAAA;EAAA,OAMM,IAAA,CAAK,OAAA,EAAS,cAAA,CAAe,cAAA,GAAiB,OAAA,CAAQ,eAAA;EAgBpD,OAAA,CACb,QAAA,EAAU,cAAA,CAAe,eAAA,EACzB,MAAA;IACE,MAAA,EAAQ,cAAA,CAAe,UAAA;IACvB,KAAA,GAAQ,cAAA,CAAe,SAAA;IACvB,MAAA,EAAQ,WAAA;IACR,QAAA,GAAW,QAAA,EAAU,cAAA,CAAe,mBAAA,KAAwB,OAAA;EAAA,IAE7D,OAAA;AAAA"}
package/dist/fs-store.js CHANGED
@@ -1,87 +1,85 @@
1
- import { stat, open } from 'node:fs/promises';
2
- import { resolve, join } from 'node:path';
3
- import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
4
- import { ensureError, isAbortError } from '@milaboratories/pl-model-common';
5
-
1
+ import { ensureError, isAbortError } from "@milaboratories/pl-model-common";
2
+ import { open, stat } from "node:fs/promises";
3
+ import { join, resolve } from "node:path";
4
+ import { PFrameInternal } from "@milaboratories/pl-model-middle-layer";
5
+ //#region src/fs-store.ts
6
6
  /** Object store for serving files from a local directory */
7
- class FileSystemStore extends PFrameInternal.BaseObjectStore {
8
- rootDir;
9
- constructor(options) {
10
- super(options);
11
- this.rootDir = options.rootDir;
12
- }
13
- static async init(options) {
14
- const resolvedRootDir = resolve(options.rootDir);
15
- const rootStats = await stat(resolvedRootDir).catch(() => {
16
- throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);
17
- });
18
- if (!rootStats.isDirectory()) {
19
- throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);
20
- }
21
- return new FileSystemStore({
22
- ...options,
23
- rootDir: resolvedRootDir,
24
- });
25
- }
26
- async request(filename, params) {
27
- let file;
28
- const respond = async (response) => {
29
- try {
30
- await params.callback(response).finally(async () => await file?.close());
31
- }
32
- catch (error) {
33
- this.logger("warn", `File system store received unexpected rejection from callback: ${ensureError(error)}`);
34
- }
35
- };
36
- try {
37
- try {
38
- const path = join(this.rootDir, filename);
39
- file = await open(path, "r");
40
- }
41
- catch (error) {
42
- this.logger("error", `File system store failed to open file ${filename}: ${ensureError(error)}`);
43
- return await respond({ type: "NotFound" });
44
- }
45
- params.signal.throwIfAborted();
46
- let size;
47
- try {
48
- ({ size } = await file.stat());
49
- }
50
- catch (error) {
51
- this.logger("error", `File system store failed to get size of file ${filename}: ${ensureError(error)}`);
52
- return await respond({ type: "InternalError" });
53
- }
54
- params.signal.throwIfAborted();
55
- const range = this.translate(size, params.range);
56
- if (!range) {
57
- return await respond({ type: "RangeNotSatisfiable", size });
58
- }
59
- if (params.method === "HEAD") {
60
- return await respond({ type: "Ok", size, range });
61
- }
62
- let data;
63
- try {
64
- data = file.createReadStream({
65
- start: range.start,
66
- end: range.end,
67
- autoClose: false,
68
- });
69
- this.logger("info", `File system store created read stream for ${filename}[${range.start}..=${range.end}]`);
70
- }
71
- catch (error) {
72
- this.logger("error", `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`);
73
- return await respond({ type: "InternalError" });
74
- }
75
- return await respond({ type: "Ok", size, range, data });
76
- }
77
- catch (error) {
78
- if (!isAbortError(error)) {
79
- this.logger("warn", `File system store unhandled error: ${ensureError(error)}`);
80
- }
81
- return await respond({ type: "InternalError" });
82
- }
83
- }
84
- }
85
-
7
+ var FileSystemStore = class FileSystemStore extends PFrameInternal.BaseObjectStore {
8
+ rootDir;
9
+ constructor(options) {
10
+ super(options);
11
+ this.rootDir = options.rootDir;
12
+ }
13
+ static async init(options) {
14
+ const resolvedRootDir = resolve(options.rootDir);
15
+ if (!(await stat(resolvedRootDir).catch(() => {
16
+ throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);
17
+ })).isDirectory()) throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);
18
+ return new FileSystemStore({
19
+ ...options,
20
+ rootDir: resolvedRootDir
21
+ });
22
+ }
23
+ async request(filename, params) {
24
+ let file;
25
+ const respond = async (response) => {
26
+ try {
27
+ await params.callback(response).finally(async () => await file?.close());
28
+ } catch (error) {
29
+ this.logger("warn", `File system store received unexpected rejection from callback: ${ensureError(error)}`);
30
+ }
31
+ };
32
+ try {
33
+ try {
34
+ file = await open(join(this.rootDir, filename), "r");
35
+ } catch (error) {
36
+ this.logger("error", `File system store failed to open file ${filename}: ${ensureError(error)}`);
37
+ return await respond({ type: "NotFound" });
38
+ }
39
+ params.signal.throwIfAborted();
40
+ let size;
41
+ try {
42
+ ({size} = await file.stat());
43
+ } catch (error) {
44
+ this.logger("error", `File system store failed to get size of file ${filename}: ${ensureError(error)}`);
45
+ return await respond({ type: "InternalError" });
46
+ }
47
+ params.signal.throwIfAborted();
48
+ const range = this.translate(size, params.range);
49
+ if (!range) return await respond({
50
+ type: "RangeNotSatisfiable",
51
+ size
52
+ });
53
+ if (params.method === "HEAD") return await respond({
54
+ type: "Ok",
55
+ size,
56
+ range
57
+ });
58
+ let data;
59
+ try {
60
+ data = file.createReadStream({
61
+ start: range.start,
62
+ end: range.end,
63
+ autoClose: false
64
+ });
65
+ this.logger("info", `File system store created read stream for ${filename}[${range.start}..=${range.end}]`);
66
+ } catch (error) {
67
+ this.logger("error", `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`);
68
+ return await respond({ type: "InternalError" });
69
+ }
70
+ return await respond({
71
+ type: "Ok",
72
+ size,
73
+ range,
74
+ data
75
+ });
76
+ } catch (error) {
77
+ if (!isAbortError(error)) this.logger("warn", `File system store unhandled error: ${ensureError(error)}`);
78
+ return await respond({ type: "InternalError" });
79
+ }
80
+ }
81
+ };
82
+ //#endregion
86
83
  export { FileSystemStore };
87
- //# sourceMappingURL=fs-store.js.map
84
+
85
+ //# sourceMappingURL=fs-store.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fs-store.js","sources":["../src/fs-store.ts"],"sourcesContent":["import type { Readable } from \"node:stream\";\nimport { stat, open, type FileHandle } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { ensureError, isAbortError } from \"@milaboratories/pl-model-common\";\n\n/** Object store for serving files from a local directory */\nexport class FileSystemStore extends PFrameInternal.BaseObjectStore {\n private readonly rootDir: string;\n\n private constructor(options: PFrameInternal.FsStoreOptions) {\n super(options);\n\n this.rootDir = options.rootDir;\n }\n\n static async init(options: PFrameInternal.FsStoreOptions): Promise<FileSystemStore> {\n const resolvedRootDir = resolve(options.rootDir);\n\n const rootStats = await stat(resolvedRootDir).catch(() => {\n throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);\n });\n if (!rootStats.isDirectory()) {\n throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);\n }\n\n return new FileSystemStore({\n ...options,\n rootDir: resolvedRootDir,\n });\n }\n\n override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n let file: FileHandle | undefined;\n const respond = async (response: PFrameInternal.ObjectStoreResponse) => {\n try {\n await params.callback(response).finally(async () => await file?.close());\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `File system store received unexpected rejection from callback: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n try {\n const path = join(this.rootDir, filename);\n file = await open(path, \"r\");\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to open file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"NotFound\" });\n }\n params.signal.throwIfAborted();\n\n let size: number;\n try {\n ({ size } = await file.stat());\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to get size of file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const range = this.translate(size, params.range);\n if (!range) {\n return await respond({ type: \"RangeNotSatisfiable\", size });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({ type: \"Ok\", size, range });\n }\n\n let data: Readable;\n try {\n data = file.createReadStream({\n start: range.start,\n end: range.end,\n autoClose: false,\n });\n this.logger(\n \"info\",\n `File system store created read stream for ${filename}[${range.start}..=${range.end}]`,\n );\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n\n return await respond({ type: \"Ok\", size, range, data });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n this.logger(\"warn\", `File system store unhandled error: ${ensureError(error)}`);\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fs-store.js","names":[],"sources":["../src/fs-store.ts"],"sourcesContent":["import type { Readable } from \"node:stream\";\nimport { stat, open, type FileHandle } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { PFrameInternal } from \"@milaboratories/pl-model-middle-layer\";\nimport { ensureError, isAbortError } from \"@milaboratories/pl-model-common\";\n\n/** Object store for serving files from a local directory */\nexport class FileSystemStore extends PFrameInternal.BaseObjectStore {\n private readonly rootDir: string;\n\n private constructor(options: PFrameInternal.FsStoreOptions) {\n super(options);\n\n this.rootDir = options.rootDir;\n }\n\n static async init(options: PFrameInternal.FsStoreOptions): Promise<FileSystemStore> {\n const resolvedRootDir = resolve(options.rootDir);\n\n const rootStats = await stat(resolvedRootDir).catch(() => {\n throw new Error(`File system store root directory does not exist: ${resolvedRootDir}`);\n });\n if (!rootStats.isDirectory()) {\n throw new Error(`File system store root path is not a directory: ${resolvedRootDir}`);\n }\n\n return new FileSystemStore({\n ...options,\n rootDir: resolvedRootDir,\n });\n }\n\n override async request(\n filename: PFrameInternal.ParquetFileName,\n params: {\n method: PFrameInternal.HttpMethod;\n range?: PFrameInternal.HttpRange;\n signal: AbortSignal;\n callback: (response: PFrameInternal.ObjectStoreResponse) => Promise<void>;\n },\n ): Promise<void> {\n let file: FileHandle | undefined;\n const respond = async (response: PFrameInternal.ObjectStoreResponse) => {\n try {\n await params.callback(response).finally(async () => await file?.close());\n } catch (error: unknown) {\n this.logger(\n \"warn\",\n `File system store received unexpected rejection from callback: ${ensureError(error)}`,\n );\n }\n };\n\n try {\n try {\n const path = join(this.rootDir, filename);\n file = await open(path, \"r\");\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to open file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"NotFound\" });\n }\n params.signal.throwIfAborted();\n\n let size: number;\n try {\n ({ size } = await file.stat());\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to get size of file ${filename}: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n params.signal.throwIfAborted();\n\n const range = this.translate(size, params.range);\n if (!range) {\n return await respond({ type: \"RangeNotSatisfiable\", size });\n }\n\n if (params.method === \"HEAD\") {\n return await respond({ type: \"Ok\", size, range });\n }\n\n let data: Readable;\n try {\n data = file.createReadStream({\n start: range.start,\n end: range.end,\n autoClose: false,\n });\n this.logger(\n \"info\",\n `File system store created read stream for ${filename}[${range.start}..=${range.end}]`,\n );\n } catch (error: unknown) {\n this.logger(\n \"error\",\n `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`,\n );\n return await respond({ type: \"InternalError\" });\n }\n\n return await respond({ type: \"Ok\", size, range, data });\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n this.logger(\"warn\", `File system store unhandled error: ${ensureError(error)}`);\n }\n return await respond({ type: \"InternalError\" });\n }\n }\n}\n"],"mappings":";;;;;;AAOA,IAAa,kBAAb,MAAa,wBAAwB,eAAe,gBAAgB;CAClE;CAEA,YAAoB,SAAwC;AAC1D,QAAM,QAAQ;AAEd,OAAK,UAAU,QAAQ;;CAGzB,aAAa,KAAK,SAAkE;EAClF,MAAM,kBAAkB,QAAQ,QAAQ,QAAQ;AAKhD,MAAI,EAHc,MAAM,KAAK,gBAAgB,CAAC,YAAY;AACxD,SAAM,IAAI,MAAM,oDAAoD,kBAAkB;IACtF,EACa,aAAa,CAC1B,OAAM,IAAI,MAAM,mDAAmD,kBAAkB;AAGvF,SAAO,IAAI,gBAAgB;GACzB,GAAG;GACH,SAAS;GACV,CAAC;;CAGJ,MAAe,QACb,UACA,QAMe;EACf,IAAI;EACJ,MAAM,UAAU,OAAO,aAAiD;AACtE,OAAI;AACF,UAAM,OAAO,SAAS,SAAS,CAAC,QAAQ,YAAY,MAAM,MAAM,OAAO,CAAC;YACjE,OAAgB;AACvB,SAAK,OACH,QACA,kEAAkE,YAAY,MAAM,GACrF;;;AAIL,MAAI;AACF,OAAI;AAEF,WAAO,MAAM,KADA,KAAK,KAAK,SAAS,SAAS,EACjB,IAAI;YACrB,OAAgB;AACvB,SAAK,OACH,SACA,yCAAyC,SAAS,IAAI,YAAY,MAAM,GACzE;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,YAAY,CAAC;;AAE5C,UAAO,OAAO,gBAAgB;GAE9B,IAAI;AACJ,OAAI;AACF,KAAC,CAAE,QAAS,MAAM,KAAK,MAAM;YACtB,OAAgB;AACvB,SAAK,OACH,SACA,gDAAgD,SAAS,IAAI,YAAY,MAAM,GAChF;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC;;AAEjD,UAAO,OAAO,gBAAgB;GAE9B,MAAM,QAAQ,KAAK,UAAU,MAAM,OAAO,MAAM;AAChD,OAAI,CAAC,MACH,QAAO,MAAM,QAAQ;IAAE,MAAM;IAAuB;IAAM,CAAC;AAG7D,OAAI,OAAO,WAAW,OACpB,QAAO,MAAM,QAAQ;IAAE,MAAM;IAAM;IAAM;IAAO,CAAC;GAGnD,IAAI;AACJ,OAAI;AACF,WAAO,KAAK,iBAAiB;KAC3B,OAAO,MAAM;KACb,KAAK,MAAM;KACX,WAAW;KACZ,CAAC;AACF,SAAK,OACH,QACA,6CAA6C,SAAS,GAAG,MAAM,MAAM,KAAK,MAAM,IAAI,GACrF;YACM,OAAgB;AACvB,SAAK,OACH,SACA,sDAAsD,SAAS,GAAG,MAAM,MAAM,KAAK,MAAM,IAAI,KAAK,YAAY,MAAM,GACrH;AACD,WAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC;;AAGjD,UAAO,MAAM,QAAQ;IAAE,MAAM;IAAM;IAAM;IAAO;IAAM,CAAC;WAChD,OAAgB;AACvB,OAAI,CAAC,aAAa,MAAM,CACtB,MAAK,OAAO,QAAQ,sCAAsC,YAAY,MAAM,GAAG;AAEjF,UAAO,MAAM,QAAQ,EAAE,MAAM,iBAAiB,CAAC"}