@duraxis/storage-memory 0.0.0-stage → 0.1.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/CHANGELOG.md +4 -0
- package/LICENSE +15 -0
- package/README.md +31 -2
- package/dist/index.cjs +98 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +97 -0
- package/dist/index.js.map +1 -0
- package/dist/memory-storage.driver.d.ts +12 -0
- package/package.json +58 -3
package/CHANGELOG.md
ADDED
package/LICENSE
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
ISC License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 João Paulo Dias
|
|
4
|
+
|
|
5
|
+
Permission to use, copy, modify, and/or distribute this software for any
|
|
6
|
+
purpose with or without fee is hereby granted, provided that the above
|
|
7
|
+
copyright notice and this permission notice appear in all copies.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
10
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
11
|
+
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
12
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
|
13
|
+
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
14
|
+
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
15
|
+
PERFORMANCE OF THIS SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,32 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @duraxis/storage-memory
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Implementação volátil de `StorageDriver`. É adequada para testes, exemplos e desenvolvimento
|
|
4
|
+
local, mas todo o conteúdo desaparece quando a instância é descartada.
|
|
5
|
+
|
|
6
|
+
## Instalação
|
|
7
|
+
|
|
8
|
+
```bash
|
|
9
|
+
pnpm add @duraxis/storage-memory
|
|
10
|
+
npm install @duraxis/storage-memory
|
|
11
|
+
yarn add @duraxis/storage-memory
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
`@duraxis/storage` é instalado como dependência.
|
|
15
|
+
|
|
16
|
+
```ts
|
|
17
|
+
import { MemoryStorageDriver } from "@duraxis/storage-memory";
|
|
18
|
+
|
|
19
|
+
const storage = new MemoryStorageDriver();
|
|
20
|
+
await storage.put("example", new TextEncoder().encode("value"), {
|
|
21
|
+
condition: { type: "if-absent" },
|
|
22
|
+
});
|
|
23
|
+
const object = await storage.get("example");
|
|
24
|
+
console.log(object?.version);
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
A API pública é `MemoryStorageDriver`, que implementa leitura, escrita e remoção
|
|
28
|
+
condicionais, listagem e métricas. Ela pode ser passada diretamente a `DuraxisDatabase` ou
|
|
29
|
+
`DuraxisModule.forRoot`.
|
|
30
|
+
|
|
31
|
+
Não há persistência entre processos nem coordenação distribuída. Requer Node.js 22.12+ e é
|
|
32
|
+
distribuído em ESM, CommonJS e TypeScript.
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
let _duraxis_storage = require("@duraxis/storage");
|
|
3
|
+
// src/memory-storage.driver.ts
|
|
4
|
+
var MemoryStorageDriver = class {
|
|
5
|
+
entries = /* @__PURE__ */ new Map();
|
|
6
|
+
versionCounter = 0n;
|
|
7
|
+
metrics = {
|
|
8
|
+
reads: 0,
|
|
9
|
+
writes: 0,
|
|
10
|
+
deletes: 0,
|
|
11
|
+
lists: 0,
|
|
12
|
+
bytesRead: 0,
|
|
13
|
+
bytesWritten: 0,
|
|
14
|
+
synchronizationWaitMs: 0
|
|
15
|
+
};
|
|
16
|
+
async get(key) {
|
|
17
|
+
(0, _duraxis_storage.assertStorageKey)(key);
|
|
18
|
+
this.metrics.reads++;
|
|
19
|
+
const entry = this.entries.get(key);
|
|
20
|
+
if (entry) this.metrics.bytesRead += entry.data.byteLength;
|
|
21
|
+
return !entry ? null : {
|
|
22
|
+
data: new Uint8Array(entry.data),
|
|
23
|
+
version: entry.version
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
async put(key, data, options) {
|
|
27
|
+
(0, _duraxis_storage.assertStorageKey)(key);
|
|
28
|
+
if (!(data instanceof Uint8Array)) throw new TypeError("Storage data must be a Uint8Array");
|
|
29
|
+
this.metrics.writes++;
|
|
30
|
+
this.metrics.bytesWritten += data.byteLength;
|
|
31
|
+
const current = this.entries.get(key);
|
|
32
|
+
switch (options.condition.type) {
|
|
33
|
+
case "if-absent":
|
|
34
|
+
if (current) return {
|
|
35
|
+
success: false,
|
|
36
|
+
reason: "conflict"
|
|
37
|
+
};
|
|
38
|
+
break;
|
|
39
|
+
case "if-version": if (!current || current.version != options.condition.version) return {
|
|
40
|
+
success: false,
|
|
41
|
+
reason: "conflict"
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
const version = this.nextVersion();
|
|
45
|
+
this.entries.set(key, {
|
|
46
|
+
data: new Uint8Array(data),
|
|
47
|
+
version,
|
|
48
|
+
createdAt: Date.now()
|
|
49
|
+
});
|
|
50
|
+
return {
|
|
51
|
+
success: true,
|
|
52
|
+
version
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
async delete(key, options) {
|
|
56
|
+
(0, _duraxis_storage.assertStorageKey)(key);
|
|
57
|
+
this.metrics.deletes++;
|
|
58
|
+
const current = this.entries.get(key);
|
|
59
|
+
switch (options.condition.type) {
|
|
60
|
+
case "if-absent": return current ? {
|
|
61
|
+
success: false,
|
|
62
|
+
reason: "conflict"
|
|
63
|
+
} : { success: true };
|
|
64
|
+
case "if-version":
|
|
65
|
+
if (!current || current.version != options.condition.version) return {
|
|
66
|
+
success: false,
|
|
67
|
+
reason: "conflict"
|
|
68
|
+
};
|
|
69
|
+
this.entries.delete(key);
|
|
70
|
+
return { success: true };
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
async list(prefix) {
|
|
74
|
+
if (typeof prefix != "string" || prefix.includes("\0")) throw new TypeError("Invalid storage prefix");
|
|
75
|
+
this.metrics.lists++;
|
|
76
|
+
const results = [];
|
|
77
|
+
for (const [key, entry] of this.entries) {
|
|
78
|
+
if (!key.startsWith(prefix)) continue;
|
|
79
|
+
results.push({
|
|
80
|
+
key,
|
|
81
|
+
version: entry.version,
|
|
82
|
+
createdAt: entry.createdAt
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
results.sort((a, b) => a.key.localeCompare(b.key));
|
|
86
|
+
return results;
|
|
87
|
+
}
|
|
88
|
+
getMetrics() {
|
|
89
|
+
return { ...this.metrics };
|
|
90
|
+
}
|
|
91
|
+
nextVersion() {
|
|
92
|
+
this.versionCounter += 1n;
|
|
93
|
+
return this.versionCounter.toString();
|
|
94
|
+
}
|
|
95
|
+
};
|
|
96
|
+
exports.MemoryStorageDriver = MemoryStorageDriver;
|
|
97
|
+
|
|
98
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../src/memory-storage.driver.ts"],"sourcesContent":["import {\n assertStorageKey,\n type StorageDriver,\n type StorageObject,\n type StorageObjectInfo,\n type WriteOptions,\n type WriteResult,\n type DeleteOptions,\n type DeleteResult,\n type StorageDriverMetrics,\n} from \"@duraxis/storage\";\n\ninterface MemoryEntry {\n readonly data: Uint8Array;\n readonly version: string;\n readonly createdAt: number;\n}\n\nexport class MemoryStorageDriver implements StorageDriver {\n private readonly entries = new Map<string, MemoryEntry>();\n private versionCounter = 0n;\n\n private readonly metrics: StorageDriverMetrics = {\n reads: 0,\n writes: 0,\n deletes: 0,\n lists: 0,\n bytesRead: 0,\n bytesWritten: 0,\n synchronizationWaitMs: 0,\n };\n\n public async get(key: string): Promise<StorageObject | null> {\n assertStorageKey(key);\n\n (this.metrics as { reads: number }).reads++;\n\n const entry = this.entries.get(key);\n\n if (entry) (this.metrics as { bytesRead: number }).bytesRead += entry.data.byteLength;\n\n return !entry\n ? null\n : {\n data: new Uint8Array(entry.data),\n version: entry.version,\n };\n }\n\n public async put(key: string, data: Uint8Array, options: WriteOptions): Promise<WriteResult> {\n assertStorageKey(key);\n\n if (!(data instanceof Uint8Array)) throw new TypeError(\"Storage data must be a Uint8Array\");\n\n (this.metrics as { writes: number; bytesWritten: number }).writes++;\n (this.metrics as { bytesWritten: number }).bytesWritten += data.byteLength;\n\n const current = this.entries.get(key);\n\n switch (options.condition.type) {\n case \"if-absent\": {\n if (current)\n return {\n success: false,\n reason: \"conflict\",\n };\n\n break;\n }\n\n case \"if-version\": {\n if (!current || current.version != options.condition.version)\n return {\n success: false,\n reason: \"conflict\",\n };\n\n break;\n }\n }\n\n const version = this.nextVersion();\n\n this.entries.set(key, {\n data: new Uint8Array(data),\n version,\n createdAt: Date.now(),\n });\n\n return {\n success: true,\n version,\n };\n }\n\n public async delete(key: string, options: DeleteOptions): Promise<DeleteResult> {\n assertStorageKey(key);\n\n (this.metrics as { deletes: number }).deletes++;\n\n const current = this.entries.get(key);\n\n switch (options.condition.type) {\n case \"if-absent\":\n return current\n ? {\n success: false,\n reason: \"conflict\",\n }\n : { success: true };\n\n case \"if-version\": {\n if (!current || current.version != options.condition.version)\n return {\n success: false,\n reason: \"conflict\",\n };\n\n this.entries.delete(key);\n\n return { success: true };\n }\n }\n }\n\n public async list(prefix: string): Promise<readonly StorageObjectInfo[]> {\n if (typeof prefix != \"string\" || prefix.includes(\"\\0\"))\n throw new TypeError(\"Invalid storage prefix\");\n\n (this.metrics as { lists: number }).lists++;\n\n const results: StorageObjectInfo[] = [];\n\n for (const [key, entry] of this.entries) {\n if (!key.startsWith(prefix)) continue;\n\n results.push({\n key,\n version: entry.version,\n createdAt: entry.createdAt,\n });\n }\n\n results.sort((a, b) => a.key.localeCompare(b.key));\n\n return results;\n }\n\n public getMetrics(): Readonly<StorageDriverMetrics> {\n return { ...this.metrics };\n }\n\n private nextVersion(): string {\n this.versionCounter += 1n;\n return this.versionCounter.toString();\n }\n}\n"],"mappings":";;;AAkBA,IAAa,sBAAb,MAA0D;CACxD,0BAA2B,IAAI,IAAyB;CACxD,iBAAyB;CAEzB,UAAiD;EAC/C,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO;EACP,WAAW;EACX,cAAc;EACd,uBAAuB;CACzB;CAEA,MAAa,IAAI,KAA4C;EAC3D,CAAA,GAAA,iBAAA,iBAAA,CAAiB,GAAG;EAEpB,KAAM,QAA8B;EAEpC,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;EAElC,IAAI,OAAO,KAAM,QAAkC,aAAa,MAAM,KAAK;EAE3E,OAAO,CAAC,QACJ,OACA;GACE,MAAM,IAAI,WAAW,MAAM,IAAI;GAC/B,SAAS,MAAM;EACjB;CACN;CAEA,MAAa,IAAI,KAAa,MAAkB,SAA6C;EAC3F,CAAA,GAAA,iBAAA,iBAAA,CAAiB,GAAG;EAEpB,IAAI,EAAE,gBAAgB,aAAa,MAAM,IAAI,UAAU,mCAAmC;EAE1F,KAAM,QAAqD;EAC3D,KAAM,QAAqC,gBAAgB,KAAK;EAEhE,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,QAAQ,QAAQ,UAAU,MAA1B;GACE,KAAK;IACH,IAAI,SACF,OAAO;KACL,SAAS;KACT,QAAQ;IACV;IAEF;GAGF,KAAK,cACH,IAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,UAAU,SACnD,OAAO;IACL,SAAS;IACT,QAAQ;GACV;EAIN;EAEA,MAAM,UAAU,KAAK,YAAY;EAEjC,KAAK,QAAQ,IAAI,KAAK;GACpB,MAAM,IAAI,WAAW,IAAI;GACzB;GACA,WAAW,KAAK,IAAI;EACtB,CAAC;EAED,OAAO;GACL,SAAS;GACT;EACF;CACF;CAEA,MAAa,OAAO,KAAa,SAA+C;EAC9E,CAAA,GAAA,iBAAA,iBAAA,CAAiB,GAAG;EAEpB,KAAM,QAAgC;EAEtC,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,QAAQ,QAAQ,UAAU,MAA1B;GACE,KAAK,aACH,OAAO,UACH;IACE,SAAS;IACT,QAAQ;GACV,IACA,EAAE,SAAS,KAAK;GAEtB,KAAK;IACH,IAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,UAAU,SACnD,OAAO;KACL,SAAS;KACT,QAAQ;IACV;IAEF,KAAK,QAAQ,OAAO,GAAG;IAEvB,OAAO,EAAE,SAAS,KAAK;EAE3B;CACF;CAEA,MAAa,KAAK,QAAuD;EACvE,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,IAAI,GACnD,MAAM,IAAI,UAAU,wBAAwB;EAE9C,KAAM,QAA8B;EAEpC,MAAM,UAA+B,CAAC;EAEtC,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,SAAS;GACvC,IAAI,CAAC,IAAI,WAAW,MAAM,GAAG;GAE7B,QAAQ,KAAK;IACX;IACA,SAAS,MAAM;IACf,WAAW,MAAM;GACnB,CAAC;EACH;EAEA,QAAQ,MAAM,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC;EAEjD,OAAO;CACT;CAEA,aAAoD;EAClD,OAAO,EAAE,GAAG,KAAK,QAAQ;CAC3B;CAEA,cAA8B;EAC5B,KAAK,kBAAkB;EACvB,OAAO,KAAK,eAAe,SAAS;CACtC;AACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { MemoryStorageDriver } from "./memory-storage.driver.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { assertStorageKey } from "@duraxis/storage";
|
|
2
|
+
// src/memory-storage.driver.ts
|
|
3
|
+
var MemoryStorageDriver = class {
|
|
4
|
+
entries = /* @__PURE__ */ new Map();
|
|
5
|
+
versionCounter = 0n;
|
|
6
|
+
metrics = {
|
|
7
|
+
reads: 0,
|
|
8
|
+
writes: 0,
|
|
9
|
+
deletes: 0,
|
|
10
|
+
lists: 0,
|
|
11
|
+
bytesRead: 0,
|
|
12
|
+
bytesWritten: 0,
|
|
13
|
+
synchronizationWaitMs: 0
|
|
14
|
+
};
|
|
15
|
+
async get(key) {
|
|
16
|
+
assertStorageKey(key);
|
|
17
|
+
this.metrics.reads++;
|
|
18
|
+
const entry = this.entries.get(key);
|
|
19
|
+
if (entry) this.metrics.bytesRead += entry.data.byteLength;
|
|
20
|
+
return !entry ? null : {
|
|
21
|
+
data: new Uint8Array(entry.data),
|
|
22
|
+
version: entry.version
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
async put(key, data, options) {
|
|
26
|
+
assertStorageKey(key);
|
|
27
|
+
if (!(data instanceof Uint8Array)) throw new TypeError("Storage data must be a Uint8Array");
|
|
28
|
+
this.metrics.writes++;
|
|
29
|
+
this.metrics.bytesWritten += data.byteLength;
|
|
30
|
+
const current = this.entries.get(key);
|
|
31
|
+
switch (options.condition.type) {
|
|
32
|
+
case "if-absent":
|
|
33
|
+
if (current) return {
|
|
34
|
+
success: false,
|
|
35
|
+
reason: "conflict"
|
|
36
|
+
};
|
|
37
|
+
break;
|
|
38
|
+
case "if-version": if (!current || current.version != options.condition.version) return {
|
|
39
|
+
success: false,
|
|
40
|
+
reason: "conflict"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
const version = this.nextVersion();
|
|
44
|
+
this.entries.set(key, {
|
|
45
|
+
data: new Uint8Array(data),
|
|
46
|
+
version,
|
|
47
|
+
createdAt: Date.now()
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
version
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
async delete(key, options) {
|
|
55
|
+
assertStorageKey(key);
|
|
56
|
+
this.metrics.deletes++;
|
|
57
|
+
const current = this.entries.get(key);
|
|
58
|
+
switch (options.condition.type) {
|
|
59
|
+
case "if-absent": return current ? {
|
|
60
|
+
success: false,
|
|
61
|
+
reason: "conflict"
|
|
62
|
+
} : { success: true };
|
|
63
|
+
case "if-version":
|
|
64
|
+
if (!current || current.version != options.condition.version) return {
|
|
65
|
+
success: false,
|
|
66
|
+
reason: "conflict"
|
|
67
|
+
};
|
|
68
|
+
this.entries.delete(key);
|
|
69
|
+
return { success: true };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async list(prefix) {
|
|
73
|
+
if (typeof prefix != "string" || prefix.includes("\0")) throw new TypeError("Invalid storage prefix");
|
|
74
|
+
this.metrics.lists++;
|
|
75
|
+
const results = [];
|
|
76
|
+
for (const [key, entry] of this.entries) {
|
|
77
|
+
if (!key.startsWith(prefix)) continue;
|
|
78
|
+
results.push({
|
|
79
|
+
key,
|
|
80
|
+
version: entry.version,
|
|
81
|
+
createdAt: entry.createdAt
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
results.sort((a, b) => a.key.localeCompare(b.key));
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
87
|
+
getMetrics() {
|
|
88
|
+
return { ...this.metrics };
|
|
89
|
+
}
|
|
90
|
+
nextVersion() {
|
|
91
|
+
this.versionCounter += 1n;
|
|
92
|
+
return this.versionCounter.toString();
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
export { MemoryStorageDriver };
|
|
96
|
+
|
|
97
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/memory-storage.driver.ts"],"sourcesContent":["import {\n assertStorageKey,\n type StorageDriver,\n type StorageObject,\n type StorageObjectInfo,\n type WriteOptions,\n type WriteResult,\n type DeleteOptions,\n type DeleteResult,\n type StorageDriverMetrics,\n} from \"@duraxis/storage\";\n\ninterface MemoryEntry {\n readonly data: Uint8Array;\n readonly version: string;\n readonly createdAt: number;\n}\n\nexport class MemoryStorageDriver implements StorageDriver {\n private readonly entries = new Map<string, MemoryEntry>();\n private versionCounter = 0n;\n\n private readonly metrics: StorageDriverMetrics = {\n reads: 0,\n writes: 0,\n deletes: 0,\n lists: 0,\n bytesRead: 0,\n bytesWritten: 0,\n synchronizationWaitMs: 0,\n };\n\n public async get(key: string): Promise<StorageObject | null> {\n assertStorageKey(key);\n\n (this.metrics as { reads: number }).reads++;\n\n const entry = this.entries.get(key);\n\n if (entry) (this.metrics as { bytesRead: number }).bytesRead += entry.data.byteLength;\n\n return !entry\n ? null\n : {\n data: new Uint8Array(entry.data),\n version: entry.version,\n };\n }\n\n public async put(key: string, data: Uint8Array, options: WriteOptions): Promise<WriteResult> {\n assertStorageKey(key);\n\n if (!(data instanceof Uint8Array)) throw new TypeError(\"Storage data must be a Uint8Array\");\n\n (this.metrics as { writes: number; bytesWritten: number }).writes++;\n (this.metrics as { bytesWritten: number }).bytesWritten += data.byteLength;\n\n const current = this.entries.get(key);\n\n switch (options.condition.type) {\n case \"if-absent\": {\n if (current)\n return {\n success: false,\n reason: \"conflict\",\n };\n\n break;\n }\n\n case \"if-version\": {\n if (!current || current.version != options.condition.version)\n return {\n success: false,\n reason: \"conflict\",\n };\n\n break;\n }\n }\n\n const version = this.nextVersion();\n\n this.entries.set(key, {\n data: new Uint8Array(data),\n version,\n createdAt: Date.now(),\n });\n\n return {\n success: true,\n version,\n };\n }\n\n public async delete(key: string, options: DeleteOptions): Promise<DeleteResult> {\n assertStorageKey(key);\n\n (this.metrics as { deletes: number }).deletes++;\n\n const current = this.entries.get(key);\n\n switch (options.condition.type) {\n case \"if-absent\":\n return current\n ? {\n success: false,\n reason: \"conflict\",\n }\n : { success: true };\n\n case \"if-version\": {\n if (!current || current.version != options.condition.version)\n return {\n success: false,\n reason: \"conflict\",\n };\n\n this.entries.delete(key);\n\n return { success: true };\n }\n }\n }\n\n public async list(prefix: string): Promise<readonly StorageObjectInfo[]> {\n if (typeof prefix != \"string\" || prefix.includes(\"\\0\"))\n throw new TypeError(\"Invalid storage prefix\");\n\n (this.metrics as { lists: number }).lists++;\n\n const results: StorageObjectInfo[] = [];\n\n for (const [key, entry] of this.entries) {\n if (!key.startsWith(prefix)) continue;\n\n results.push({\n key,\n version: entry.version,\n createdAt: entry.createdAt,\n });\n }\n\n results.sort((a, b) => a.key.localeCompare(b.key));\n\n return results;\n }\n\n public getMetrics(): Readonly<StorageDriverMetrics> {\n return { ...this.metrics };\n }\n\n private nextVersion(): string {\n this.versionCounter += 1n;\n return this.versionCounter.toString();\n }\n}\n"],"mappings":";;AAkBA,IAAa,sBAAb,MAA0D;CACxD,0BAA2B,IAAI,IAAyB;CACxD,iBAAyB;CAEzB,UAAiD;EAC/C,OAAO;EACP,QAAQ;EACR,SAAS;EACT,OAAO;EACP,WAAW;EACX,cAAc;EACd,uBAAuB;CACzB;CAEA,MAAa,IAAI,KAA4C;EAC3D,iBAAiB,GAAG;EAEpB,KAAM,QAA8B;EAEpC,MAAM,QAAQ,KAAK,QAAQ,IAAI,GAAG;EAElC,IAAI,OAAO,KAAM,QAAkC,aAAa,MAAM,KAAK;EAE3E,OAAO,CAAC,QACJ,OACA;GACE,MAAM,IAAI,WAAW,MAAM,IAAI;GAC/B,SAAS,MAAM;EACjB;CACN;CAEA,MAAa,IAAI,KAAa,MAAkB,SAA6C;EAC3F,iBAAiB,GAAG;EAEpB,IAAI,EAAE,gBAAgB,aAAa,MAAM,IAAI,UAAU,mCAAmC;EAE1F,KAAM,QAAqD;EAC3D,KAAM,QAAqC,gBAAgB,KAAK;EAEhE,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,QAAQ,QAAQ,UAAU,MAA1B;GACE,KAAK;IACH,IAAI,SACF,OAAO;KACL,SAAS;KACT,QAAQ;IACV;IAEF;GAGF,KAAK,cACH,IAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,UAAU,SACnD,OAAO;IACL,SAAS;IACT,QAAQ;GACV;EAIN;EAEA,MAAM,UAAU,KAAK,YAAY;EAEjC,KAAK,QAAQ,IAAI,KAAK;GACpB,MAAM,IAAI,WAAW,IAAI;GACzB;GACA,WAAW,KAAK,IAAI;EACtB,CAAC;EAED,OAAO;GACL,SAAS;GACT;EACF;CACF;CAEA,MAAa,OAAO,KAAa,SAA+C;EAC9E,iBAAiB,GAAG;EAEpB,KAAM,QAAgC;EAEtC,MAAM,UAAU,KAAK,QAAQ,IAAI,GAAG;EAEpC,QAAQ,QAAQ,UAAU,MAA1B;GACE,KAAK,aACH,OAAO,UACH;IACE,SAAS;IACT,QAAQ;GACV,IACA,EAAE,SAAS,KAAK;GAEtB,KAAK;IACH,IAAI,CAAC,WAAW,QAAQ,WAAW,QAAQ,UAAU,SACnD,OAAO;KACL,SAAS;KACT,QAAQ;IACV;IAEF,KAAK,QAAQ,OAAO,GAAG;IAEvB,OAAO,EAAE,SAAS,KAAK;EAE3B;CACF;CAEA,MAAa,KAAK,QAAuD;EACvE,IAAI,OAAO,UAAU,YAAY,OAAO,SAAS,IAAI,GACnD,MAAM,IAAI,UAAU,wBAAwB;EAE9C,KAAM,QAA8B;EAEpC,MAAM,UAA+B,CAAC;EAEtC,KAAK,MAAM,CAAC,KAAK,UAAU,KAAK,SAAS;GACvC,IAAI,CAAC,IAAI,WAAW,MAAM,GAAG;GAE7B,QAAQ,KAAK;IACX;IACA,SAAS,MAAM;IACf,WAAW,MAAM;GACnB,CAAC;EACH;EAEA,QAAQ,MAAM,GAAG,MAAM,EAAE,IAAI,cAAc,EAAE,GAAG,CAAC;EAEjD,OAAO;CACT;CAEA,aAAoD;EAClD,OAAO,EAAE,GAAG,KAAK,QAAQ;CAC3B;CAEA,cAA8B;EAC5B,KAAK,kBAAkB;EACvB,OAAO,KAAK,eAAe,SAAS;CACtC;AACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type StorageDriver, type StorageObject, type StorageObjectInfo, type WriteOptions, type WriteResult, type DeleteOptions, type DeleteResult, type StorageDriverMetrics } from "@duraxis/storage";
|
|
2
|
+
export declare class MemoryStorageDriver implements StorageDriver {
|
|
3
|
+
private readonly entries;
|
|
4
|
+
private versionCounter;
|
|
5
|
+
private readonly metrics;
|
|
6
|
+
get(key: string): Promise<StorageObject | null>;
|
|
7
|
+
put(key: string, data: Uint8Array, options: WriteOptions): Promise<WriteResult>;
|
|
8
|
+
delete(key: string, options: DeleteOptions): Promise<DeleteResult>;
|
|
9
|
+
list(prefix: string): Promise<readonly StorageObjectInfo[]>;
|
|
10
|
+
getMetrics(): Readonly<StorageDriverMetrics>;
|
|
11
|
+
private nextVersion;
|
|
12
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,61 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@duraxis/storage-memory",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "In-memory StorageDriver implementation for Duraxis development and tests.",
|
|
5
|
+
"license": "ISC",
|
|
6
|
+
"author": "João Paulo Dias <joaopdias.dev@gmail.com>",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"duraxis",
|
|
9
|
+
"database",
|
|
10
|
+
"storage",
|
|
11
|
+
"memory",
|
|
12
|
+
"typescript"
|
|
13
|
+
],
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "https://github.com/Joaopdiasventura/Duraxis.git",
|
|
17
|
+
"directory": "packages/storage-memory"
|
|
18
|
+
},
|
|
19
|
+
"homepage": "https://github.com/Joaopdiasventura/Duraxis/tree/main/packages/storage-memory#readme",
|
|
20
|
+
"bugs": {
|
|
21
|
+
"url": "https://github.com/Joaopdiasventura/Duraxis/issues"
|
|
22
|
+
},
|
|
23
|
+
"engines": {
|
|
24
|
+
"node": ">=22.12.0"
|
|
25
|
+
},
|
|
26
|
+
"publishConfig": {
|
|
27
|
+
"access": "public",
|
|
28
|
+
"registry": "https://registry.npmjs.org/"
|
|
29
|
+
},
|
|
30
|
+
"type": "module",
|
|
31
|
+
"main": "./dist/index.cjs",
|
|
32
|
+
"module": "./dist/index.js",
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/index.d.ts",
|
|
37
|
+
"import": "./dist/index.js",
|
|
38
|
+
"require": "./dist/index.cjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"files": [
|
|
42
|
+
"dist",
|
|
43
|
+
"README.md",
|
|
44
|
+
"LICENSE",
|
|
45
|
+
"CHANGELOG.md"
|
|
46
|
+
],
|
|
47
|
+
"sideEffects": false,
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@duraxis/storage": "0.1.0"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@duraxis/storage-testkit": "0.1.0"
|
|
53
|
+
},
|
|
54
|
+
"scripts": {
|
|
55
|
+
"build": "vite build && tsc -p tsconfig.build.json",
|
|
56
|
+
"dev": "vite build --watch",
|
|
57
|
+
"typecheck": "tsc --noEmit",
|
|
58
|
+
"test": "vitest run",
|
|
59
|
+
"test:watch": "vitest"
|
|
60
|
+
}
|
|
6
61
|
}
|