@matter/nodejs 0.17.0-alpha.0-20260507-059f7763b → 0.17.0-alpha.0-20260508-29ff5ae9e
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/package.json +9 -9
- package/dist/cjs/behavior/index.d.ts +0 -7
- package/dist/cjs/behavior/index.d.ts.map +0 -1
- package/dist/cjs/behavior/index.js +0 -8
- package/dist/cjs/behavior/index.js.map +0 -6
- package/dist/cjs/behavior/instrumentation.d.ts +0 -11
- package/dist/cjs/behavior/instrumentation.d.ts.map +0 -1
- package/dist/cjs/behavior/instrumentation.js +0 -39
- package/dist/cjs/behavior/instrumentation.js.map +0 -6
- package/dist/cjs/behavior/register.d.ts +0 -7
- package/dist/cjs/behavior/register.d.ts.map +0 -1
- package/dist/cjs/behavior/register.js +0 -9
- package/dist/cjs/behavior/register.js.map +0 -6
- package/dist/cjs/config.d.ts +0 -98
- package/dist/cjs/config.d.ts.map +0 -1
- package/dist/cjs/config.js +0 -210
- package/dist/cjs/config.js.map +0 -6
- package/dist/cjs/crypto/NodeJsCrypto.d.ts +0 -13
- package/dist/cjs/crypto/NodeJsCrypto.d.ts.map +0 -1
- package/dist/cjs/crypto/NodeJsCrypto.js +0 -46
- package/dist/cjs/crypto/NodeJsCrypto.js.map +0 -6
- package/dist/cjs/crypto/index.d.ts +0 -7
- package/dist/cjs/crypto/index.d.ts.map +0 -1
- package/dist/cjs/crypto/index.js +0 -24
- package/dist/cjs/crypto/index.js.map +0 -6
- package/dist/cjs/environment/NodeJsEnvironment.d.ts +0 -77
- package/dist/cjs/environment/NodeJsEnvironment.d.ts.map +0 -1
- package/dist/cjs/environment/NodeJsEnvironment.js +0 -254
- package/dist/cjs/environment/NodeJsEnvironment.js.map +0 -6
- package/dist/cjs/environment/ProcessManager.d.ts +0 -48
- package/dist/cjs/environment/ProcessManager.d.ts.map +0 -1
- package/dist/cjs/environment/ProcessManager.js +0 -129
- package/dist/cjs/environment/ProcessManager.js.map +0 -6
- package/dist/cjs/environment/index.d.ts +0 -9
- package/dist/cjs/environment/index.d.ts.map +0 -1
- package/dist/cjs/environment/index.js +0 -26
- package/dist/cjs/environment/index.js.map +0 -6
- package/dist/cjs/environment/register.d.ts +0 -7
- package/dist/cjs/environment/register.d.ts.map +0 -1
- package/dist/cjs/environment/register.js +0 -10
- package/dist/cjs/environment/register.js.map +0 -6
- package/dist/cjs/fs/NodeJsDirectory.d.ts +0 -24
- package/dist/cjs/fs/NodeJsDirectory.d.ts.map +0 -1
- package/dist/cjs/fs/NodeJsDirectory.js +0 -102
- package/dist/cjs/fs/NodeJsDirectory.js.map +0 -6
- package/dist/cjs/fs/NodeJsFile.d.ts +0 -22
- package/dist/cjs/fs/NodeJsFile.d.ts.map +0 -1
- package/dist/cjs/fs/NodeJsFile.js +0 -248
- package/dist/cjs/fs/NodeJsFile.js.map +0 -6
- package/dist/cjs/fs/NodeJsFilesystem.d.ts +0 -27
- package/dist/cjs/fs/NodeJsFilesystem.d.ts.map +0 -1
- package/dist/cjs/fs/NodeJsFilesystem.js +0 -83
- package/dist/cjs/fs/NodeJsFilesystem.js.map +0 -6
- package/dist/cjs/fs/fs-utils.d.ts +0 -16
- package/dist/cjs/fs/fs-utils.d.ts.map +0 -1
- package/dist/cjs/fs/fs-utils.js +0 -154
- package/dist/cjs/fs/fs-utils.js.map +0 -6
- package/dist/cjs/fs/index.d.ts +0 -7
- package/dist/cjs/fs/index.d.ts.map +0 -1
- package/dist/cjs/fs/index.js +0 -24
- package/dist/cjs/fs/index.js.map +0 -6
- package/dist/cjs/fs/lock-utils.d.ts +0 -12
- package/dist/cjs/fs/lock-utils.d.ts.map +0 -1
- package/dist/cjs/fs/lock-utils.js +0 -132
- package/dist/cjs/fs/lock-utils.js.map +0 -6
- package/dist/cjs/index.d.ts +0 -14
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js +0 -31
- package/dist/cjs/index.js.map +0 -6
- package/dist/cjs/log/FileLogger.d.ts +0 -12
- package/dist/cjs/log/FileLogger.d.ts.map +0 -1
- package/dist/cjs/log/FileLogger.js +0 -46
- package/dist/cjs/log/FileLogger.js.map +0 -6
- package/dist/cjs/log/index.d.ts +0 -7
- package/dist/cjs/log/index.d.ts.map +0 -1
- package/dist/cjs/log/index.js +0 -24
- package/dist/cjs/log/index.js.map +0 -6
- package/dist/cjs/net/NodeJsHttpEndpoint.d.ts +0 -38
- package/dist/cjs/net/NodeJsHttpEndpoint.d.ts.map +0 -1
- package/dist/cjs/net/NodeJsHttpEndpoint.js +0 -306
- package/dist/cjs/net/NodeJsHttpEndpoint.js.map +0 -6
- package/dist/cjs/net/NodeJsNetwork.d.ts +0 -37
- package/dist/cjs/net/NodeJsNetwork.d.ts.map +0 -1
- package/dist/cjs/net/NodeJsNetwork.js +0 -199
- package/dist/cjs/net/NodeJsNetwork.js.map +0 -6
- package/dist/cjs/net/NodeJsTcpConnection.d.ts +0 -24
- package/dist/cjs/net/NodeJsTcpConnection.d.ts.map +0 -1
- package/dist/cjs/net/NodeJsTcpConnection.js +0 -138
- package/dist/cjs/net/NodeJsTcpConnection.js.map +0 -6
- package/dist/cjs/net/NodeJsTcpListener.d.ts +0 -19
- package/dist/cjs/net/NodeJsTcpListener.d.ts.map +0 -1
- package/dist/cjs/net/NodeJsTcpListener.js +0 -100
- package/dist/cjs/net/NodeJsTcpListener.js.map +0 -6
- package/dist/cjs/net/NodeJsUdpSocket.d.ts +0 -23
- package/dist/cjs/net/NodeJsUdpSocket.d.ts.map +0 -1
- package/dist/cjs/net/NodeJsUdpSocket.js +0 -394
- package/dist/cjs/net/NodeJsUdpSocket.js.map +0 -6
- package/dist/cjs/net/WsAdapter.d.ts +0 -25
- package/dist/cjs/net/WsAdapter.d.ts.map +0 -1
- package/dist/cjs/net/WsAdapter.js +0 -33
- package/dist/cjs/net/WsAdapter.js.map +0 -6
- package/dist/cjs/net/index.d.ts +0 -12
- package/dist/cjs/net/index.d.ts.map +0 -1
- package/dist/cjs/net/index.js +0 -29
- package/dist/cjs/net/index.js.map +0 -6
- package/dist/cjs/package.json +0 -6
- package/dist/cjs/storage/fs/DirectoryBlobStorageDriver.d.ts +0 -29
- package/dist/cjs/storage/fs/DirectoryBlobStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/fs/DirectoryBlobStorageDriver.js +0 -155
- package/dist/cjs/storage/fs/DirectoryBlobStorageDriver.js.map +0 -6
- package/dist/cjs/storage/fs/FileStorageDriver.d.ts +0 -44
- package/dist/cjs/storage/fs/FileStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/fs/FileStorageDriver.js +0 -334
- package/dist/cjs/storage/fs/FileStorageDriver.js.map +0 -6
- package/dist/cjs/storage/fs/FlatFileBlobStorageDriver.d.ts +0 -30
- package/dist/cjs/storage/fs/FlatFileBlobStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/fs/FlatFileBlobStorageDriver.js +0 -195
- package/dist/cjs/storage/fs/FlatFileBlobStorageDriver.js.map +0 -6
- package/dist/cjs/storage/fs/JsonFileStorageDriver.d.ts +0 -27
- package/dist/cjs/storage/fs/JsonFileStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/fs/JsonFileStorageDriver.js +0 -128
- package/dist/cjs/storage/fs/JsonFileStorageDriver.js.map +0 -6
- package/dist/cjs/storage/fs/WalBlobStorageDriver.d.ts +0 -19
- package/dist/cjs/storage/fs/WalBlobStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/fs/WalBlobStorageDriver.js +0 -44
- package/dist/cjs/storage/fs/WalBlobStorageDriver.js.map +0 -6
- package/dist/cjs/storage/fs/index.d.ts +0 -21
- package/dist/cjs/storage/fs/index.d.ts.map +0 -1
- package/dist/cjs/storage/fs/index.js +0 -40
- package/dist/cjs/storage/fs/index.js.map +0 -6
- package/dist/cjs/storage/index.d.ts +0 -8
- package/dist/cjs/storage/index.d.ts.map +0 -1
- package/dist/cjs/storage/index.js +0 -25
- package/dist/cjs/storage/index.js.map +0 -6
- package/dist/cjs/storage/sqlite/SqliteBlobStorageDriver.d.ts +0 -48
- package/dist/cjs/storage/sqlite/SqliteBlobStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/SqliteBlobStorageDriver.js +0 -217
- package/dist/cjs/storage/sqlite/SqliteBlobStorageDriver.js.map +0 -6
- package/dist/cjs/storage/sqlite/SqlitePlatform.d.ts +0 -23
- package/dist/cjs/storage/sqlite/SqlitePlatform.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/SqlitePlatform.js +0 -56
- package/dist/cjs/storage/sqlite/SqlitePlatform.js.map +0 -6
- package/dist/cjs/storage/sqlite/SqliteStorageDriver.d.ts +0 -102
- package/dist/cjs/storage/sqlite/SqliteStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/SqliteStorageDriver.js +0 -424
- package/dist/cjs/storage/sqlite/SqliteStorageDriver.js.map +0 -6
- package/dist/cjs/storage/sqlite/SqliteStorageDriverError.d.ts +0 -19
- package/dist/cjs/storage/sqlite/SqliteStorageDriverError.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/SqliteStorageDriverError.js +0 -41
- package/dist/cjs/storage/sqlite/SqliteStorageDriverError.js.map +0 -6
- package/dist/cjs/storage/sqlite/SqliteTypes.d.ts +0 -67
- package/dist/cjs/storage/sqlite/SqliteTypes.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/SqliteTypes.js +0 -35
- package/dist/cjs/storage/sqlite/SqliteTypes.js.map +0 -6
- package/dist/cjs/storage/sqlite/SqliteUtil.d.ts +0 -33
- package/dist/cjs/storage/sqlite/SqliteUtil.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/SqliteUtil.js +0 -64
- package/dist/cjs/storage/sqlite/SqliteUtil.js.map +0 -6
- package/dist/cjs/storage/sqlite/index.d.ts +0 -15
- package/dist/cjs/storage/sqlite/index.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/index.js +0 -37
- package/dist/cjs/storage/sqlite/index.js.map +0 -6
- package/dist/cjs/storage/sqlite/platform/BunSqlite.d.ts +0 -13
- package/dist/cjs/storage/sqlite/platform/BunSqlite.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/platform/BunSqlite.js +0 -61
- package/dist/cjs/storage/sqlite/platform/BunSqlite.js.map +0 -6
- package/dist/cjs/storage/sqlite/platform/NodeJsSqlite.d.ts +0 -8
- package/dist/cjs/storage/sqlite/platform/NodeJsSqlite.d.ts.map +0 -1
- package/dist/cjs/storage/sqlite/platform/NodeJsSqlite.js +0 -53
- package/dist/cjs/storage/sqlite/platform/NodeJsSqlite.js.map +0 -6
- package/dist/cjs/time/index.d.ts +0 -7
- package/dist/cjs/time/index.d.ts.map +0 -1
- package/dist/cjs/time/index.js +0 -8
- package/dist/cjs/time/index.js.map +0 -6
- package/dist/cjs/time/startup.d.ts +0 -7
- package/dist/cjs/time/startup.d.ts.map +0 -1
- package/dist/cjs/time/startup.js +0 -11
- package/dist/cjs/time/startup.js.map +0 -6
- package/dist/cjs/util/runtimeChecks.d.ts +0 -14
- package/dist/cjs/util/runtimeChecks.d.ts.map +0 -1
- package/dist/cjs/util/runtimeChecks.js +0 -45
- package/dist/cjs/util/runtimeChecks.js.map +0 -6
- package/dist/esm/behavior/index.js +0 -7
- package/dist/esm/behavior/index.js.map +0 -6
- package/dist/esm/behavior/instrumentation.js +0 -19
- package/dist/esm/behavior/instrumentation.js.map +0 -6
- package/dist/esm/behavior/register.js +0 -8
- package/dist/esm/behavior/register.js.map +0 -6
- package/dist/esm/config.js +0 -190
- package/dist/esm/config.js.map +0 -6
- package/dist/esm/crypto/NodeJsCrypto.js +0 -16
- package/dist/esm/crypto/NodeJsCrypto.js.map +0 -6
- package/dist/esm/crypto/index.js +0 -7
- package/dist/esm/crypto/index.js.map +0 -6
- package/dist/esm/environment/NodeJsEnvironment.js +0 -242
- package/dist/esm/environment/NodeJsEnvironment.js.map +0 -6
- package/dist/esm/environment/ProcessManager.js +0 -109
- package/dist/esm/environment/ProcessManager.js.map +0 -6
- package/dist/esm/environment/index.js +0 -9
- package/dist/esm/environment/index.js.map +0 -6
- package/dist/esm/environment/register.js +0 -9
- package/dist/esm/environment/register.js.map +0 -6
- package/dist/esm/fs/NodeJsDirectory.js +0 -82
- package/dist/esm/fs/NodeJsDirectory.js.map +0 -6
- package/dist/esm/fs/NodeJsFile.js +0 -232
- package/dist/esm/fs/NodeJsFile.js.map +0 -6
- package/dist/esm/fs/NodeJsFilesystem.js +0 -63
- package/dist/esm/fs/NodeJsFilesystem.js.map +0 -6
- package/dist/esm/fs/fs-utils.js +0 -137
- package/dist/esm/fs/fs-utils.js.map +0 -6
- package/dist/esm/fs/index.js +0 -7
- package/dist/esm/fs/index.js.map +0 -6
- package/dist/esm/fs/lock-utils.js +0 -112
- package/dist/esm/fs/lock-utils.js.map +0 -6
- package/dist/esm/index.js +0 -14
- package/dist/esm/index.js.map +0 -6
- package/dist/esm/log/FileLogger.js +0 -26
- package/dist/esm/log/FileLogger.js.map +0 -6
- package/dist/esm/log/index.js +0 -7
- package/dist/esm/log/index.js.map +0 -6
- package/dist/esm/net/NodeJsHttpEndpoint.js +0 -286
- package/dist/esm/net/NodeJsHttpEndpoint.js.map +0 -6
- package/dist/esm/net/NodeJsNetwork.js +0 -189
- package/dist/esm/net/NodeJsNetwork.js.map +0 -6
- package/dist/esm/net/NodeJsTcpConnection.js +0 -124
- package/dist/esm/net/NodeJsTcpConnection.js.map +0 -6
- package/dist/esm/net/NodeJsTcpListener.js +0 -86
- package/dist/esm/net/NodeJsTcpListener.js.map +0 -6
- package/dist/esm/net/NodeJsUdpSocket.js +0 -385
- package/dist/esm/net/NodeJsUdpSocket.js.map +0 -6
- package/dist/esm/net/WsAdapter.js +0 -13
- package/dist/esm/net/WsAdapter.js.map +0 -6
- package/dist/esm/net/index.js +0 -12
- package/dist/esm/net/index.js.map +0 -6
- package/dist/esm/package.json +0 -6
- package/dist/esm/storage/fs/DirectoryBlobStorageDriver.js +0 -140
- package/dist/esm/storage/fs/DirectoryBlobStorageDriver.js.map +0 -6
- package/dist/esm/storage/fs/FileStorageDriver.js +0 -323
- package/dist/esm/storage/fs/FileStorageDriver.js.map +0 -6
- package/dist/esm/storage/fs/FlatFileBlobStorageDriver.js +0 -180
- package/dist/esm/storage/fs/FlatFileBlobStorageDriver.js.map +0 -6
- package/dist/esm/storage/fs/JsonFileStorageDriver.js +0 -116
- package/dist/esm/storage/fs/JsonFileStorageDriver.js.map +0 -6
- package/dist/esm/storage/fs/WalBlobStorageDriver.js +0 -24
- package/dist/esm/storage/fs/WalBlobStorageDriver.js.map +0 -6
- package/dist/esm/storage/fs/index.js +0 -19
- package/dist/esm/storage/fs/index.js.map +0 -6
- package/dist/esm/storage/index.js +0 -8
- package/dist/esm/storage/index.js.map +0 -6
- package/dist/esm/storage/sqlite/SqliteBlobStorageDriver.js +0 -197
- package/dist/esm/storage/sqlite/SqliteBlobStorageDriver.js.map +0 -6
- package/dist/esm/storage/sqlite/SqlitePlatform.js +0 -26
- package/dist/esm/storage/sqlite/SqlitePlatform.js.map +0 -6
- package/dist/esm/storage/sqlite/SqliteStorageDriver.js +0 -409
- package/dist/esm/storage/sqlite/SqliteStorageDriver.js.map +0 -6
- package/dist/esm/storage/sqlite/SqliteStorageDriverError.js +0 -21
- package/dist/esm/storage/sqlite/SqliteStorageDriverError.js.map +0 -6
- package/dist/esm/storage/sqlite/SqliteTypes.js +0 -15
- package/dist/esm/storage/sqlite/SqliteTypes.js.map +0 -6
- package/dist/esm/storage/sqlite/SqliteUtil.js +0 -44
- package/dist/esm/storage/sqlite/SqliteUtil.js.map +0 -6
- package/dist/esm/storage/sqlite/index.js +0 -17
- package/dist/esm/storage/sqlite/index.js.map +0 -6
- package/dist/esm/storage/sqlite/platform/BunSqlite.js +0 -41
- package/dist/esm/storage/sqlite/platform/BunSqlite.js.map +0 -6
- package/dist/esm/storage/sqlite/platform/NodeJsSqlite.js +0 -33
- package/dist/esm/storage/sqlite/platform/NodeJsSqlite.js.map +0 -6
- package/dist/esm/time/index.js +0 -7
- package/dist/esm/time/index.js.map +0 -6
- package/dist/esm/time/startup.js +0 -10
- package/dist/esm/time/startup.js.map +0 -6
- package/dist/esm/util/runtimeChecks.js +0 -25
- package/dist/esm/util/runtimeChecks.js.map +0 -6
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import {
|
|
7
|
-
BaseStorageDriver,
|
|
8
|
-
Bytes,
|
|
9
|
-
FilesystemBlobStorageDriver,
|
|
10
|
-
StorageError
|
|
11
|
-
} from "@matter/general";
|
|
12
|
-
class DirectoryBlobStorageDriver extends FilesystemBlobStorageDriver {
|
|
13
|
-
static id = "dir";
|
|
14
|
-
static create(namespace, _descriptor) {
|
|
15
|
-
return new DirectoryBlobStorageDriver(namespace);
|
|
16
|
-
}
|
|
17
|
-
#rootDir;
|
|
18
|
-
#initialized = false;
|
|
19
|
-
constructor(namespace) {
|
|
20
|
-
super(namespace);
|
|
21
|
-
this.#rootDir = this.root.directory;
|
|
22
|
-
}
|
|
23
|
-
get initialized() {
|
|
24
|
-
return this.#initialized;
|
|
25
|
-
}
|
|
26
|
-
async initialize() {
|
|
27
|
-
await super.initialize();
|
|
28
|
-
await this.#rootDir.mkdir();
|
|
29
|
-
this.#initialized = true;
|
|
30
|
-
}
|
|
31
|
-
async close() {
|
|
32
|
-
this.#initialized = false;
|
|
33
|
-
await super.close();
|
|
34
|
-
}
|
|
35
|
-
async openBlob(contexts, key) {
|
|
36
|
-
const file = this.#resolve(contexts, key);
|
|
37
|
-
if (!await file.exists()) {
|
|
38
|
-
return new Blob([]);
|
|
39
|
-
}
|
|
40
|
-
const bytes = await file.readAllBytes();
|
|
41
|
-
return new Blob([Bytes.exclusive(bytes)]);
|
|
42
|
-
}
|
|
43
|
-
// TODO: writes go directly to the final file via the File abstraction's streaming support.
|
|
44
|
-
// Not atomic — a crash mid-write leaves a partial file. Hardening with write-to-tmp + rename
|
|
45
|
-
// would require bypassing File.write() to get a temp path in the same directory.
|
|
46
|
-
async writeBlobFromStream(contexts, key, stream) {
|
|
47
|
-
validateKey(key);
|
|
48
|
-
let dir = this.#rootDir;
|
|
49
|
-
for (const ctx of contexts) {
|
|
50
|
-
if (ctx === ".." || ctx === "." || !ctx.length || ctx.includes("\\")) {
|
|
51
|
-
throw new StorageError(`Context segment "${ctx}" is not allowed`);
|
|
52
|
-
}
|
|
53
|
-
dir = dir.directory(encodeContextSegment(ctx));
|
|
54
|
-
await dir.mkdir();
|
|
55
|
-
}
|
|
56
|
-
const file = dir.file(key);
|
|
57
|
-
await file.write(streamToAsyncIterable(stream));
|
|
58
|
-
}
|
|
59
|
-
async delete(contexts, key) {
|
|
60
|
-
const file = this.#resolve(contexts, key);
|
|
61
|
-
if (await file.exists()) {
|
|
62
|
-
await file.delete();
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
async has(contexts, key) {
|
|
66
|
-
return this.#resolve(contexts, key).exists();
|
|
67
|
-
}
|
|
68
|
-
async keys(contexts) {
|
|
69
|
-
const dir = this.#contextDir(contexts);
|
|
70
|
-
if (!await dir.exists()) {
|
|
71
|
-
return [];
|
|
72
|
-
}
|
|
73
|
-
const files = await dir.files();
|
|
74
|
-
return files.filter((f) => !BaseStorageDriver.RESERVED_FILENAMES.has(f) && !f.endsWith(".tmp"));
|
|
75
|
-
}
|
|
76
|
-
async contexts(contexts) {
|
|
77
|
-
const dir = this.#contextDir(contexts);
|
|
78
|
-
if (!await dir.exists()) {
|
|
79
|
-
return [];
|
|
80
|
-
}
|
|
81
|
-
const encoded = await dir.directories();
|
|
82
|
-
return encoded.map(decodeContextSegment);
|
|
83
|
-
}
|
|
84
|
-
async clearAll(contexts) {
|
|
85
|
-
const dir = this.#contextDir(contexts);
|
|
86
|
-
if (await dir.exists()) {
|
|
87
|
-
await dir.delete();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
#contextDir(contexts) {
|
|
91
|
-
let dir = this.#rootDir;
|
|
92
|
-
for (const ctx of contexts) {
|
|
93
|
-
if (ctx === ".." || ctx === "." || !ctx.length || ctx.includes("\\")) {
|
|
94
|
-
throw new StorageError(`Context segment "${ctx}" is not allowed`);
|
|
95
|
-
}
|
|
96
|
-
dir = dir.directory(encodeContextSegment(ctx));
|
|
97
|
-
}
|
|
98
|
-
return dir;
|
|
99
|
-
}
|
|
100
|
-
#resolve(contexts, key) {
|
|
101
|
-
validateKey(key);
|
|
102
|
-
return this.#contextDir(contexts).file(key);
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
function validateKey(key) {
|
|
106
|
-
if (!key.length) {
|
|
107
|
-
throw new StorageError("Key must not be empty");
|
|
108
|
-
}
|
|
109
|
-
if (key.includes("/") || key.includes("\\") || key === ".." || key.startsWith("../") || key.includes("/../")) {
|
|
110
|
-
throw new StorageError(`Key "${key}" contains path traversal characters`);
|
|
111
|
-
}
|
|
112
|
-
if (BaseStorageDriver.RESERVED_FILENAMES.has(key)) {
|
|
113
|
-
throw new StorageError(`Key "${key}" is a reserved filename`);
|
|
114
|
-
}
|
|
115
|
-
if (key.endsWith(".tmp")) {
|
|
116
|
-
throw new StorageError(`Key "${key}" must not end with ".tmp" (reserved for atomic writes)`);
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
async function* streamToAsyncIterable(stream) {
|
|
120
|
-
const reader = stream.getReader();
|
|
121
|
-
try {
|
|
122
|
-
while (true) {
|
|
123
|
-
const { done, value } = await reader.read();
|
|
124
|
-
if (done) break;
|
|
125
|
-
yield Bytes.of(value);
|
|
126
|
-
}
|
|
127
|
-
} finally {
|
|
128
|
-
reader.releaseLock();
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
function encodeContextSegment(segment) {
|
|
132
|
-
return segment.replace(/%/g, "%25").replace(/\//g, "%2F");
|
|
133
|
-
}
|
|
134
|
-
function decodeContextSegment(encoded) {
|
|
135
|
-
return encoded.replace(/%2F/gi, "/").replace(/%25/g, "%");
|
|
136
|
-
}
|
|
137
|
-
export {
|
|
138
|
-
DirectoryBlobStorageDriver
|
|
139
|
-
};
|
|
140
|
-
//# sourceMappingURL=DirectoryBlobStorageDriver.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/storage/fs/DirectoryBlobStorageDriver.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
@@ -1,323 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import {
|
|
7
|
-
createPromise,
|
|
8
|
-
FilesystemStorageDriver,
|
|
9
|
-
fromJson,
|
|
10
|
-
Logger,
|
|
11
|
-
MatterAggregateError,
|
|
12
|
-
StorageDriver,
|
|
13
|
-
StorageError,
|
|
14
|
-
toJson
|
|
15
|
-
} from "@matter/general";
|
|
16
|
-
import { openAsBlob } from "node:fs";
|
|
17
|
-
import { mkdir, open, readdir, readFile, rename, rm } from "node:fs/promises";
|
|
18
|
-
import { join } from "node:path";
|
|
19
|
-
const logger = new Logger("FileStorageDriver");
|
|
20
|
-
class FileStorageDriver extends FilesystemStorageDriver {
|
|
21
|
-
static id = "file";
|
|
22
|
-
static async create(namespace, _descriptor) {
|
|
23
|
-
const storage = new FileStorageDriver(namespace);
|
|
24
|
-
try {
|
|
25
|
-
await storage.initialize();
|
|
26
|
-
} catch (error) {
|
|
27
|
-
await storage.close().catch(() => {
|
|
28
|
-
});
|
|
29
|
-
throw error;
|
|
30
|
-
}
|
|
31
|
-
return storage;
|
|
32
|
-
}
|
|
33
|
-
#path;
|
|
34
|
-
#clear;
|
|
35
|
-
isInitialized = false;
|
|
36
|
-
#writeFileBlocker = /* @__PURE__ */ new Map();
|
|
37
|
-
#index = {};
|
|
38
|
-
constructor(namespaceOrPath, clear = false) {
|
|
39
|
-
super(typeof namespaceOrPath === "string" || namespaceOrPath === void 0 ? void 0 : namespaceOrPath);
|
|
40
|
-
this.#path = typeof namespaceOrPath === "string" ? namespaceOrPath : namespaceOrPath !== void 0 ? this.root.directory.path : "";
|
|
41
|
-
this.#clear = clear;
|
|
42
|
-
}
|
|
43
|
-
get initialized() {
|
|
44
|
-
return this.isInitialized;
|
|
45
|
-
}
|
|
46
|
-
async initialize() {
|
|
47
|
-
if (this.isInitialized) {
|
|
48
|
-
throw new StorageError("Storage already initialized!");
|
|
49
|
-
}
|
|
50
|
-
await super.initialize();
|
|
51
|
-
if (this.#clear) {
|
|
52
|
-
this.#index = {};
|
|
53
|
-
await rm(this.#path, { recursive: true, force: true });
|
|
54
|
-
}
|
|
55
|
-
await mkdir(this.#path, { recursive: true });
|
|
56
|
-
const files = await readdir(this.#path);
|
|
57
|
-
for (const file of files) {
|
|
58
|
-
if (StorageDriver.RESERVED_FILENAMES.has(file)) {
|
|
59
|
-
continue;
|
|
60
|
-
}
|
|
61
|
-
if (file.endsWith(".tmp")) {
|
|
62
|
-
logger.info("Deleting orphaned temp file", file);
|
|
63
|
-
await rm(join(this.#path, file), { force: true });
|
|
64
|
-
continue;
|
|
65
|
-
}
|
|
66
|
-
const parts = decodeURIComponent(file).split(".");
|
|
67
|
-
this.#markValue(parts.slice(0, -1), parts[parts.length - 1]);
|
|
68
|
-
}
|
|
69
|
-
this.isInitialized = true;
|
|
70
|
-
}
|
|
71
|
-
#indexFor(contexts) {
|
|
72
|
-
let node = this.#index;
|
|
73
|
-
for (const name of contexts) {
|
|
74
|
-
let child = node.contexts?.get(name);
|
|
75
|
-
if (child === void 0) {
|
|
76
|
-
child = {};
|
|
77
|
-
if (!node.contexts) {
|
|
78
|
-
node.contexts = /* @__PURE__ */ new Map();
|
|
79
|
-
}
|
|
80
|
-
node.contexts.set(name, child);
|
|
81
|
-
}
|
|
82
|
-
node = child;
|
|
83
|
-
}
|
|
84
|
-
return node;
|
|
85
|
-
}
|
|
86
|
-
#markValue(contexts, key) {
|
|
87
|
-
const index = this.#indexFor(contexts);
|
|
88
|
-
if (!index.keys) {
|
|
89
|
-
index.keys = /* @__PURE__ */ new Set();
|
|
90
|
-
}
|
|
91
|
-
index.keys.add(key);
|
|
92
|
-
}
|
|
93
|
-
async #finishAllWrites(filename) {
|
|
94
|
-
if (filename !== void 0 && this.#writeFileBlocker.has(filename) || filename === void 0 && this.#writeFileBlocker.size > 0) {
|
|
95
|
-
for (let i = 0; i < 10; i++) {
|
|
96
|
-
await MatterAggregateError.allSettled(
|
|
97
|
-
filename !== void 0 ? [this.#writeFileBlocker.get(filename)] : this.#writeFileBlocker.values(),
|
|
98
|
-
"Error on finishing all file system writes to storage"
|
|
99
|
-
);
|
|
100
|
-
if (!this.#writeFileBlocker.size) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
await this.#fsyncStorageDir();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
async close() {
|
|
108
|
-
this.isInitialized = false;
|
|
109
|
-
await this.#finishAllWrites();
|
|
110
|
-
await super.close();
|
|
111
|
-
}
|
|
112
|
-
filePath(fileName) {
|
|
113
|
-
return join(this.#path, fileName);
|
|
114
|
-
}
|
|
115
|
-
getContextBaseKey(contexts) {
|
|
116
|
-
for (const ctx of contexts) {
|
|
117
|
-
if (!ctx.length || ctx.includes(".")) {
|
|
118
|
-
throw new StorageError("Context must not contain empty segments or leading or trailing dots.");
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
return contexts.join(".");
|
|
122
|
-
}
|
|
123
|
-
buildStorageKey(contexts, key) {
|
|
124
|
-
if (!key.length) {
|
|
125
|
-
throw new StorageError("Key must not be an empty string.");
|
|
126
|
-
}
|
|
127
|
-
if (key === "tmp") {
|
|
128
|
-
throw new StorageError(`Key "tmp" is reserved for atomic write operations.`);
|
|
129
|
-
}
|
|
130
|
-
const contextKey = this.getContextBaseKey(contexts);
|
|
131
|
-
const rawName = contextKey.length ? `${contextKey}.${key}` : key;
|
|
132
|
-
return encodeURIComponent(rawName).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
|
|
133
|
-
}
|
|
134
|
-
async has(contexts, key) {
|
|
135
|
-
const index = this.#indexFor(contexts);
|
|
136
|
-
return !!index.keys?.has(key);
|
|
137
|
-
}
|
|
138
|
-
async get(contexts, key) {
|
|
139
|
-
const fileName = this.filePath(this.buildStorageKey(contexts, key));
|
|
140
|
-
await this.#finishAllWrites(fileName);
|
|
141
|
-
let value;
|
|
142
|
-
try {
|
|
143
|
-
value = await readFile(fileName, "utf8");
|
|
144
|
-
} catch (error) {
|
|
145
|
-
if (error.code === "ENOENT") return void 0;
|
|
146
|
-
throw error;
|
|
147
|
-
}
|
|
148
|
-
try {
|
|
149
|
-
return fromJson(value);
|
|
150
|
-
} catch (error) {
|
|
151
|
-
logger.error(`Failed to parse storage value for key ${key} in context ${contexts.join(".")}`);
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
/**
|
|
155
|
-
* Read a blob from the flat file format. Retained for legacy migration support — the
|
|
156
|
-
* {@link StorageMigration} cross-type kv→blob strategy duck-types this method to extract
|
|
157
|
-
* blobs from old FileStorageDriver data.
|
|
158
|
-
*
|
|
159
|
-
* @deprecated Only used for migration from legacy flat-file blob format.
|
|
160
|
-
*/
|
|
161
|
-
async openBlob(contexts, key) {
|
|
162
|
-
const fileName = this.filePath(this.buildStorageKey(contexts, key));
|
|
163
|
-
if (await this.has(contexts, key)) {
|
|
164
|
-
return await openAsBlob(fileName);
|
|
165
|
-
}
|
|
166
|
-
return new Blob();
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Write blob data in the flat file format. Retained for legacy migration support.
|
|
170
|
-
*
|
|
171
|
-
* @deprecated Only used for migration from legacy flat-file blob format.
|
|
172
|
-
*/
|
|
173
|
-
async writeBlobFromStream(contexts, key, stream) {
|
|
174
|
-
return this.#writeFile(contexts, key, stream);
|
|
175
|
-
}
|
|
176
|
-
async set(contexts, keyOrValues, value) {
|
|
177
|
-
if (typeof keyOrValues === "string") {
|
|
178
|
-
return this.#writeFile(contexts, keyOrValues, toJson(value));
|
|
179
|
-
}
|
|
180
|
-
const promises = new Array();
|
|
181
|
-
for (const [key, value2] of Object.entries(keyOrValues)) {
|
|
182
|
-
promises.push(this.#writeFile(contexts, key, toJson(value2)));
|
|
183
|
-
}
|
|
184
|
-
await MatterAggregateError.allSettled(promises, "Error when writing values into filesystem storage");
|
|
185
|
-
}
|
|
186
|
-
/** According to Node.js documentation, writeFile is not atomic. This method ensures atomicity. */
|
|
187
|
-
async #writeFile(contexts, key, valueOrStream) {
|
|
188
|
-
const fileName = this.buildStorageKey(contexts, key);
|
|
189
|
-
if (StorageDriver.RESERVED_FILENAMES.has(fileName)) {
|
|
190
|
-
throw new StorageError(
|
|
191
|
-
`Key "${key}" in context "${contexts.join(".")}" maps to reserved file "${fileName}"`
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
const blocker = this.#writeFileBlocker.get(fileName);
|
|
195
|
-
if (blocker !== void 0) {
|
|
196
|
-
await blocker;
|
|
197
|
-
return this.#writeFile(contexts, key, valueOrStream);
|
|
198
|
-
}
|
|
199
|
-
const promise = this.#writeAndMoveFile(this.filePath(fileName), valueOrStream).finally(() => {
|
|
200
|
-
this.#writeFileBlocker.delete(fileName);
|
|
201
|
-
this.#markValue(contexts, key);
|
|
202
|
-
});
|
|
203
|
-
this.#writeFileBlocker.set(fileName, promise);
|
|
204
|
-
return promise;
|
|
205
|
-
}
|
|
206
|
-
async #writeAndMoveFile(filepath, valueOrStream) {
|
|
207
|
-
const tmpName = `${filepath}.tmp`;
|
|
208
|
-
const handle = await open(tmpName, "w");
|
|
209
|
-
const isStream = valueOrStream instanceof ReadableStream;
|
|
210
|
-
const writer = handle.createWriteStream({ encoding: isStream ? null : "utf8", flush: true });
|
|
211
|
-
const { resolver, rejecter, promise: writePromise } = createPromise();
|
|
212
|
-
writer.on("finish", resolver);
|
|
213
|
-
writer.on("error", rejecter);
|
|
214
|
-
let reader;
|
|
215
|
-
try {
|
|
216
|
-
if (isStream) {
|
|
217
|
-
reader = valueOrStream.getReader();
|
|
218
|
-
while (true) {
|
|
219
|
-
const { value: chunk, done } = await reader.read();
|
|
220
|
-
if (chunk) {
|
|
221
|
-
if (!writer.write(chunk)) {
|
|
222
|
-
await new Promise((resolve) => writer.once("drain", resolve));
|
|
223
|
-
}
|
|
224
|
-
}
|
|
225
|
-
if (done) {
|
|
226
|
-
break;
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
} else {
|
|
230
|
-
writer.write(valueOrStream);
|
|
231
|
-
}
|
|
232
|
-
writer.end();
|
|
233
|
-
await writePromise;
|
|
234
|
-
} finally {
|
|
235
|
-
if (isStream && reader) {
|
|
236
|
-
if (valueOrStream.locked) {
|
|
237
|
-
reader.releaseLock();
|
|
238
|
-
}
|
|
239
|
-
await valueOrStream.cancel();
|
|
240
|
-
}
|
|
241
|
-
await handle.close();
|
|
242
|
-
}
|
|
243
|
-
await rename(tmpName, filepath);
|
|
244
|
-
}
|
|
245
|
-
/**
|
|
246
|
-
* fsync on a directory ensures there are no rename operations etc. which haven't been persisted to disk.
|
|
247
|
-
* We do this as best effort to ensure that all writes are persisted to disk.
|
|
248
|
-
*/
|
|
249
|
-
async #fsyncStorageDir() {
|
|
250
|
-
if (process.platform === "win32") {
|
|
251
|
-
return;
|
|
252
|
-
}
|
|
253
|
-
const fd = await open(this.#path, "r");
|
|
254
|
-
try {
|
|
255
|
-
await fd.sync();
|
|
256
|
-
} catch (error) {
|
|
257
|
-
logger.warn(`Failed to fsync storage directory ${this.#path}`, error);
|
|
258
|
-
} finally {
|
|
259
|
-
await fd.close();
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
async delete(contexts, key) {
|
|
263
|
-
await this.#rm(this.buildStorageKey(contexts, key), this.#indexFor(contexts), key);
|
|
264
|
-
}
|
|
265
|
-
async #rm(filename, index, key) {
|
|
266
|
-
await this.#finishAllWrites(filename);
|
|
267
|
-
return rm(this.filePath(filename), { force: true }).finally(() => {
|
|
268
|
-
index.keys?.delete(key);
|
|
269
|
-
});
|
|
270
|
-
}
|
|
271
|
-
/** Returns all keys of a storage context without keys of sub-contexts */
|
|
272
|
-
async keys(contexts) {
|
|
273
|
-
const index = this.#indexFor(contexts);
|
|
274
|
-
return index.keys ? [...index.keys] : [];
|
|
275
|
-
}
|
|
276
|
-
async values(contexts) {
|
|
277
|
-
const values = {};
|
|
278
|
-
const promises = new Array();
|
|
279
|
-
for (const key of await this.keys(contexts)) {
|
|
280
|
-
promises.push(
|
|
281
|
-
(async () => {
|
|
282
|
-
const value = await this.get(contexts, key);
|
|
283
|
-
if (value !== void 0) {
|
|
284
|
-
values[key] = value;
|
|
285
|
-
}
|
|
286
|
-
})()
|
|
287
|
-
);
|
|
288
|
-
}
|
|
289
|
-
await MatterAggregateError.allSettled(promises, "Error when reading values from filesystem storage");
|
|
290
|
-
return values;
|
|
291
|
-
}
|
|
292
|
-
contexts(contexts) {
|
|
293
|
-
const index = this.#indexFor(contexts);
|
|
294
|
-
return index.contexts ? [...index.contexts.keys()] : [];
|
|
295
|
-
}
|
|
296
|
-
async clearAll(contexts) {
|
|
297
|
-
await this.#finishAllWrites();
|
|
298
|
-
const parent = this.#indexFor(contexts.slice(0, -1));
|
|
299
|
-
const name = contexts[contexts.length - 1];
|
|
300
|
-
await this.#clearChildContext(contexts, parent, name);
|
|
301
|
-
}
|
|
302
|
-
async #clearChildContext(contexts, parent, name) {
|
|
303
|
-
const index = parent.contexts?.get(name);
|
|
304
|
-
if (index === void 0) {
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
if (index.contexts) {
|
|
308
|
-
for (const name2 of index.contexts.keys()) {
|
|
309
|
-
await this.#clearChildContext([...contexts, name2], index, name2);
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
if (index.keys) {
|
|
313
|
-
await MatterAggregateError.allSettled(
|
|
314
|
-
[...index.keys].map((key) => this.#rm(this.buildStorageKey(contexts, key), index, key)),
|
|
315
|
-
`Error deleting keys of storage context ${contexts.join(".")}`
|
|
316
|
-
);
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
}
|
|
320
|
-
export {
|
|
321
|
-
FileStorageDriver
|
|
322
|
-
};
|
|
323
|
-
//# sourceMappingURL=FileStorageDriver.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/storage/fs/FileStorageDriver.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": ["value", "name"]
|
|
6
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import {
|
|
7
|
-
BaseStorageDriver,
|
|
8
|
-
Bytes,
|
|
9
|
-
FilesystemBlobStorageDriver,
|
|
10
|
-
StorageError
|
|
11
|
-
} from "@matter/general";
|
|
12
|
-
import { createWriteStream, existsSync, openAsBlob } from "node:fs";
|
|
13
|
-
import { mkdir, readdir, rename, rm } from "node:fs/promises";
|
|
14
|
-
import { join } from "node:path";
|
|
15
|
-
class FlatFileBlobStorageDriver extends FilesystemBlobStorageDriver {
|
|
16
|
-
static id = "file";
|
|
17
|
-
static create(namespace, _descriptor) {
|
|
18
|
-
return new FlatFileBlobStorageDriver(namespace);
|
|
19
|
-
}
|
|
20
|
-
#path;
|
|
21
|
-
#initialized = false;
|
|
22
|
-
constructor(namespace) {
|
|
23
|
-
super(namespace);
|
|
24
|
-
this.#path = this.root.directory.path;
|
|
25
|
-
}
|
|
26
|
-
get initialized() {
|
|
27
|
-
return this.#initialized;
|
|
28
|
-
}
|
|
29
|
-
async initialize() {
|
|
30
|
-
await super.initialize();
|
|
31
|
-
await mkdir(this.#path, { recursive: true });
|
|
32
|
-
this.#initialized = true;
|
|
33
|
-
}
|
|
34
|
-
async close() {
|
|
35
|
-
this.#initialized = false;
|
|
36
|
-
await super.close();
|
|
37
|
-
}
|
|
38
|
-
async openBlob(contexts, key) {
|
|
39
|
-
const filePath = join(this.#path, buildStorageKey(contexts, key));
|
|
40
|
-
if (!existsSync(filePath)) {
|
|
41
|
-
return new Blob([]);
|
|
42
|
-
}
|
|
43
|
-
return await openAsBlob(filePath);
|
|
44
|
-
}
|
|
45
|
-
// Stream chunks to disk via atomic write-to-tmp + rename
|
|
46
|
-
async writeBlobFromStream(contexts, key, stream) {
|
|
47
|
-
const fileName = buildStorageKey(contexts, key);
|
|
48
|
-
const filePath = join(this.#path, fileName);
|
|
49
|
-
const tmpPath = `${filePath}.tmp`;
|
|
50
|
-
const reader = stream.getReader();
|
|
51
|
-
const writer = createWriteStream(tmpPath);
|
|
52
|
-
try {
|
|
53
|
-
while (true) {
|
|
54
|
-
const { done, value } = await reader.read();
|
|
55
|
-
if (done) break;
|
|
56
|
-
const chunk = Bytes.of(value);
|
|
57
|
-
if (!writer.write(chunk)) {
|
|
58
|
-
await new Promise((resolve) => writer.once("drain", resolve));
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
writer.end();
|
|
62
|
-
await new Promise((resolve, reject) => {
|
|
63
|
-
writer.on("finish", resolve);
|
|
64
|
-
writer.on("error", reject);
|
|
65
|
-
});
|
|
66
|
-
await rename(tmpPath, filePath);
|
|
67
|
-
} catch (error) {
|
|
68
|
-
writer.destroy();
|
|
69
|
-
await rm(tmpPath, { force: true });
|
|
70
|
-
throw error;
|
|
71
|
-
} finally {
|
|
72
|
-
reader.releaseLock();
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
async delete(contexts, key) {
|
|
76
|
-
const filePath = join(this.#path, buildStorageKey(contexts, key));
|
|
77
|
-
await rm(filePath, { force: true });
|
|
78
|
-
}
|
|
79
|
-
async has(contexts, key) {
|
|
80
|
-
const filePath = join(this.#path, buildStorageKey(contexts, key));
|
|
81
|
-
return existsSync(filePath);
|
|
82
|
-
}
|
|
83
|
-
// When contexts is empty, prefixDot is "" and startsWith("") is always true — every file
|
|
84
|
-
// matches. The caller (keys/contexts/clearAll) then applies its own filtering on the remainder.
|
|
85
|
-
async keys(contexts) {
|
|
86
|
-
const prefixDot = contextPrefixDot(contexts);
|
|
87
|
-
const result = new Array();
|
|
88
|
-
for (const { remainder } of await this.#listDecodedFiles(prefixDot)) {
|
|
89
|
-
if (remainder.length && !remainder.includes(".")) {
|
|
90
|
-
result.push(remainder);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
return result;
|
|
94
|
-
}
|
|
95
|
-
async contexts(contexts) {
|
|
96
|
-
const prefixDot = contextPrefixDot(contexts);
|
|
97
|
-
const found = /* @__PURE__ */ new Set();
|
|
98
|
-
for (const { remainder } of await this.#listDecodedFiles(prefixDot)) {
|
|
99
|
-
const dotIndex = remainder.indexOf(".");
|
|
100
|
-
if (dotIndex > 0) {
|
|
101
|
-
found.add(remainder.substring(0, dotIndex));
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
return [...found];
|
|
105
|
-
}
|
|
106
|
-
async clearAll(contexts) {
|
|
107
|
-
const prefix = getContextBaseKey(contexts);
|
|
108
|
-
const prefixDot = prefix.length ? `${prefix}.` : "";
|
|
109
|
-
for (const { file, decoded } of await this.#listDecodedFiles("")) {
|
|
110
|
-
if (decoded === prefix || decoded.startsWith(prefixDot)) {
|
|
111
|
-
await rm(join(this.#path, file), { force: true });
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* List all data files in the directory, decoded and filtered (excludes reserved files and
|
|
117
|
-
* `.tmp` atomicity artifacts). Returns raw filename + decoded name + remainder after prefix.
|
|
118
|
-
*/
|
|
119
|
-
async #listDecodedFiles(prefixDot) {
|
|
120
|
-
let files;
|
|
121
|
-
try {
|
|
122
|
-
files = await readdir(this.#path);
|
|
123
|
-
} catch (e) {
|
|
124
|
-
if (e.code === "ENOENT") {
|
|
125
|
-
return [];
|
|
126
|
-
}
|
|
127
|
-
throw e;
|
|
128
|
-
}
|
|
129
|
-
const result = new Array();
|
|
130
|
-
for (const file of files) {
|
|
131
|
-
if (BaseStorageDriver.RESERVED_FILENAMES.has(file) || file.endsWith(".tmp")) {
|
|
132
|
-
continue;
|
|
133
|
-
}
|
|
134
|
-
let decoded;
|
|
135
|
-
try {
|
|
136
|
-
decoded = decodeURIComponent(file);
|
|
137
|
-
} catch {
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
if (!decoded.startsWith(prefixDot)) {
|
|
141
|
-
continue;
|
|
142
|
-
}
|
|
143
|
-
result.push({ file, decoded, remainder: decoded.substring(prefixDot.length) });
|
|
144
|
-
}
|
|
145
|
-
return result;
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
function getContextBaseKey(contexts) {
|
|
149
|
-
for (const ctx of contexts) {
|
|
150
|
-
if (!ctx.length || ctx.includes(".")) {
|
|
151
|
-
throw new StorageError("Context must not contain empty segments or leading or trailing dots.");
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return contexts.join(".");
|
|
155
|
-
}
|
|
156
|
-
function contextPrefixDot(contexts) {
|
|
157
|
-
const prefix = getContextBaseKey(contexts);
|
|
158
|
-
return prefix.length ? `${prefix}.` : "";
|
|
159
|
-
}
|
|
160
|
-
function buildStorageKey(contexts, key) {
|
|
161
|
-
if (!key.length) {
|
|
162
|
-
throw new StorageError("Key must not be an empty string.");
|
|
163
|
-
}
|
|
164
|
-
if (key.includes(".")) {
|
|
165
|
-
throw new StorageError(`Key "${key}" must not contain "." (would be misinterpreted as context separator)`);
|
|
166
|
-
}
|
|
167
|
-
if (key.endsWith(".tmp")) {
|
|
168
|
-
throw new StorageError(`Key "${key}" must not end with ".tmp" (reserved for atomic writes)`);
|
|
169
|
-
}
|
|
170
|
-
if (BaseStorageDriver.RESERVED_FILENAMES.has(key)) {
|
|
171
|
-
throw new StorageError(`Key "${key}" is a reserved filename`);
|
|
172
|
-
}
|
|
173
|
-
const contextKey = getContextBaseKey(contexts);
|
|
174
|
-
const rawName = contextKey.length ? `${contextKey}.${key}` : key;
|
|
175
|
-
return encodeURIComponent(rawName).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
|
|
176
|
-
}
|
|
177
|
-
export {
|
|
178
|
-
FlatFileBlobStorageDriver
|
|
179
|
-
};
|
|
180
|
-
//# sourceMappingURL=FlatFileBlobStorageDriver.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../../src/storage/fs/FlatFileBlobStorageDriver.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|