@haverstack/blob-adapter-disk 0.42.0 → 0.44.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 +6 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -9
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -11,17 +11,21 @@
|
|
|
11
11
|
* torn blob at its final, hash-named path.
|
|
12
12
|
*/
|
|
13
13
|
import type { FileId } from '@haverstack/core';
|
|
14
|
-
import type { StackBlobAdapter, BlobInfo } from '@haverstack/core/adapter';
|
|
14
|
+
import type { StackBlobAdapter, BlobInfo, BlobsQuery } from '@haverstack/core/adapter';
|
|
15
15
|
export type DiskBlobAdapterOptions = {
|
|
16
16
|
/** Directory to store blobs in. Created if it doesn't exist. */
|
|
17
17
|
dir: string;
|
|
18
18
|
};
|
|
19
19
|
export declare class DiskBlobAdapter implements StackBlobAdapter {
|
|
20
|
+
/** Moved by putBlob() and deleteBlob(); see head(). */
|
|
21
|
+
private readonly written;
|
|
20
22
|
private readonly dir;
|
|
21
23
|
constructor(options: DiskBlobAdapterOptions);
|
|
22
24
|
putBlob(data: Uint8Array): Promise<FileId>;
|
|
23
25
|
getBlob(fileId: FileId): Promise<Uint8Array>;
|
|
24
26
|
deleteBlob(fileId: FileId): Promise<void>;
|
|
25
|
-
|
|
27
|
+
/** Each page reads the whole directory, so a copy of n blobs costs about n² / page size. */
|
|
28
|
+
listBlobs(query?: BlobsQuery): Promise<BlobInfo[]>;
|
|
29
|
+
head(): Promise<string>;
|
|
26
30
|
}
|
|
27
31
|
//# 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;
|
|
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;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEvF,MAAM,MAAM,sBAAsB,GAAG;IACnC,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,qBAAa,eAAgB,YAAW,gBAAgB;IACtD,uDAAuD;IACvD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqB;IAC7C,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;IAQ5C,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS/C,4FAA4F;IACtF,SAAS,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAclD,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;CAG9B"}
|
package/dist/index.js
CHANGED
|
@@ -14,14 +14,11 @@ 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
|
|
18
|
-
|
|
19
|
-
const assertFileId = (fileId) => {
|
|
20
|
-
if (!SHA256_HEX_RE.test(fileId)) {
|
|
21
|
-
throw new StackBadRequestError(`Invalid fileId: expected 64-character lowercase hex string`);
|
|
22
|
-
}
|
|
23
|
-
};
|
|
17
|
+
import { StackNotFoundError } from '@haverstack/core';
|
|
18
|
+
import { FILE_ID_RE, trackWrites, assertFileId, blobWindow } from '@haverstack/core/adapter';
|
|
24
19
|
export class DiskBlobAdapter {
|
|
20
|
+
/** Moved by putBlob() and deleteBlob(); see head(). */
|
|
21
|
+
written = trackWrites(this);
|
|
25
22
|
dir;
|
|
26
23
|
constructor(options) {
|
|
27
24
|
this.dir = options.dir;
|
|
@@ -59,13 +56,17 @@ export class DiskBlobAdapter {
|
|
|
59
56
|
// Non-fatal — file may already be gone.
|
|
60
57
|
}
|
|
61
58
|
}
|
|
62
|
-
|
|
59
|
+
/** Each page reads the whole directory, so a copy of n blobs costs about n² / page size. */
|
|
60
|
+
async listBlobs(query) {
|
|
63
61
|
const entries = await readdir(this.dir);
|
|
64
|
-
const fileIds = entries.filter((name) =>
|
|
62
|
+
const fileIds = blobWindow(entries.filter((name) => FILE_ID_RE.test(name)), query);
|
|
65
63
|
return Promise.all(fileIds.map(async (fileId) => {
|
|
66
64
|
const stats = await stat(join(this.dir, fileId));
|
|
67
65
|
return { fileId, size: stats.size, modifiedAt: stats.mtime };
|
|
68
66
|
}));
|
|
69
67
|
}
|
|
68
|
+
async head() {
|
|
69
|
+
return this.written.read();
|
|
70
|
+
}
|
|
70
71
|
}
|
|
71
72
|
//# sourceMappingURL=index.js.map
|
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":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haverstack/blob-adapter-disk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.44.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.46.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@haverstack/adapter-conformance": "0.
|
|
35
|
+
"@haverstack/adapter-conformance": "0.15.0",
|
|
36
36
|
"@types/node": "^22.0.0",
|
|
37
37
|
"typescript": "^5.5.0",
|
|
38
38
|
"vitest": "^4.1.11"
|