@haverstack/blob-adapter-disk 0.35.0 → 0.37.0
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/index.d.ts +10 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -9
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -11,13 +11,17 @@
|
|
|
11
11
|
* torn blob at its final, hash-named path.
|
|
12
12
|
*/
|
|
13
13
|
import type { FileId } from '@haverstack/core';
|
|
14
|
-
import type { StackBlobAdapter,
|
|
14
|
+
import type { StackBlobAdapter, BlobInfo } from '@haverstack/core/adapter';
|
|
15
|
+
export type DiskBlobAdapterOptions = {
|
|
16
|
+
/** Directory to store blobs in. Created if it doesn't exist. */
|
|
17
|
+
dir: string;
|
|
18
|
+
};
|
|
15
19
|
export declare class DiskBlobAdapter implements StackBlobAdapter {
|
|
16
20
|
private readonly dir;
|
|
17
|
-
constructor(
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
constructor(options: DiskBlobAdapterOptions);
|
|
22
|
+
putBlob(data: Uint8Array): Promise<FileId>;
|
|
23
|
+
getBlob(fileId: FileId): Promise<Uint8Array>;
|
|
24
|
+
deleteBlob(fileId: FileId): Promise<void>;
|
|
25
|
+
listBlobs(): Promise<BlobInfo[]>;
|
|
22
26
|
}
|
|
23
27
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAOH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAU3E,MAAM,MAAM,sBAAsB,GAAG;IACnC,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAEjB,OAAO,EAAE,sBAAsB;IAKrC,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAgB1C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAO5C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzC,SAAS,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;CAUvC"}
|
package/dist/index.js
CHANGED
|
@@ -14,20 +14,20 @@ import { createHash, randomBytes } from 'node:crypto';
|
|
|
14
14
|
import { mkdirSync, existsSync } from 'fs';
|
|
15
15
|
import { readFile, writeFile, unlink, readdir, stat, rename } from 'fs/promises';
|
|
16
16
|
import { join } from 'path';
|
|
17
|
-
import { StackNotFoundError,
|
|
17
|
+
import { StackNotFoundError, StackBadRequestError } from '@haverstack/core';
|
|
18
18
|
const SHA256_HEX_RE = /^[0-9a-f]{64}$/;
|
|
19
19
|
const assertFileId = (fileId) => {
|
|
20
20
|
if (!SHA256_HEX_RE.test(fileId)) {
|
|
21
|
-
throw new
|
|
21
|
+
throw new StackBadRequestError(`Invalid fileId: expected 64-character lowercase hex string`);
|
|
22
22
|
}
|
|
23
23
|
};
|
|
24
24
|
export class DiskBlobAdapter {
|
|
25
25
|
dir;
|
|
26
|
-
constructor(
|
|
27
|
-
this.dir = dir;
|
|
28
|
-
mkdirSync(dir, { recursive: true });
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.dir = options.dir;
|
|
28
|
+
mkdirSync(this.dir, { recursive: true });
|
|
29
29
|
}
|
|
30
|
-
async
|
|
30
|
+
async putBlob(data) {
|
|
31
31
|
const fileId = createHash('sha256').update(data).digest('hex');
|
|
32
32
|
const finalPath = join(this.dir, fileId);
|
|
33
33
|
if (!existsSync(finalPath)) {
|
|
@@ -43,13 +43,13 @@ export class DiskBlobAdapter {
|
|
|
43
43
|
}
|
|
44
44
|
return fileId;
|
|
45
45
|
}
|
|
46
|
-
async
|
|
46
|
+
async getBlob(fileId) {
|
|
47
47
|
assertFileId(fileId);
|
|
48
48
|
if (!existsSync(join(this.dir, fileId)))
|
|
49
49
|
throw new StackNotFoundError(`Attachment not found: "${fileId}"`);
|
|
50
50
|
return readFile(join(this.dir, fileId));
|
|
51
51
|
}
|
|
52
|
-
async
|
|
52
|
+
async deleteBlob(fileId) {
|
|
53
53
|
assertFileId(fileId);
|
|
54
54
|
try {
|
|
55
55
|
await unlink(join(this.dir, fileId));
|
|
@@ -58,7 +58,7 @@ export class DiskBlobAdapter {
|
|
|
58
58
|
// Non-fatal — file may already be gone.
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
|
-
async
|
|
61
|
+
async listBlobs() {
|
|
62
62
|
const entries = await readdir(this.dir);
|
|
63
63
|
const fileIds = entries.filter((name) => SHA256_HEX_RE.test(name));
|
|
64
64
|
return Promise.all(fileIds.map(async (fileId) => {
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAI5E,MAAM,aAAa,GAAG,gBAAgB,CAAC;AAEvC,MAAM,YAAY,GAAG,CAAC,MAAc,EAAQ,EAAE;IAC5C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,MAAM,IAAI,oBAAoB,CAAC,4DAA4D,CAAC,CAAC;IAC/F,CAAC;AACH,CAAC,CAAC;AAOF,MAAM,OAAO,eAAe;IACT,GAAG,CAAS;IAE7B,YAAY,OAA+B;QACzC,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;QACvB,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAgB;QAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,MAAM,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpF,IAAI,CAAC;gBACH,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,MAAM,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACpC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;gBACvC,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAc;QAC1B,YAAY,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACrC,MAAM,IAAI,kBAAkB,CAAC,0BAA0B,MAAM,GAAG,CAAC,CAAC;QACpE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,MAAc;QAC7B,YAAY,CAAC,MAAM,CAAC,CAAC;QACrB,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,CAAC;QAAC,MAAM,CAAC;YACP,wCAAwC;QAC1C,CAAC;IACH,CAAC;IAED,KAAK,CAAC,SAAS;QACb,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;YACjD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC;QAC/D,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haverstack/blob-adapter-disk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.37.0",
|
|
4
4
|
"description": "Disk blob adapter for Haverstack",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -29,10 +29,10 @@
|
|
|
29
29
|
"storage"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@haverstack/core": "^0.
|
|
32
|
+
"@haverstack/core": "^0.39.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@haverstack/adapter-conformance": "0.
|
|
35
|
+
"@haverstack/adapter-conformance": "0.8.0",
|
|
36
36
|
"@types/node": "^22.0.0",
|
|
37
37
|
"typescript": "^5.5.0",
|
|
38
38
|
"vitest": "^4.1.11"
|