@fluixi/storage 0.1.0-alpha.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/LICENSE +21 -0
- package/README.md +30 -0
- package/dist/adapters/memory.cjs +46 -0
- package/dist/adapters/memory.d.ts +8 -0
- package/dist/adapters/memory.d.ts.map +1 -0
- package/dist/adapters/memory.js +26 -0
- package/dist/adapters/memory.mjs +25 -0
- package/dist/browser/document-cookie.cjs +101 -0
- package/dist/browser/document-cookie.d.ts +14 -0
- package/dist/browser/document-cookie.d.ts.map +1 -0
- package/dist/browser/document-cookie.js +53 -0
- package/dist/browser/document-cookie.mjs +80 -0
- package/dist/browser/index.cjs +209 -0
- package/dist/browser/index.d.ts +4 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +3 -0
- package/dist/browser/index.mjs +187 -0
- package/dist/browser/web-storage.cjs +150 -0
- package/dist/browser/web-storage.d.ts +6 -0
- package/dist/browser/web-storage.d.ts.map +1 -0
- package/dist/browser/web-storage.js +105 -0
- package/dist/browser/web-storage.mjs +127 -0
- package/dist/core/async-storage.cjs +583 -0
- package/dist/core/async-storage.d.ts +17 -0
- package/dist/core/async-storage.d.ts.map +1 -0
- package/dist/core/async-storage.js +275 -0
- package/dist/core/async-storage.mjs +560 -0
- package/dist/core/bus.cjs +52 -0
- package/dist/core/bus.d.ts +19 -0
- package/dist/core/bus.d.ts.map +1 -0
- package/dist/core/bus.js +31 -0
- package/dist/core/bus.mjs +31 -0
- package/dist/core/envelope.cjs +119 -0
- package/dist/core/envelope.d.ts +38 -0
- package/dist/core/envelope.d.ts.map +1 -0
- package/dist/core/envelope.js +83 -0
- package/dist/core/envelope.mjs +96 -0
- package/dist/core/errors.cjs +115 -0
- package/dist/core/errors.d.ts +109 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/errors.js +99 -0
- package/dist/core/errors.mjs +94 -0
- package/dist/core/storage.cjs +782 -0
- package/dist/core/storage.d.ts +63 -0
- package/dist/core/storage.d.ts.map +1 -0
- package/dist/core/storage.js +260 -0
- package/dist/core/storage.mjs +759 -0
- package/dist/core/types.cjs +18 -0
- package/dist/core/types.d.ts +239 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +1 -0
- package/dist/core/types.mjs +0 -0
- package/dist/encryption/base64.cjs +38 -0
- package/dist/encryption/base64.d.ts +4 -0
- package/dist/encryption/base64.d.ts.map +1 -0
- package/dist/encryption/base64.js +16 -0
- package/dist/encryption/base64.mjs +17 -0
- package/dist/encryption/keys.cjs +77 -0
- package/dist/encryption/keys.d.ts +14 -0
- package/dist/encryption/keys.d.ts.map +1 -0
- package/dist/encryption/keys.js +28 -0
- package/dist/encryption/keys.mjs +54 -0
- package/dist/encryption/seal.cjs +154 -0
- package/dist/encryption/seal.d.ts +24 -0
- package/dist/encryption/seal.d.ts.map +1 -0
- package/dist/encryption/seal.js +83 -0
- package/dist/encryption/seal.mjs +131 -0
- package/dist/encryption/types.cjs +18 -0
- package/dist/encryption/types.d.ts +50 -0
- package/dist/encryption/types.d.ts.map +1 -0
- package/dist/encryption/types.js +1 -0
- package/dist/encryption/types.mjs +0 -0
- package/dist/encryption/web-crypto.cjs +81 -0
- package/dist/encryption/web-crypto.d.ts +9 -0
- package/dist/encryption/web-crypto.d.ts.map +1 -0
- package/dist/encryption/web-crypto.js +45 -0
- package/dist/encryption/web-crypto.mjs +58 -0
- package/dist/index.cjs +870 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.mjs +848 -0
- package/dist/serialization/json.cjs +83 -0
- package/dist/serialization/json.d.ts +3 -0
- package/dist/serialization/json.d.ts.map +1 -0
- package/dist/serialization/json.js +51 -0
- package/dist/serialization/json.mjs +60 -0
- package/dist/serialization/serializer.cjs +28 -0
- package/dist/serialization/serializer.d.ts +4 -0
- package/dist/serialization/serializer.d.ts.map +1 -0
- package/dist/serialization/serializer.js +4 -0
- package/dist/serialization/serializer.mjs +7 -0
- package/dist/server/contracts.cjs +36 -0
- package/dist/server/contracts.d.ts +27 -0
- package/dist/server/contracts.d.ts.map +1 -0
- package/dist/server/contracts.js +16 -0
- package/dist/server/contracts.mjs +15 -0
- package/dist/server/cookie.cjs +126 -0
- package/dist/server/cookie.d.ts +21 -0
- package/dist/server/cookie.d.ts.map +1 -0
- package/dist/server/cookie.js +71 -0
- package/dist/server/cookie.mjs +105 -0
- package/dist/server/index.cjs +155 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.mjs +133 -0
- package/dist/server/request.cjs +46 -0
- package/dist/server/request.d.ts +7 -0
- package/dist/server/request.d.ts.map +1 -0
- package/dist/server/request.js +25 -0
- package/dist/server/request.mjs +25 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/dist/utils/cookie-names.cjs +38 -0
- package/dist/utils/cookie-names.d.ts +10 -0
- package/dist/utils/cookie-names.d.ts.map +1 -0
- package/dist/utils/cookie-names.js +15 -0
- package/dist/utils/cookie-names.mjs +17 -0
- package/dist/utils/copy.cjs +38 -0
- package/dist/utils/copy.d.ts +17 -0
- package/dist/utils/copy.d.ts.map +1 -0
- package/dist/utils/copy.js +15 -0
- package/dist/utils/copy.mjs +17 -0
- package/dist/utils/environment.cjs +28 -0
- package/dist/utils/environment.d.ts +3 -0
- package/dist/utils/environment.d.ts.map +1 -0
- package/dist/utils/environment.js +4 -0
- package/dist/utils/environment.mjs +7 -0
- package/dist/utils/keys.cjs +33 -0
- package/dist/utils/keys.d.ts +5 -0
- package/dist/utils/keys.d.ts.map +1 -0
- package/dist/utils/keys.js +10 -0
- package/dist/utils/keys.mjs +12 -0
- package/package.json +61 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
15
|
+
|
|
16
|
+
// src/core/types.ts
|
|
17
|
+
var types_exports = {};
|
|
18
|
+
module.exports = __toCommonJS(types_exports);
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import type { EncryptionOptions } from '../encryption/types.js';
|
|
2
|
+
/** The value types a typed storage holds, by key. */
|
|
3
|
+
export type StorageSchema = Record<string, unknown>;
|
|
4
|
+
/** The keys of a schema that can name a stored value. */
|
|
5
|
+
export type StorageKey<S> = Extract<keyof S, string>;
|
|
6
|
+
/**
|
|
7
|
+
* Where data lives and for how long. A lifecycle, not an implementation: `local` survives a
|
|
8
|
+
* browser restart, `session` the tab, `request` one server request, `memory` the process or
|
|
9
|
+
* page, `cookie` travels with each request, `persistent` a server-side store.
|
|
10
|
+
*/
|
|
11
|
+
export type StorageScope = 'local' | 'session' | 'request' | 'memory' | 'cookie' | 'persistent';
|
|
12
|
+
/** What an adapter can actually guarantee. Nothing it cannot. */
|
|
13
|
+
export interface StorageCapabilities {
|
|
14
|
+
/** Reads and writes return at once. */
|
|
15
|
+
synchronous: boolean;
|
|
16
|
+
/** Data outlives the page or process that wrote it. */
|
|
17
|
+
persistent: boolean;
|
|
18
|
+
/** The adapter reports changes made elsewhere (another tab, another writer). */
|
|
19
|
+
reactive: boolean;
|
|
20
|
+
/** Data is shared beyond this execution context (tabs, requests, devices). */
|
|
21
|
+
crossContext: boolean;
|
|
22
|
+
/** The adapter expires entries itself. The storage expires them either way. */
|
|
23
|
+
expiration: boolean;
|
|
24
|
+
/** Several writes can be applied together or not at all. */
|
|
25
|
+
transactions: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** A change an adapter observed from outside this storage instance. `key: null` is a clear. */
|
|
28
|
+
export interface AdapterChange {
|
|
29
|
+
key: string | null;
|
|
30
|
+
value: string | null;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A synchronous backend. It stores strings; serialization, namespaces and expiry belong to the
|
|
34
|
+
* storage around it, so an adapter stays small and every adapter gets them.
|
|
35
|
+
*/
|
|
36
|
+
/** What the storage tells an adapter about a write, for backends that can act on it. */
|
|
37
|
+
export interface AdapterWriteOptions {
|
|
38
|
+
/** Epoch milliseconds when the entry expires. A cookie adapter makes the cookie last as long. */
|
|
39
|
+
expiresAt?: number;
|
|
40
|
+
}
|
|
41
|
+
export interface StorageAdapter {
|
|
42
|
+
readonly name: string;
|
|
43
|
+
readonly scope: StorageScope;
|
|
44
|
+
readonly capabilities: StorageCapabilities;
|
|
45
|
+
get(key: string): string | null;
|
|
46
|
+
set(key: string, value: string, options?: AdapterWriteOptions): void;
|
|
47
|
+
remove(key: string): void;
|
|
48
|
+
has(key: string): boolean;
|
|
49
|
+
keys(): string[];
|
|
50
|
+
clear(): void;
|
|
51
|
+
/** Changes made outside this instance, when the backend can report them. */
|
|
52
|
+
subscribe?(listener: (change: AdapterChange) => void): () => void;
|
|
53
|
+
}
|
|
54
|
+
/** A stored value and what is known about it. */
|
|
55
|
+
export interface StorageEntry<T> {
|
|
56
|
+
value: T;
|
|
57
|
+
/** Epoch milliseconds when it was written; 0 when the value was written without metadata. */
|
|
58
|
+
createdAt: number;
|
|
59
|
+
/** Epoch milliseconds after which it reads as absent. */
|
|
60
|
+
expiresAt?: number;
|
|
61
|
+
/** The value's schema version, for migrations. */
|
|
62
|
+
version?: number;
|
|
63
|
+
/** Present when the value is stored encrypted. */
|
|
64
|
+
encrypted?: true;
|
|
65
|
+
}
|
|
66
|
+
export interface SetOptions {
|
|
67
|
+
/** Milliseconds until the entry expires. Checked on every read, so it survives reloads. */
|
|
68
|
+
ttl?: number;
|
|
69
|
+
/** The value's schema version. Defaults to the latest migration for the key, when any. */
|
|
70
|
+
version?: number;
|
|
71
|
+
}
|
|
72
|
+
export type StorageEventType = 'set' | 'remove' | 'clear' | 'expire';
|
|
73
|
+
export interface StorageEvent<S = StorageSchema> {
|
|
74
|
+
type: StorageEventType;
|
|
75
|
+
/** The key, without the namespace; null for a clear. */
|
|
76
|
+
key: StorageKey<S> | null;
|
|
77
|
+
/** The new value, for `set`. */
|
|
78
|
+
value?: unknown;
|
|
79
|
+
/** True when the change came from outside this instance (another tab). */
|
|
80
|
+
external: boolean;
|
|
81
|
+
}
|
|
82
|
+
export interface StorageSerializer {
|
|
83
|
+
serialize(value: unknown): string;
|
|
84
|
+
deserialize<T = unknown>(text: string): T;
|
|
85
|
+
}
|
|
86
|
+
/** Per key, the function that brings a value up to each version. */
|
|
87
|
+
export type StorageMigrations<S> = {
|
|
88
|
+
[K in StorageKey<S>]?: Record<number, (value: unknown) => unknown>;
|
|
89
|
+
};
|
|
90
|
+
export interface StorageOptions<S extends StorageSchema = StorageSchema> {
|
|
91
|
+
/** Where values live. Defaults to an in-memory adapter. */
|
|
92
|
+
adapter?: StorageAdapter;
|
|
93
|
+
/** Prefix for every key: `app` stores `theme` as `app:theme`. */
|
|
94
|
+
namespace?: string;
|
|
95
|
+
/** Defaults to the strict JSON serializer. */
|
|
96
|
+
serializer?: StorageSerializer;
|
|
97
|
+
migrations?: StorageMigrations<S>;
|
|
98
|
+
/** The clock for expiry; for tests. */
|
|
99
|
+
now?: () => number;
|
|
100
|
+
}
|
|
101
|
+
type Listener<S> = (event: StorageEvent<S>) => void;
|
|
102
|
+
/** A stored value with its key, as `entries` and `search` return it. */
|
|
103
|
+
export interface StoredItem<S extends StorageSchema, K extends StorageKey<S> = StorageKey<S>> {
|
|
104
|
+
key: K;
|
|
105
|
+
value: S[K];
|
|
106
|
+
entry: StorageEntry<S[K]>;
|
|
107
|
+
}
|
|
108
|
+
export interface StorageQuery<S extends StorageSchema> {
|
|
109
|
+
/** Keys starting with this. */
|
|
110
|
+
prefix?: string;
|
|
111
|
+
/** Keys matching a glob (`draft:*`, `user:?`) or a RegExp. */
|
|
112
|
+
match?: string | RegExp;
|
|
113
|
+
/** Keep the items this returns true for: by value, key or metadata. */
|
|
114
|
+
where?: (item: StoredItem<S>) => boolean;
|
|
115
|
+
/** At most this many, in key order. */
|
|
116
|
+
limit?: number;
|
|
117
|
+
}
|
|
118
|
+
/** What a storage holds, roughly: for quota decisions, not accounting. */
|
|
119
|
+
export interface StorageUsage {
|
|
120
|
+
keys: number;
|
|
121
|
+
/** UTF-16 code units of keys and stored text, times two: what browsers count against quota. */
|
|
122
|
+
bytes: number;
|
|
123
|
+
}
|
|
124
|
+
/** Plain data for export and import: key to value, with optional metadata. */
|
|
125
|
+
export type StorageSnapshot<S extends StorageSchema = StorageSchema> = {
|
|
126
|
+
[K in StorageKey<S>]?: StorageEntry<S[K]>;
|
|
127
|
+
};
|
|
128
|
+
/** One typed key/value API, whatever the adapter underneath. */
|
|
129
|
+
export interface TypedStorage<S extends StorageSchema = StorageSchema> {
|
|
130
|
+
/**
|
|
131
|
+
* The value, or null when absent or expired. With a schema the type follows the key; without
|
|
132
|
+
* one, name it: `storage.get<User>('user')`.
|
|
133
|
+
*/
|
|
134
|
+
get<T = never, K extends StorageKey<S> = StorageKey<S>>(key: K): ([T] extends [never] ? S[K] : T) | null;
|
|
135
|
+
/** The value with its metadata, or null when absent or expired. */
|
|
136
|
+
getEntry<T = never, K extends StorageKey<S> = StorageKey<S>>(key: K): StorageEntry<[T] extends [never] ? S[K] : T> | null;
|
|
137
|
+
set<K extends StorageKey<S>>(key: K, value: S[K], options?: SetOptions): void;
|
|
138
|
+
remove(key: StorageKey<S>): void;
|
|
139
|
+
/** True when a value is stored and not expired. */
|
|
140
|
+
has(key: StorageKey<S>): boolean;
|
|
141
|
+
/** The keys under this storage's namespace, without it. */
|
|
142
|
+
keys(): StorageKey<S>[];
|
|
143
|
+
/** Removes every key under this namespace (everything, without a namespace). */
|
|
144
|
+
clear(): void;
|
|
145
|
+
/** Every live item, in key order. Expired ones are removed on the way. */
|
|
146
|
+
entries(): StoredItem<S>[];
|
|
147
|
+
/** The live items a query selects, in key order. */
|
|
148
|
+
search(query: StorageQuery<S>): StoredItem<S>[];
|
|
149
|
+
/** How many live items there are. */
|
|
150
|
+
size(): number;
|
|
151
|
+
/** Removes every expired item now, rather than on its next read. Returns how many. */
|
|
152
|
+
prune(): number;
|
|
153
|
+
/** Keys and approximate bytes stored under this namespace. */
|
|
154
|
+
usage(): StorageUsage;
|
|
155
|
+
/** Reads, transforms and writes back one value; `fn` receives null when absent. Keeps the expiry. */
|
|
156
|
+
update<K extends StorageKey<S>>(key: K, fn: (current: S[K] | null) => S[K]): S[K];
|
|
157
|
+
/** The value, or the factory's result stored under the key when absent. */
|
|
158
|
+
getOrSet<K extends StorageKey<S>>(key: K, factory: () => S[K], options?: SetOptions): S[K];
|
|
159
|
+
/** Gives a stored value a new expiry, `ttl` from now. False when absent. */
|
|
160
|
+
touch(key: StorageKey<S>, ttl: number): boolean;
|
|
161
|
+
/** Every live item with its metadata, as plain data. */
|
|
162
|
+
snapshot(): StorageSnapshot<S>;
|
|
163
|
+
/** Writes items from a snapshot, keeping their metadata; existing keys are kept unless `overwrite`. */
|
|
164
|
+
restore(snapshot: StorageSnapshot<S>, options?: {
|
|
165
|
+
overwrite?: boolean;
|
|
166
|
+
}): number;
|
|
167
|
+
/** A storage whose keys live under `name` inside this one. */
|
|
168
|
+
namespace<S2 extends StorageSchema = StorageSchema>(name: string): TypedStorage<S2>;
|
|
169
|
+
/** Every change; returns the unsubscribe. */
|
|
170
|
+
subscribe(listener: Listener<S>): () => void;
|
|
171
|
+
/** Changes to one key; returns the unsubscribe. */
|
|
172
|
+
subscribe(key: StorageKey<S>, listener: Listener<S>): () => void;
|
|
173
|
+
readonly capabilities: StorageCapabilities;
|
|
174
|
+
readonly scope: StorageScope;
|
|
175
|
+
/** What this storage puts before every key in the adapter: `app:` for namespace `app`, else empty. */
|
|
176
|
+
readonly keyPrefix: string;
|
|
177
|
+
}
|
|
178
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
179
|
+
/** An adapter whose backend may answer later: IndexedDB, a remote store. Every sync adapter is one. */
|
|
180
|
+
export interface AsyncStorageAdapter {
|
|
181
|
+
readonly name: string;
|
|
182
|
+
readonly scope: StorageScope;
|
|
183
|
+
readonly capabilities: StorageCapabilities;
|
|
184
|
+
get(key: string): MaybePromise<string | null>;
|
|
185
|
+
set(key: string, value: string, options?: AdapterWriteOptions): MaybePromise<void>;
|
|
186
|
+
remove(key: string): MaybePromise<void>;
|
|
187
|
+
has(key: string): MaybePromise<boolean>;
|
|
188
|
+
keys(): MaybePromise<string[]>;
|
|
189
|
+
clear(): MaybePromise<void>;
|
|
190
|
+
subscribe?(listener: (change: AdapterChange) => void): () => void;
|
|
191
|
+
}
|
|
192
|
+
export interface AsyncSetOptions extends SetOptions {
|
|
193
|
+
/** Store this value encrypted. Needs `encryption` on the storage. Reads detect it on their own. */
|
|
194
|
+
encrypt?: boolean;
|
|
195
|
+
}
|
|
196
|
+
export interface AsyncStorageOptions<S extends StorageSchema = StorageSchema> extends Omit<StorageOptions<S>, 'adapter'> {
|
|
197
|
+
adapter?: StorageAdapter | AsyncStorageAdapter;
|
|
198
|
+
encryption?: EncryptionOptions;
|
|
199
|
+
}
|
|
200
|
+
/** The storage API with every operation awaited. Encryption lives here. */
|
|
201
|
+
export interface AsyncTypedStorage<S extends StorageSchema = StorageSchema> {
|
|
202
|
+
get<T = never, K extends StorageKey<S> = StorageKey<S>>(key: K): Promise<([T] extends [never] ? S[K] : T) | null>;
|
|
203
|
+
getEntry<T = never, K extends StorageKey<S> = StorageKey<S>>(key: K): Promise<StorageEntry<[T] extends [never] ? S[K] : T> | null>;
|
|
204
|
+
set<K extends StorageKey<S>>(key: K, value: S[K], options?: AsyncSetOptions): Promise<void>;
|
|
205
|
+
remove(key: StorageKey<S>): Promise<void>;
|
|
206
|
+
has(key: StorageKey<S>): Promise<boolean>;
|
|
207
|
+
keys(): Promise<StorageKey<S>[]>;
|
|
208
|
+
clear(): Promise<void>;
|
|
209
|
+
/** Every live item, decrypted, in key order. */
|
|
210
|
+
entries(): Promise<StoredItem<S>[]>;
|
|
211
|
+
search(query: StorageQuery<S>): Promise<StoredItem<S>[]>;
|
|
212
|
+
size(): Promise<number>;
|
|
213
|
+
/** Removes expired items without decrypting anything. */
|
|
214
|
+
prune(): Promise<number>;
|
|
215
|
+
usage(): Promise<StorageUsage>;
|
|
216
|
+
/** Keeps the expiry and the encryption state unless `options.encrypt` says otherwise. */
|
|
217
|
+
update<K extends StorageKey<S>>(key: K, fn: (current: S[K] | null) => MaybePromise<S[K]>, options?: {
|
|
218
|
+
encrypt?: boolean;
|
|
219
|
+
}): Promise<S[K]>;
|
|
220
|
+
getOrSet<K extends StorageKey<S>>(key: K, factory: () => MaybePromise<S[K]>, options?: AsyncSetOptions): Promise<S[K]>;
|
|
221
|
+
touch(key: StorageKey<S>, ttl: number): Promise<boolean>;
|
|
222
|
+
/** Decrypted values, each marked `encrypted` so `restore` encrypts it again. */
|
|
223
|
+
snapshot(): Promise<StorageSnapshot<S>>;
|
|
224
|
+
restore(snapshot: StorageSnapshot<S>, options?: {
|
|
225
|
+
overwrite?: boolean;
|
|
226
|
+
}): Promise<number>;
|
|
227
|
+
namespace<S2 extends StorageSchema = StorageSchema>(name: string): AsyncTypedStorage<S2>;
|
|
228
|
+
/** An external change to an encrypted entry arrives without `value`: decrypting is async. */
|
|
229
|
+
subscribe(listener: Listener<S>): () => void;
|
|
230
|
+
subscribe(key: StorageKey<S>, listener: Listener<S>): () => void;
|
|
231
|
+
readonly capabilities: StorageCapabilities;
|
|
232
|
+
readonly scope: StorageScope;
|
|
233
|
+
/** What this storage puts before every key in the adapter: `app:` for namespace `app`, else empty. */
|
|
234
|
+
readonly keyPrefix: string;
|
|
235
|
+
/** True when this storage can encrypt: `encryption` was configured. */
|
|
236
|
+
readonly encryption: boolean;
|
|
237
|
+
}
|
|
238
|
+
export {};
|
|
239
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
File without changes
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/encryption/base64.ts
|
|
21
|
+
var base64_exports = {};
|
|
22
|
+
__export(base64_exports, {
|
|
23
|
+
fromBase64: () => fromBase64,
|
|
24
|
+
toBase64: () => toBase64
|
|
25
|
+
});
|
|
26
|
+
module.exports = __toCommonJS(base64_exports);
|
|
27
|
+
function toBase64(bytes) {
|
|
28
|
+
let binary = "";
|
|
29
|
+
for (let i = 0; i < bytes.length; i += 32768) binary += String.fromCharCode(...bytes.subarray(i, i + 32768));
|
|
30
|
+
return btoa(binary);
|
|
31
|
+
}
|
|
32
|
+
function fromBase64(text) {
|
|
33
|
+
if (text.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(text)) throw new TypeError("Not base64.");
|
|
34
|
+
const binary = atob(text);
|
|
35
|
+
const out = new Uint8Array(binary.length);
|
|
36
|
+
for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);
|
|
37
|
+
return out;
|
|
38
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base64.d.ts","sourceRoot":"","sources":["../../src/encryption/base64.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAIlD;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,CAMnD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function toBase64(bytes) {
|
|
2
|
+
let binary = '';
|
|
3
|
+
for (let i = 0; i < bytes.length; i += 0x8000)
|
|
4
|
+
binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
5
|
+
return btoa(binary);
|
|
6
|
+
}
|
|
7
|
+
/** Throws a TypeError on anything that is not canonical base64. */
|
|
8
|
+
export function fromBase64(text) {
|
|
9
|
+
if (text.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(text))
|
|
10
|
+
throw new TypeError('Not base64.');
|
|
11
|
+
const binary = atob(text);
|
|
12
|
+
const out = new Uint8Array(binary.length);
|
|
13
|
+
for (let i = 0; i < binary.length; i++)
|
|
14
|
+
out[i] = binary.charCodeAt(i);
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
// src/encryption/base64.ts
|
|
2
|
+
function toBase64(bytes) {
|
|
3
|
+
let binary = "";
|
|
4
|
+
for (let i = 0; i < bytes.length; i += 32768) binary += String.fromCharCode(...bytes.subarray(i, i + 32768));
|
|
5
|
+
return btoa(binary);
|
|
6
|
+
}
|
|
7
|
+
function fromBase64(text) {
|
|
8
|
+
if (text.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(text)) throw new TypeError("Not base64.");
|
|
9
|
+
const binary = atob(text);
|
|
10
|
+
const out = new Uint8Array(binary.length);
|
|
11
|
+
for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);
|
|
12
|
+
return out;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
fromBase64,
|
|
16
|
+
toBase64
|
|
17
|
+
};
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/encryption/keys.ts
|
|
21
|
+
var keys_exports = {};
|
|
22
|
+
__export(keys_exports, {
|
|
23
|
+
generateEncryptionKey: () => generateEncryptionKey,
|
|
24
|
+
importEncryptionKey: () => importEncryptionKey,
|
|
25
|
+
staticKeyProvider: () => staticKeyProvider
|
|
26
|
+
});
|
|
27
|
+
module.exports = __toCommonJS(keys_exports);
|
|
28
|
+
|
|
29
|
+
// src/core/errors.ts
|
|
30
|
+
var StorageError = class extends Error {
|
|
31
|
+
constructor(code, message, options = {}) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = new.target.name;
|
|
34
|
+
this.code = code;
|
|
35
|
+
this.key = options.key;
|
|
36
|
+
if (options.cause !== void 0) this.cause = options.cause;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var StorageEncryptionError = class extends StorageError {
|
|
40
|
+
};
|
|
41
|
+
var StorageEncryptionUnavailableError = class extends StorageEncryptionError {
|
|
42
|
+
constructor(message, options = {}) {
|
|
43
|
+
super("encryption-unavailable", message, options);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
// src/encryption/base64.ts
|
|
48
|
+
function fromBase64(text) {
|
|
49
|
+
if (text.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(text)) throw new TypeError("Not base64.");
|
|
50
|
+
const binary = atob(text);
|
|
51
|
+
const out = new Uint8Array(binary.length);
|
|
52
|
+
for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);
|
|
53
|
+
return out;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// src/encryption/keys.ts
|
|
57
|
+
var subtleOf = (crypto) => {
|
|
58
|
+
const subtle = (crypto ?? globalThis.crypto)?.subtle;
|
|
59
|
+
if (!subtle) throw new StorageEncryptionUnavailableError("Web Crypto is not available in this runtime.");
|
|
60
|
+
return subtle;
|
|
61
|
+
};
|
|
62
|
+
async function generateEncryptionKey(options = {}) {
|
|
63
|
+
return subtleOf(options.crypto).generateKey({ name: "AES-GCM", length: 256 }, options.extractable ?? false, ["encrypt", "decrypt"]);
|
|
64
|
+
}
|
|
65
|
+
async function importEncryptionKey(raw, options = {}) {
|
|
66
|
+
const bytes = typeof raw === "string" ? fromBase64(raw) : raw;
|
|
67
|
+
if (bytes.length !== 32) throw new TypeError(`An AES-256 key is 32 bytes, got ${bytes.length}.`);
|
|
68
|
+
return subtleOf(options.crypto).importKey("raw", bytes, { name: "AES-GCM" }, options.extractable ?? false, ["encrypt", "decrypt"]);
|
|
69
|
+
}
|
|
70
|
+
function staticKeyProvider(key, id) {
|
|
71
|
+
return {
|
|
72
|
+
async getKey() {
|
|
73
|
+
const resolved = await key;
|
|
74
|
+
return id === void 0 ? resolved : { key: resolved, id };
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { EncryptionKeyProvider } from './types.js';
|
|
2
|
+
/** A new AES-256-GCM key. Not extractable unless asked, so script cannot read it back. */
|
|
3
|
+
export declare function generateEncryptionKey(options?: {
|
|
4
|
+
extractable?: boolean;
|
|
5
|
+
crypto?: Crypto;
|
|
6
|
+
}): Promise<CryptoKey>;
|
|
7
|
+
/** An AES-256-GCM key from 32 raw bytes, or their base64. */
|
|
8
|
+
export declare function importEncryptionKey(raw: Uint8Array | string, options?: {
|
|
9
|
+
extractable?: boolean;
|
|
10
|
+
crypto?: Crypto;
|
|
11
|
+
}): Promise<CryptoKey>;
|
|
12
|
+
/** One key for every entry. Give it an id to rotate later: entries keep the id they were written with. */
|
|
13
|
+
export declare function staticKeyProvider(key: CryptoKey | Promise<CryptoKey>, id?: string): EncryptionKeyProvider;
|
|
14
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/encryption/keys.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAQvE,0FAA0F;AAC1F,wBAAsB,qBAAqB,CAAC,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAExH;AAED,6DAA6D;AAC7D,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,UAAU,GAAG,MAAM,EAAE,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,SAAS,CAAC,CAIhJ;AAED,0GAA0G;AAC1G,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,qBAAqB,CAOzG"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { StorageEncryptionUnavailableError } from '../core/errors.js';
|
|
2
|
+
import { fromBase64 } from './base64.js';
|
|
3
|
+
const subtleOf = (crypto) => {
|
|
4
|
+
const subtle = (crypto ?? globalThis.crypto)?.subtle;
|
|
5
|
+
if (!subtle)
|
|
6
|
+
throw new StorageEncryptionUnavailableError('Web Crypto is not available in this runtime.');
|
|
7
|
+
return subtle;
|
|
8
|
+
};
|
|
9
|
+
/** A new AES-256-GCM key. Not extractable unless asked, so script cannot read it back. */
|
|
10
|
+
export async function generateEncryptionKey(options = {}) {
|
|
11
|
+
return subtleOf(options.crypto).generateKey({ name: 'AES-GCM', length: 256 }, options.extractable ?? false, ['encrypt', 'decrypt']);
|
|
12
|
+
}
|
|
13
|
+
/** An AES-256-GCM key from 32 raw bytes, or their base64. */
|
|
14
|
+
export async function importEncryptionKey(raw, options = {}) {
|
|
15
|
+
const bytes = typeof raw === 'string' ? fromBase64(raw) : raw;
|
|
16
|
+
if (bytes.length !== 32)
|
|
17
|
+
throw new TypeError(`An AES-256 key is 32 bytes, got ${bytes.length}.`);
|
|
18
|
+
return subtleOf(options.crypto).importKey('raw', bytes, { name: 'AES-GCM' }, options.extractable ?? false, ['encrypt', 'decrypt']);
|
|
19
|
+
}
|
|
20
|
+
/** One key for every entry. Give it an id to rotate later: entries keep the id they were written with. */
|
|
21
|
+
export function staticKeyProvider(key, id) {
|
|
22
|
+
return {
|
|
23
|
+
async getKey() {
|
|
24
|
+
const resolved = await key;
|
|
25
|
+
return id === undefined ? resolved : { key: resolved, id };
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// src/core/errors.ts
|
|
2
|
+
var StorageError = class extends Error {
|
|
3
|
+
constructor(code, message, options = {}) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = new.target.name;
|
|
6
|
+
this.code = code;
|
|
7
|
+
this.key = options.key;
|
|
8
|
+
if (options.cause !== void 0) this.cause = options.cause;
|
|
9
|
+
}
|
|
10
|
+
};
|
|
11
|
+
var StorageEncryptionError = class extends StorageError {
|
|
12
|
+
};
|
|
13
|
+
var StorageEncryptionUnavailableError = class extends StorageEncryptionError {
|
|
14
|
+
constructor(message, options = {}) {
|
|
15
|
+
super("encryption-unavailable", message, options);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
// src/encryption/base64.ts
|
|
20
|
+
function fromBase64(text) {
|
|
21
|
+
if (text.length % 4 !== 0 || !/^[A-Za-z0-9+/]*={0,2}$/.test(text)) throw new TypeError("Not base64.");
|
|
22
|
+
const binary = atob(text);
|
|
23
|
+
const out = new Uint8Array(binary.length);
|
|
24
|
+
for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/encryption/keys.ts
|
|
29
|
+
var subtleOf = (crypto) => {
|
|
30
|
+
const subtle = (crypto ?? globalThis.crypto)?.subtle;
|
|
31
|
+
if (!subtle) throw new StorageEncryptionUnavailableError("Web Crypto is not available in this runtime.");
|
|
32
|
+
return subtle;
|
|
33
|
+
};
|
|
34
|
+
async function generateEncryptionKey(options = {}) {
|
|
35
|
+
return subtleOf(options.crypto).generateKey({ name: "AES-GCM", length: 256 }, options.extractable ?? false, ["encrypt", "decrypt"]);
|
|
36
|
+
}
|
|
37
|
+
async function importEncryptionKey(raw, options = {}) {
|
|
38
|
+
const bytes = typeof raw === "string" ? fromBase64(raw) : raw;
|
|
39
|
+
if (bytes.length !== 32) throw new TypeError(`An AES-256 key is 32 bytes, got ${bytes.length}.`);
|
|
40
|
+
return subtleOf(options.crypto).importKey("raw", bytes, { name: "AES-GCM" }, options.extractable ?? false, ["encrypt", "decrypt"]);
|
|
41
|
+
}
|
|
42
|
+
function staticKeyProvider(key, id) {
|
|
43
|
+
return {
|
|
44
|
+
async getKey() {
|
|
45
|
+
const resolved = await key;
|
|
46
|
+
return id === void 0 ? resolved : { key: resolved, id };
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
export {
|
|
51
|
+
generateEncryptionKey,
|
|
52
|
+
importEncryptionKey,
|
|
53
|
+
staticKeyProvider
|
|
54
|
+
};
|