@milaboratories/pframes-rs-serv 1.0.69 → 1.0.70
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fs-store.cjs +13 -19
- package/dist/fs-store.cjs.map +1 -1
- package/dist/fs-store.d.ts.map +1 -1
- package/dist/fs-store.js +13 -19
- package/dist/fs-store.js.map +1 -1
- package/package.json +1 -1
- package/src/fs-store.ts +17 -21
package/dist/fs-store.cjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var node_fs = require('node:fs');
|
|
4
3
|
var promises = require('node:fs/promises');
|
|
5
4
|
var node_path = require('node:path');
|
|
6
5
|
var plModelMiddleLayer = require('@milaboratories/pl-model-middle-layer');
|
|
@@ -28,6 +27,9 @@ class FileSystemStore extends plModelMiddleLayer.PFrameInternal.ObjectStore {
|
|
|
28
27
|
}
|
|
29
28
|
async request(filename, params) {
|
|
30
29
|
let file;
|
|
30
|
+
const respond = async (response) => {
|
|
31
|
+
await params.callback(response).finally(async () => await file?.close());
|
|
32
|
+
};
|
|
31
33
|
try {
|
|
32
34
|
try {
|
|
33
35
|
const path = node_path.join(this.rootDir, filename);
|
|
@@ -35,7 +37,7 @@ class FileSystemStore extends plModelMiddleLayer.PFrameInternal.ObjectStore {
|
|
|
35
37
|
}
|
|
36
38
|
catch (error) {
|
|
37
39
|
this.logger('error', `File system store failed to open file ${filename}: ${plModelCommon.ensureError(error)}`);
|
|
38
|
-
return await
|
|
40
|
+
return await respond({ type: 'NotFound' });
|
|
39
41
|
}
|
|
40
42
|
params.signal.throwIfAborted();
|
|
41
43
|
let size;
|
|
@@ -44,49 +46,41 @@ class FileSystemStore extends plModelMiddleLayer.PFrameInternal.ObjectStore {
|
|
|
44
46
|
}
|
|
45
47
|
catch (error) {
|
|
46
48
|
this.logger('error', `File system store failed to get size of file ${filename}: ${plModelCommon.ensureError(error)}`);
|
|
47
|
-
return await
|
|
49
|
+
return await respond({ type: 'InternalError' });
|
|
48
50
|
}
|
|
49
51
|
params.signal.throwIfAborted();
|
|
50
52
|
const range = this.translate(size, params.range);
|
|
51
53
|
if (!range) {
|
|
52
|
-
return await
|
|
54
|
+
return await respond({ type: 'RangeNotSatisfiable', size });
|
|
53
55
|
}
|
|
54
56
|
if (params.method === 'HEAD') {
|
|
55
|
-
return await
|
|
57
|
+
return await respond({ type: 'Ok', size, range });
|
|
56
58
|
}
|
|
57
59
|
let data;
|
|
58
60
|
try {
|
|
59
|
-
data =
|
|
60
|
-
fd: file.fd,
|
|
61
|
+
data = file.createReadStream({
|
|
61
62
|
start: range.start,
|
|
62
63
|
end: range.end,
|
|
63
|
-
|
|
64
|
+
autoClose: false
|
|
64
65
|
});
|
|
65
66
|
this.logger('info', `File system store created read stream for ${filename}[${range.start}..=${range.end}]`);
|
|
66
67
|
}
|
|
67
68
|
catch (error) {
|
|
68
69
|
this.logger('error', `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${plModelCommon.ensureError(error)}`);
|
|
69
|
-
return await
|
|
70
|
+
return await respond({ type: 'InternalError' });
|
|
70
71
|
}
|
|
71
72
|
try {
|
|
72
|
-
return await
|
|
73
|
+
return await respond({ type: 'Ok', size, range, data });
|
|
73
74
|
}
|
|
74
75
|
catch (error) {
|
|
75
|
-
|
|
76
|
-
this.logger('error', `File system store received unexpected rejection from callback: ${plModelCommon.ensureError(error)}`);
|
|
77
|
-
}
|
|
76
|
+
this.logger('error', `File system store received unexpected rejection from callback: ${plModelCommon.ensureError(error)}`);
|
|
78
77
|
}
|
|
79
78
|
}
|
|
80
79
|
catch (error) {
|
|
81
80
|
if (!plModelCommon.isAbortError(error)) {
|
|
82
81
|
this.logger('error', `File system store unhandled error: ${plModelCommon.ensureError(error)}`);
|
|
83
82
|
}
|
|
84
|
-
return await
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
await file?.close().catch(() => {
|
|
88
|
-
// already closed
|
|
89
|
-
});
|
|
83
|
+
return await respond({ type: 'InternalError' });
|
|
90
84
|
}
|
|
91
85
|
}
|
|
92
86
|
}
|
package/dist/fs-store.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-store.cjs","sources":["../src/fs-store.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport {
|
|
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.ObjectStore {\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(\n options: PFrameInternal.FsStoreOptions\n ): Promise<FileSystemStore> {\n const resolvedRootDir = resolve(options.rootDir);\n\n const rootStats = await stat(resolvedRootDir).catch(() => {\n throw new Error(\n `File system store root directory does not exist: ${resolvedRootDir}`\n );\n });\n if (!rootStats.isDirectory()) {\n throw new Error(\n `File system store root path is not a directory: ${resolvedRootDir}`\n );\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 await params.callback(response).finally(async () => await file?.close());\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 try {\n return await respond({ type: 'Ok', size, range, data });\n } catch (error: unknown) {\n this.logger(\n 'error',\n `File system store received unexpected rejection from callback: ${ensureError(error)}`\n );\n }\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n this.logger(\n 'error',\n `File system store unhandled error: ${ensureError(error)}`\n );\n }\n return await respond({ type: 'InternalError' });\n }\n }\n}\n"],"names":["PFrameInternal","resolve","stat","join","open","ensureError","isAbortError"],"mappings":"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"}
|
package/dist/fs-store.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-store.d.ts","sourceRoot":"","sources":["../src/fs-store.ts"],"names":[],"mappings":"
|
|
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,WAAW;IAC7D,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IAEjC,OAAO;WAMM,IAAI,CACf,OAAO,EAAE,cAAc,CAAC,cAAc,GACrC,OAAO,CAAC,eAAe,CAAC;IAoBZ,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;CA6EjB"}
|
package/dist/fs-store.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createReadStream } from 'node:fs';
|
|
2
1
|
import { stat, open } from 'node:fs/promises';
|
|
3
2
|
import { resolve, join } from 'node:path';
|
|
4
3
|
import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
|
|
@@ -26,6 +25,9 @@ class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
26
25
|
}
|
|
27
26
|
async request(filename, params) {
|
|
28
27
|
let file;
|
|
28
|
+
const respond = async (response) => {
|
|
29
|
+
await params.callback(response).finally(async () => await file?.close());
|
|
30
|
+
};
|
|
29
31
|
try {
|
|
30
32
|
try {
|
|
31
33
|
const path = join(this.rootDir, filename);
|
|
@@ -33,7 +35,7 @@ class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
33
35
|
}
|
|
34
36
|
catch (error) {
|
|
35
37
|
this.logger('error', `File system store failed to open file ${filename}: ${ensureError(error)}`);
|
|
36
|
-
return await
|
|
38
|
+
return await respond({ type: 'NotFound' });
|
|
37
39
|
}
|
|
38
40
|
params.signal.throwIfAborted();
|
|
39
41
|
let size;
|
|
@@ -42,49 +44,41 @@ class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
42
44
|
}
|
|
43
45
|
catch (error) {
|
|
44
46
|
this.logger('error', `File system store failed to get size of file ${filename}: ${ensureError(error)}`);
|
|
45
|
-
return await
|
|
47
|
+
return await respond({ type: 'InternalError' });
|
|
46
48
|
}
|
|
47
49
|
params.signal.throwIfAborted();
|
|
48
50
|
const range = this.translate(size, params.range);
|
|
49
51
|
if (!range) {
|
|
50
|
-
return await
|
|
52
|
+
return await respond({ type: 'RangeNotSatisfiable', size });
|
|
51
53
|
}
|
|
52
54
|
if (params.method === 'HEAD') {
|
|
53
|
-
return await
|
|
55
|
+
return await respond({ type: 'Ok', size, range });
|
|
54
56
|
}
|
|
55
57
|
let data;
|
|
56
58
|
try {
|
|
57
|
-
data = createReadStream(
|
|
58
|
-
fd: file.fd,
|
|
59
|
+
data = file.createReadStream({
|
|
59
60
|
start: range.start,
|
|
60
61
|
end: range.end,
|
|
61
|
-
|
|
62
|
+
autoClose: false
|
|
62
63
|
});
|
|
63
64
|
this.logger('info', `File system store created read stream for ${filename}[${range.start}..=${range.end}]`);
|
|
64
65
|
}
|
|
65
66
|
catch (error) {
|
|
66
67
|
this.logger('error', `File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`);
|
|
67
|
-
return await
|
|
68
|
+
return await respond({ type: 'InternalError' });
|
|
68
69
|
}
|
|
69
70
|
try {
|
|
70
|
-
return await
|
|
71
|
+
return await respond({ type: 'Ok', size, range, data });
|
|
71
72
|
}
|
|
72
73
|
catch (error) {
|
|
73
|
-
|
|
74
|
-
this.logger('error', `File system store received unexpected rejection from callback: ${ensureError(error)}`);
|
|
75
|
-
}
|
|
74
|
+
this.logger('error', `File system store received unexpected rejection from callback: ${ensureError(error)}`);
|
|
76
75
|
}
|
|
77
76
|
}
|
|
78
77
|
catch (error) {
|
|
79
78
|
if (!isAbortError(error)) {
|
|
80
79
|
this.logger('error', `File system store unhandled error: ${ensureError(error)}`);
|
|
81
80
|
}
|
|
82
|
-
return await
|
|
83
|
-
}
|
|
84
|
-
finally {
|
|
85
|
-
await file?.close().catch(() => {
|
|
86
|
-
// already closed
|
|
87
|
-
});
|
|
81
|
+
return await respond({ type: 'InternalError' });
|
|
88
82
|
}
|
|
89
83
|
}
|
|
90
84
|
}
|
package/dist/fs-store.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs-store.js","sources":["../src/fs-store.ts"],"sourcesContent":["import type { Readable } from 'node:stream';\nimport {
|
|
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.ObjectStore {\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(\n options: PFrameInternal.FsStoreOptions\n ): Promise<FileSystemStore> {\n const resolvedRootDir = resolve(options.rootDir);\n\n const rootStats = await stat(resolvedRootDir).catch(() => {\n throw new Error(\n `File system store root directory does not exist: ${resolvedRootDir}`\n );\n });\n if (!rootStats.isDirectory()) {\n throw new Error(\n `File system store root path is not a directory: ${resolvedRootDir}`\n );\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 await params.callback(response).finally(async () => await file?.close());\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 try {\n return await respond({ type: 'Ok', size, range, data });\n } catch (error: unknown) {\n this.logger(\n 'error',\n `File system store received unexpected rejection from callback: ${ensureError(error)}`\n );\n }\n } catch (error: unknown) {\n if (!isAbortError(error)) {\n this.logger(\n 'error',\n `File system store unhandled error: ${ensureError(error)}`\n );\n }\n return await respond({ type: 'InternalError' });\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/fs-store.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { Readable } from 'node:stream';
|
|
2
|
-
import { createReadStream } from 'node:fs';
|
|
3
2
|
import { stat, open, type FileHandle } from 'node:fs/promises';
|
|
4
3
|
import { join, resolve } from 'node:path';
|
|
5
4
|
import { PFrameInternal } from '@milaboratories/pl-model-middle-layer';
|
|
@@ -47,6 +46,10 @@ export class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
47
46
|
}
|
|
48
47
|
): Promise<void> {
|
|
49
48
|
let file: FileHandle | undefined;
|
|
49
|
+
const respond = async (response: PFrameInternal.ObjectStoreResponse) => {
|
|
50
|
+
await params.callback(response).finally(async () => await file?.close());
|
|
51
|
+
};
|
|
52
|
+
|
|
50
53
|
try {
|
|
51
54
|
try {
|
|
52
55
|
const path = join(this.rootDir, filename);
|
|
@@ -56,7 +59,7 @@ export class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
56
59
|
'error',
|
|
57
60
|
`File system store failed to open file ${filename}: ${ensureError(error)}`
|
|
58
61
|
);
|
|
59
|
-
return await
|
|
62
|
+
return await respond({ type: 'NotFound' });
|
|
60
63
|
}
|
|
61
64
|
params.signal.throwIfAborted();
|
|
62
65
|
|
|
@@ -68,26 +71,25 @@ export class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
68
71
|
'error',
|
|
69
72
|
`File system store failed to get size of file ${filename}: ${ensureError(error)}`
|
|
70
73
|
);
|
|
71
|
-
return await
|
|
74
|
+
return await respond({ type: 'InternalError' });
|
|
72
75
|
}
|
|
73
76
|
params.signal.throwIfAborted();
|
|
74
77
|
|
|
75
78
|
const range = this.translate(size, params.range);
|
|
76
79
|
if (!range) {
|
|
77
|
-
return await
|
|
80
|
+
return await respond({ type: 'RangeNotSatisfiable', size });
|
|
78
81
|
}
|
|
79
82
|
|
|
80
83
|
if (params.method === 'HEAD') {
|
|
81
|
-
return await
|
|
84
|
+
return await respond({ type: 'Ok', size, range });
|
|
82
85
|
}
|
|
83
86
|
|
|
84
87
|
let data: Readable;
|
|
85
88
|
try {
|
|
86
|
-
data = createReadStream(
|
|
87
|
-
fd: file.fd,
|
|
89
|
+
data = file.createReadStream({
|
|
88
90
|
start: range.start,
|
|
89
91
|
end: range.end,
|
|
90
|
-
|
|
92
|
+
autoClose: false
|
|
91
93
|
});
|
|
92
94
|
this.logger(
|
|
93
95
|
'info',
|
|
@@ -98,18 +100,16 @@ export class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
98
100
|
'error',
|
|
99
101
|
`File system store failed to create read stream for ${filename}[${range.start}..=${range.end}]: ${ensureError(error)}`
|
|
100
102
|
);
|
|
101
|
-
return await
|
|
103
|
+
return await respond({ type: 'InternalError' });
|
|
102
104
|
}
|
|
103
105
|
|
|
104
106
|
try {
|
|
105
|
-
return await
|
|
107
|
+
return await respond({ type: 'Ok', size, range, data });
|
|
106
108
|
} catch (error: unknown) {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
);
|
|
112
|
-
}
|
|
109
|
+
this.logger(
|
|
110
|
+
'error',
|
|
111
|
+
`File system store received unexpected rejection from callback: ${ensureError(error)}`
|
|
112
|
+
);
|
|
113
113
|
}
|
|
114
114
|
} catch (error: unknown) {
|
|
115
115
|
if (!isAbortError(error)) {
|
|
@@ -118,11 +118,7 @@ export class FileSystemStore extends PFrameInternal.ObjectStore {
|
|
|
118
118
|
`File system store unhandled error: ${ensureError(error)}`
|
|
119
119
|
);
|
|
120
120
|
}
|
|
121
|
-
return await
|
|
122
|
-
} finally {
|
|
123
|
-
await file?.close().catch(() => {
|
|
124
|
-
// already closed
|
|
125
|
-
});
|
|
121
|
+
return await respond({ type: 'InternalError' });
|
|
126
122
|
}
|
|
127
123
|
}
|
|
128
124
|
}
|