@relkit/providers-local 0.0.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 +40 -0
- package/dist/buckets/index.d.ts +5 -0
- package/dist/buckets/index.d.ts.map +1 -0
- package/dist/buckets/index.js +5 -0
- package/dist/buckets/index.js.map +1 -0
- package/dist/buckets/keys.d.ts +7 -0
- package/dist/buckets/keys.d.ts.map +1 -0
- package/dist/buckets/keys.js +60 -0
- package/dist/buckets/keys.js.map +1 -0
- package/dist/buckets/operations.d.ts +11 -0
- package/dist/buckets/operations.d.ts.map +1 -0
- package/dist/buckets/operations.js +89 -0
- package/dist/buckets/operations.js.map +1 -0
- package/dist/buckets/pagination.d.ts +5 -0
- package/dist/buckets/pagination.d.ts.map +1 -0
- package/dist/buckets/pagination.js +34 -0
- package/dist/buckets/pagination.js.map +1 -0
- package/dist/buckets/policy.d.ts +8 -0
- package/dist/buckets/policy.d.ts.map +1 -0
- package/dist/buckets/policy.js +74 -0
- package/dist/buckets/policy.js.map +1 -0
- package/dist/buckets/provider.d.ts +4 -0
- package/dist/buckets/provider.d.ts.map +1 -0
- package/dist/buckets/provider.js +119 -0
- package/dist/buckets/provider.js.map +1 -0
- package/dist/buckets/storage.d.ts +12 -0
- package/dist/buckets/storage.d.ts.map +1 -0
- package/dist/buckets/storage.js +169 -0
- package/dist/buckets/storage.js.map +1 -0
- package/dist/buckets/types.d.ts +91 -0
- package/dist/buckets/types.d.ts.map +1 -0
- package/dist/buckets/types.js +34 -0
- package/dist/buckets/types.js.map +1 -0
- package/dist/cache/index.d.ts +8 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +8 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/inspector.d.ts +4 -0
- package/dist/cache/inspector.d.ts.map +1 -0
- package/dist/cache/inspector.js +62 -0
- package/dist/cache/inspector.js.map +1 -0
- package/dist/cache/keys.d.ts +6 -0
- package/dist/cache/keys.d.ts.map +1 -0
- package/dist/cache/keys.js +34 -0
- package/dist/cache/keys.js.map +1 -0
- package/dist/cache/persistence.d.ts +5 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +108 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/policy.d.ts +9 -0
- package/dist/cache/policy.d.ts.map +1 -0
- package/dist/cache/policy.js +64 -0
- package/dist/cache/policy.js.map +1 -0
- package/dist/cache/provider.d.ts +3 -0
- package/dist/cache/provider.d.ts.map +1 -0
- package/dist/cache/provider.js +164 -0
- package/dist/cache/provider.js.map +1 -0
- package/dist/cache/store.d.ts +44 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +132 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/types.d.ts +100 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +39 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/cache/write.d.ts +5 -0
- package/dist/cache/write.d.ts.map +1 -0
- package/dist/cache/write.js +13 -0
- package/dist/cache/write.js.map +1 -0
- package/dist/events/admin-actions.d.ts +7 -0
- package/dist/events/admin-actions.d.ts.map +1 -0
- package/dist/events/admin-actions.js +28 -0
- package/dist/events/admin-actions.js.map +1 -0
- package/dist/events/admin-contracts.d.ts +132 -0
- package/dist/events/admin-contracts.d.ts.map +1 -0
- package/dist/events/admin-contracts.js +4 -0
- package/dist/events/admin-contracts.js.map +1 -0
- package/dist/events/admin-errors.d.ts +5 -0
- package/dist/events/admin-errors.d.ts.map +1 -0
- package/dist/events/admin-errors.js +9 -0
- package/dist/events/admin-errors.js.map +1 -0
- package/dist/events/admin-state.d.ts +8 -0
- package/dist/events/admin-state.d.ts.map +1 -0
- package/dist/events/admin-state.js +10 -0
- package/dist/events/admin-state.js.map +1 -0
- package/dist/events/admin-utils.d.ts +27 -0
- package/dist/events/admin-utils.d.ts.map +1 -0
- package/dist/events/admin-utils.js +153 -0
- package/dist/events/admin-utils.js.map +1 -0
- package/dist/events/admin.d.ts +22 -0
- package/dist/events/admin.d.ts.map +1 -0
- package/dist/events/admin.js +92 -0
- package/dist/events/admin.js.map +1 -0
- package/dist/events/delivery-types.d.ts +74 -0
- package/dist/events/delivery-types.d.ts.map +1 -0
- package/dist/events/delivery-types.js +9 -0
- package/dist/events/delivery-types.js.map +1 -0
- package/dist/events/delivery-utils.d.ts +17 -0
- package/dist/events/delivery-utils.d.ts.map +1 -0
- package/dist/events/delivery-utils.js +133 -0
- package/dist/events/delivery-utils.js.map +1 -0
- package/dist/events/delivery.d.ts +6 -0
- package/dist/events/delivery.d.ts.map +1 -0
- package/dist/events/delivery.js +159 -0
- package/dist/events/delivery.js.map +1 -0
- package/dist/events/ephemeral.d.ts +36 -0
- package/dist/events/ephemeral.d.ts.map +1 -0
- package/dist/events/ephemeral.js +61 -0
- package/dist/events/ephemeral.js.map +1 -0
- package/dist/events/log.d.ts +37 -0
- package/dist/events/log.d.ts.map +1 -0
- package/dist/events/log.js +121 -0
- package/dist/events/log.js.map +1 -0
- package/dist/events/provider.d.ts +9 -0
- package/dist/events/provider.d.ts.map +1 -0
- package/dist/events/provider.js +37 -0
- package/dist/events/provider.js.map +1 -0
- package/dist/events/router-inspection.d.ts +18 -0
- package/dist/events/router-inspection.d.ts.map +1 -0
- package/dist/events/router-inspection.js +110 -0
- package/dist/events/router-inspection.js.map +1 -0
- package/dist/events/router-records.d.ts +34 -0
- package/dist/events/router-records.d.ts.map +1 -0
- package/dist/events/router-records.js +98 -0
- package/dist/events/router-records.js.map +1 -0
- package/dist/events/router-types.d.ts +83 -0
- package/dist/events/router-types.d.ts.map +1 -0
- package/dist/events/router-types.js +2 -0
- package/dist/events/router-types.js.map +1 -0
- package/dist/events/router.d.ts +7 -0
- package/dist/events/router.d.ts.map +1 -0
- package/dist/events/router.js +148 -0
- package/dist/events/router.js.map +1 -0
- package/dist/factory.d.ts +26 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/factory.js +66 -0
- package/dist/factory.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/jobs/admin-contracts.d.ts +66 -0
- package/dist/jobs/admin-contracts.d.ts.map +1 -0
- package/dist/jobs/admin-contracts.js +4 -0
- package/dist/jobs/admin-contracts.js.map +1 -0
- package/dist/jobs/admin-errors.d.ts +5 -0
- package/dist/jobs/admin-errors.d.ts.map +1 -0
- package/dist/jobs/admin-errors.js +9 -0
- package/dist/jobs/admin-errors.js.map +1 -0
- package/dist/jobs/admin-utils.d.ts +29 -0
- package/dist/jobs/admin-utils.d.ts.map +1 -0
- package/dist/jobs/admin-utils.js +138 -0
- package/dist/jobs/admin-utils.js.map +1 -0
- package/dist/jobs/admin.d.ts +25 -0
- package/dist/jobs/admin.d.ts.map +1 -0
- package/dist/jobs/admin.js +89 -0
- package/dist/jobs/admin.js.map +1 -0
- package/dist/jobs/cron.d.ts +10 -0
- package/dist/jobs/cron.d.ts.map +1 -0
- package/dist/jobs/cron.js +18 -0
- package/dist/jobs/cron.js.map +1 -0
- package/dist/jobs/idempotency.d.ts +18 -0
- package/dist/jobs/idempotency.d.ts.map +1 -0
- package/dist/jobs/idempotency.js +82 -0
- package/dist/jobs/idempotency.js.map +1 -0
- package/dist/jobs/lease-utils.d.ts +9 -0
- package/dist/jobs/lease-utils.d.ts.map +1 -0
- package/dist/jobs/lease-utils.js +31 -0
- package/dist/jobs/lease-utils.js.map +1 -0
- package/dist/jobs/queue-admin.d.ts +12 -0
- package/dist/jobs/queue-admin.d.ts.map +1 -0
- package/dist/jobs/queue-admin.js +42 -0
- package/dist/jobs/queue-admin.js.map +1 -0
- package/dist/jobs/queue-entry.d.ts +8 -0
- package/dist/jobs/queue-entry.d.ts.map +1 -0
- package/dist/jobs/queue-entry.js +130 -0
- package/dist/jobs/queue-entry.js.map +1 -0
- package/dist/jobs/queue-lease.d.ts +4 -0
- package/dist/jobs/queue-lease.d.ts.map +1 -0
- package/dist/jobs/queue-lease.js +12 -0
- package/dist/jobs/queue-lease.js.map +1 -0
- package/dist/jobs/queue-operations.d.ts +16 -0
- package/dist/jobs/queue-operations.d.ts.map +1 -0
- package/dist/jobs/queue-operations.js +107 -0
- package/dist/jobs/queue-operations.js.map +1 -0
- package/dist/jobs/queue-recovery.d.ts +5 -0
- package/dist/jobs/queue-recovery.d.ts.map +1 -0
- package/dist/jobs/queue-recovery.js +22 -0
- package/dist/jobs/queue-recovery.js.map +1 -0
- package/dist/jobs/queue-utils.d.ts +101 -0
- package/dist/jobs/queue-utils.d.ts.map +1 -0
- package/dist/jobs/queue-utils.js +28 -0
- package/dist/jobs/queue-utils.js.map +1 -0
- package/dist/jobs/queue.d.ts +7 -0
- package/dist/jobs/queue.d.ts.map +1 -0
- package/dist/jobs/queue.js +70 -0
- package/dist/jobs/queue.js.map +1 -0
- package/dist/jobs/retry.d.ts +25 -0
- package/dist/jobs/retry.d.ts.map +1 -0
- package/dist/jobs/retry.js +84 -0
- package/dist/jobs/retry.js.map +1 -0
- package/dist/jobs/scheduler.d.ts +52 -0
- package/dist/jobs/scheduler.d.ts.map +1 -0
- package/dist/jobs/scheduler.js +122 -0
- package/dist/jobs/scheduler.js.map +1 -0
- package/dist/jobs/store-files.d.ts +20 -0
- package/dist/jobs/store-files.d.ts.map +1 -0
- package/dist/jobs/store-files.js +177 -0
- package/dist/jobs/store-files.js.map +1 -0
- package/dist/jobs/store.d.ts +60 -0
- package/dist/jobs/store.d.ts.map +1 -0
- package/dist/jobs/store.js +97 -0
- package/dist/jobs/store.js.map +1 -0
- package/dist/runtime-capabilities.d.ts +17 -0
- package/dist/runtime-capabilities.d.ts.map +1 -0
- package/dist/runtime-capabilities.js +32 -0
- package/dist/runtime-capabilities.js.map +1 -0
- package/dist/state.d.ts +15 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/state.js +69 -0
- package/dist/state.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { CacheOperationCancelledError, CacheOperationTimeoutError, } from "@relkit/cache";
|
|
2
|
+
import { LocalCachePolicyError, LocalCacheStateError, } from "./types.js";
|
|
3
|
+
export function normalizePolicy(options) {
|
|
4
|
+
const defaultTtlMs = positiveInteger(options.defaultTtlMs, "defaultTtlMs");
|
|
5
|
+
const maxTtlMs = positiveInteger(options.maxTtlMs, "maxTtlMs");
|
|
6
|
+
if (defaultTtlMs !== undefined && maxTtlMs !== undefined && defaultTtlMs > maxTtlMs) {
|
|
7
|
+
throw new LocalCachePolicyError("Cache defaultTtlMs must not exceed maxTtlMs");
|
|
8
|
+
}
|
|
9
|
+
const maxEntries = positiveInteger(options.maxEntries ?? 1000, "maxEntries");
|
|
10
|
+
const maxBytes = positiveInteger(options.maxBytes ?? 10 * 1024 * 1024, "maxBytes");
|
|
11
|
+
if (options.evictionPolicy !== undefined && options.evictionPolicy !== "lru") {
|
|
12
|
+
throw new LocalCachePolicyError("Cache evictionPolicy must be lru");
|
|
13
|
+
}
|
|
14
|
+
return Object.freeze({
|
|
15
|
+
...(defaultTtlMs === undefined ? {} : { defaultTtlMs }),
|
|
16
|
+
...(maxTtlMs === undefined ? {} : { maxTtlMs }),
|
|
17
|
+
maxEntries,
|
|
18
|
+
maxBytes,
|
|
19
|
+
evictionPolicy: "lru",
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export function normalizeTtl(value, policy) {
|
|
23
|
+
const ttlMs = value === undefined ? policy.defaultTtlMs : value;
|
|
24
|
+
if (ttlMs === undefined)
|
|
25
|
+
return undefined;
|
|
26
|
+
if (typeof ttlMs !== "number" || !Number.isSafeInteger(ttlMs) || ttlMs <= 0) {
|
|
27
|
+
throw new LocalCachePolicyError("Cache ttlMs must be a positive integer");
|
|
28
|
+
}
|
|
29
|
+
if (policy.maxTtlMs !== undefined && ttlMs > policy.maxTtlMs) {
|
|
30
|
+
throw new LocalCachePolicyError("Cache ttlMs exceeds the configured maximum");
|
|
31
|
+
}
|
|
32
|
+
return ttlMs;
|
|
33
|
+
}
|
|
34
|
+
export function assertActive(context, clock) {
|
|
35
|
+
if (context?.signal.aborted)
|
|
36
|
+
throw new CacheOperationCancelledError();
|
|
37
|
+
const now = readClock(clock);
|
|
38
|
+
if (context?.deadlineMs !== undefined && context.deadlineMs <= now) {
|
|
39
|
+
throw new CacheOperationTimeoutError();
|
|
40
|
+
}
|
|
41
|
+
return now;
|
|
42
|
+
}
|
|
43
|
+
export function readClock(clock) {
|
|
44
|
+
const now = clock();
|
|
45
|
+
if (typeof now !== "number" || !Number.isFinite(now)) {
|
|
46
|
+
throw new LocalCacheStateError("Cache clock must return a finite number");
|
|
47
|
+
}
|
|
48
|
+
return now;
|
|
49
|
+
}
|
|
50
|
+
export function byteLength(value) {
|
|
51
|
+
return new TextEncoder().encode(value).byteLength;
|
|
52
|
+
}
|
|
53
|
+
export function clone(value) {
|
|
54
|
+
return structuredClone(value);
|
|
55
|
+
}
|
|
56
|
+
function positiveInteger(value, name) {
|
|
57
|
+
if (value === undefined)
|
|
58
|
+
return undefined;
|
|
59
|
+
if (typeof value !== "number" || !Number.isSafeInteger(value) || value <= 0) {
|
|
60
|
+
throw new LocalCachePolicyError(`Cache ${name} must be a positive integer`);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../src/cache/policy.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../src/cache/provider.ts"],"names":[],"mappings":"AAIA,OAAO,EAKL,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAE/B,MAAM,YAAY,CAAC;AAMpB,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAA8B,GACtC,kBAAkB,CA+KpB"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import {} from "@relkit/cache";
|
|
2
|
+
import { createLocalCacheKey, normalizeCacheId, normalizeSchemaVersion } from "./keys.js";
|
|
3
|
+
import { assertActive, clone, normalizePolicy, readClock } from "./policy.js";
|
|
4
|
+
import { LocalCacheStore, MISSING } from "./store.js";
|
|
5
|
+
import { LOCAL_CACHE_CAPABILITIES, LOCAL_CACHE_DURABLE_CAPABILITIES, LocalCachePolicyError, LocalCacheStateError, } from "./types.js";
|
|
6
|
+
import { readCacheState, snapshotPath, writeCacheState } from "./persistence.js";
|
|
7
|
+
import { ensureOwnedDirectory, quarantineStateFile } from "../state.js";
|
|
8
|
+
import { writeCacheEntry } from "./write.js";
|
|
9
|
+
import { createLocalCacheInspector } from "./inspector.js";
|
|
10
|
+
export function createLocalCacheProvider(options = {}) {
|
|
11
|
+
const cacheId = normalizeCacheId(options.cacheId ?? "default");
|
|
12
|
+
const schemaVersion = normalizeSchemaVersion(options.schemaVersion ?? 1);
|
|
13
|
+
const policy = normalizePolicy(options);
|
|
14
|
+
const clock = options.clock ?? options.now ?? Date.now;
|
|
15
|
+
const store = new LocalCacheStore(policy);
|
|
16
|
+
const stateRoot = options.stateRoot === undefined ? undefined : ensureOwnedDirectory(options.stateRoot);
|
|
17
|
+
const stateSnapshot = stateRoot === undefined ? undefined : snapshotPath(stateRoot);
|
|
18
|
+
if (stateSnapshot !== undefined) {
|
|
19
|
+
const restored = readCacheState(stateSnapshot, cacheId, schemaVersion);
|
|
20
|
+
if (restored !== undefined) {
|
|
21
|
+
try {
|
|
22
|
+
store.restore(restored);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
quarantineStateFile(stateSnapshot, stateRoot);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const flights = new Map();
|
|
30
|
+
let pendingWrite = Promise.resolve();
|
|
31
|
+
let closed = false;
|
|
32
|
+
const snapshot = () => {
|
|
33
|
+
store.purgeExpired(readClock(clock));
|
|
34
|
+
return Object.freeze({
|
|
35
|
+
version: 1,
|
|
36
|
+
cacheId,
|
|
37
|
+
schemaVersion,
|
|
38
|
+
...store.snapshot(),
|
|
39
|
+
inFlight: flights.size,
|
|
40
|
+
});
|
|
41
|
+
};
|
|
42
|
+
const changed = () => {
|
|
43
|
+
try {
|
|
44
|
+
options.onSnapshot?.(snapshot());
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Snapshot observers are advisory and cannot change cache behavior.
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
const ensureOpen = () => {
|
|
51
|
+
if (closed)
|
|
52
|
+
throw new LocalCacheStateError("Cache provider is closed");
|
|
53
|
+
};
|
|
54
|
+
const read = (key, context) => {
|
|
55
|
+
ensureOpen();
|
|
56
|
+
const encoded = createLocalCacheKey(cacheId, schemaVersion, key);
|
|
57
|
+
const result = store.read(encoded, assertActive(context, clock));
|
|
58
|
+
if (result.expired)
|
|
59
|
+
changed();
|
|
60
|
+
return result.value;
|
|
61
|
+
};
|
|
62
|
+
const get = async (key, context) => {
|
|
63
|
+
const value = read(key, context);
|
|
64
|
+
return value === MISSING ? undefined : clone(value);
|
|
65
|
+
};
|
|
66
|
+
const set = async (key, value, optionsValue, context) => {
|
|
67
|
+
ensureOpen();
|
|
68
|
+
const encoded = createLocalCacheKey(cacheId, schemaVersion, key);
|
|
69
|
+
writeCacheEntry(store, policy, encoded, value, optionsValue, assertActive(context, clock));
|
|
70
|
+
await persist();
|
|
71
|
+
changed();
|
|
72
|
+
};
|
|
73
|
+
const remove = async (key, context) => {
|
|
74
|
+
ensureOpen();
|
|
75
|
+
const encoded = createLocalCacheKey(cacheId, schemaVersion, key);
|
|
76
|
+
assertActive(context, clock);
|
|
77
|
+
if (store.remove(encoded)) {
|
|
78
|
+
await persist();
|
|
79
|
+
changed();
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const has = async (key, context) => (await get(key, context)) !== undefined;
|
|
83
|
+
const getOrSet = async (key, produce, optionsValue, context) => {
|
|
84
|
+
const cached = read(key, context);
|
|
85
|
+
if (cached !== MISSING)
|
|
86
|
+
return clone(cached);
|
|
87
|
+
const encoded = createLocalCacheKey(cacheId, schemaVersion, key);
|
|
88
|
+
const existing = flights.get(encoded);
|
|
89
|
+
if (existing !== undefined)
|
|
90
|
+
return existing.then(clone);
|
|
91
|
+
const flight = produceAndStore(produce, encoded, optionsValue, context);
|
|
92
|
+
flights.set(encoded, flight);
|
|
93
|
+
try {
|
|
94
|
+
return await flight;
|
|
95
|
+
}
|
|
96
|
+
finally {
|
|
97
|
+
if (flights.get(encoded) === flight)
|
|
98
|
+
flights.delete(encoded);
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
const increment = async (key, delta, optionsValue, context) => {
|
|
102
|
+
if (typeof delta !== "number" || !Number.isFinite(delta)) {
|
|
103
|
+
throw new LocalCachePolicyError("Cache increment delta must be finite");
|
|
104
|
+
}
|
|
105
|
+
const current = read(key, context);
|
|
106
|
+
const value = current === MISSING ? 0 : current;
|
|
107
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
108
|
+
throw new LocalCachePolicyError("Cache increment requires a finite numeric value");
|
|
109
|
+
}
|
|
110
|
+
const result = value + delta;
|
|
111
|
+
if (!Number.isFinite(result))
|
|
112
|
+
throw new LocalCachePolicyError("Cache increment overflowed");
|
|
113
|
+
await set(key, result, optionsValue, context);
|
|
114
|
+
return result;
|
|
115
|
+
};
|
|
116
|
+
const close = async () => {
|
|
117
|
+
if (closed)
|
|
118
|
+
return;
|
|
119
|
+
if (stateSnapshot !== undefined) {
|
|
120
|
+
store.purgeExpired(readClock(clock));
|
|
121
|
+
await persist();
|
|
122
|
+
}
|
|
123
|
+
closed = true;
|
|
124
|
+
await pendingWrite;
|
|
125
|
+
store.clear();
|
|
126
|
+
flights.clear();
|
|
127
|
+
};
|
|
128
|
+
const capabilities = stateRoot === undefined ? LOCAL_CACHE_CAPABILITIES : LOCAL_CACHE_DURABLE_CAPABILITIES;
|
|
129
|
+
const inspector = createLocalCacheInspector(store, () => readClock(clock));
|
|
130
|
+
return Object.freeze({
|
|
131
|
+
capabilities,
|
|
132
|
+
cacheId,
|
|
133
|
+
schemaVersion,
|
|
134
|
+
policy,
|
|
135
|
+
snapshot,
|
|
136
|
+
...(stateRoot === undefined ? {} : { stateRoot }),
|
|
137
|
+
ready: async () => undefined,
|
|
138
|
+
get,
|
|
139
|
+
set,
|
|
140
|
+
delete: remove,
|
|
141
|
+
has,
|
|
142
|
+
getOrSet,
|
|
143
|
+
increment,
|
|
144
|
+
inspector,
|
|
145
|
+
close,
|
|
146
|
+
});
|
|
147
|
+
async function produceAndStore(produce, encoded, optionsValue, context) {
|
|
148
|
+
const value = await produce();
|
|
149
|
+
ensureOpen();
|
|
150
|
+
const now = assertActive(context, clock);
|
|
151
|
+
writeCacheEntry(store, policy, encoded, value, optionsValue, now);
|
|
152
|
+
await persist();
|
|
153
|
+
changed();
|
|
154
|
+
return clone(value);
|
|
155
|
+
}
|
|
156
|
+
function persist() {
|
|
157
|
+
if (stateSnapshot === undefined)
|
|
158
|
+
return Promise.resolve();
|
|
159
|
+
const state = store.exportState();
|
|
160
|
+
pendingWrite = pendingWrite.then(() => writeCacheState(stateSnapshot, state, cacheId, schemaVersion));
|
|
161
|
+
return pendingWrite;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"provider.js","sourceRoot":"","sources":["../../src/cache/provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { type LocalCachePolicy } from "./types.js";
|
|
2
|
+
export declare const MISSING: unique symbol;
|
|
3
|
+
export interface LocalCacheRead {
|
|
4
|
+
readonly value: unknown | typeof MISSING;
|
|
5
|
+
readonly expired: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface LocalCacheStoreSnapshot {
|
|
8
|
+
readonly entries: number;
|
|
9
|
+
readonly bytes: number;
|
|
10
|
+
readonly evictions: number;
|
|
11
|
+
readonly hits: number;
|
|
12
|
+
readonly misses: number;
|
|
13
|
+
}
|
|
14
|
+
export interface LocalCacheStoreEntry {
|
|
15
|
+
readonly key: string;
|
|
16
|
+
readonly value: unknown;
|
|
17
|
+
readonly bytes: number;
|
|
18
|
+
readonly expiresAt?: number;
|
|
19
|
+
readonly lastUsed: number;
|
|
20
|
+
}
|
|
21
|
+
export interface LocalCacheStoreState extends Omit<LocalCacheStoreSnapshot, "entries"> {
|
|
22
|
+
readonly sequence: number;
|
|
23
|
+
readonly entries: readonly LocalCacheStoreEntry[];
|
|
24
|
+
}
|
|
25
|
+
export declare class LocalCacheStore {
|
|
26
|
+
private readonly policy;
|
|
27
|
+
private readonly entries;
|
|
28
|
+
private sequence;
|
|
29
|
+
private bytes;
|
|
30
|
+
private evictions;
|
|
31
|
+
private hits;
|
|
32
|
+
private misses;
|
|
33
|
+
constructor(policy: LocalCachePolicy);
|
|
34
|
+
read(key: string, now: number): LocalCacheRead;
|
|
35
|
+
write(key: string, value: unknown, bytes: number, expiresAt: number | undefined): void;
|
|
36
|
+
remove(key: string): boolean;
|
|
37
|
+
purgeExpired(now: number): void;
|
|
38
|
+
snapshot(): LocalCacheStoreSnapshot;
|
|
39
|
+
exportState(): LocalCacheStoreState;
|
|
40
|
+
restore(state: LocalCacheStoreState): void;
|
|
41
|
+
clear(): void;
|
|
42
|
+
private evict;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEzE,eAAO,MAAM,OAAO,eAAoB,CAAC;AAUzC,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI,CAAC,uBAAuB,EAAE,SAAS,CAAC;IACpF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACnD;AAED,qBAAa,eAAe;IAQd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAK;IACrB,OAAO,CAAC,KAAK,CAAK;IAClB,OAAO,CAAC,SAAS,CAAK;IACtB,OAAO,CAAC,IAAI,CAAK;IACjB,OAAO,CAAC,MAAM,CAAK;gBAEU,MAAM,EAAE,gBAAgB;IAErD,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,cAAc;IAgB9C,KAAK,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;IActF,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAQ5B,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAM/B,QAAQ,IAAI,uBAAuB;IAUnC,WAAW,IAAI,oBAAoB;IAcnC,OAAO,CAAC,KAAK,EAAE,oBAAoB,GAAG,IAAI;IAsC1C,KAAK,IAAI,IAAI;IAMb,OAAO,CAAC,KAAK;CAWd"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { LocalCacheStateError } from "./types.js";
|
|
2
|
+
export const MISSING = Symbol("missing");
|
|
3
|
+
export class LocalCacheStore {
|
|
4
|
+
policy;
|
|
5
|
+
entries = new Map();
|
|
6
|
+
sequence = 0;
|
|
7
|
+
bytes = 0;
|
|
8
|
+
evictions = 0;
|
|
9
|
+
hits = 0;
|
|
10
|
+
misses = 0;
|
|
11
|
+
constructor(policy) {
|
|
12
|
+
this.policy = policy;
|
|
13
|
+
}
|
|
14
|
+
read(key, now) {
|
|
15
|
+
const entry = this.entries.get(key);
|
|
16
|
+
if (entry === undefined) {
|
|
17
|
+
this.misses += 1;
|
|
18
|
+
return { value: MISSING, expired: false };
|
|
19
|
+
}
|
|
20
|
+
if (entry.expiresAt !== undefined && entry.expiresAt <= now) {
|
|
21
|
+
this.remove(key);
|
|
22
|
+
this.misses += 1;
|
|
23
|
+
return { value: MISSING, expired: true };
|
|
24
|
+
}
|
|
25
|
+
entry.lastUsed = ++this.sequence;
|
|
26
|
+
this.hits += 1;
|
|
27
|
+
return { value: entry.value, expired: false };
|
|
28
|
+
}
|
|
29
|
+
write(key, value, bytes, expiresAt) {
|
|
30
|
+
this.remove(key);
|
|
31
|
+
const entry = {
|
|
32
|
+
key,
|
|
33
|
+
value,
|
|
34
|
+
bytes,
|
|
35
|
+
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
36
|
+
lastUsed: ++this.sequence,
|
|
37
|
+
};
|
|
38
|
+
this.entries.set(key, entry);
|
|
39
|
+
this.bytes += bytes;
|
|
40
|
+
this.evict();
|
|
41
|
+
}
|
|
42
|
+
remove(key) {
|
|
43
|
+
const entry = this.entries.get(key);
|
|
44
|
+
if (entry === undefined)
|
|
45
|
+
return false;
|
|
46
|
+
this.entries.delete(key);
|
|
47
|
+
this.bytes -= entry.bytes;
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
purgeExpired(now) {
|
|
51
|
+
for (const [key, entry] of this.entries) {
|
|
52
|
+
if (entry.expiresAt !== undefined && entry.expiresAt <= now)
|
|
53
|
+
this.remove(key);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
snapshot() {
|
|
57
|
+
return {
|
|
58
|
+
entries: this.entries.size,
|
|
59
|
+
bytes: this.bytes,
|
|
60
|
+
evictions: this.evictions,
|
|
61
|
+
hits: this.hits,
|
|
62
|
+
misses: this.misses,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
exportState() {
|
|
66
|
+
return {
|
|
67
|
+
...this.snapshot(),
|
|
68
|
+
sequence: this.sequence,
|
|
69
|
+
entries: [...this.entries.values()].map((entry) => ({
|
|
70
|
+
key: entry.key,
|
|
71
|
+
value: entry.value,
|
|
72
|
+
bytes: entry.bytes,
|
|
73
|
+
...(entry.expiresAt === undefined ? {} : { expiresAt: entry.expiresAt }),
|
|
74
|
+
lastUsed: entry.lastUsed,
|
|
75
|
+
})),
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
restore(state) {
|
|
79
|
+
this.entries.clear();
|
|
80
|
+
this.bytes = 0;
|
|
81
|
+
this.sequence = state.sequence;
|
|
82
|
+
this.evictions = state.evictions;
|
|
83
|
+
this.hits = state.hits;
|
|
84
|
+
this.misses = state.misses;
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
for (const source of state.entries) {
|
|
87
|
+
if (seen.has(source.key) ||
|
|
88
|
+
!Number.isSafeInteger(source.bytes) ||
|
|
89
|
+
source.bytes <= 0 ||
|
|
90
|
+
!Number.isSafeInteger(source.lastUsed) ||
|
|
91
|
+
source.lastUsed <= 0 ||
|
|
92
|
+
(source.expiresAt !== undefined &&
|
|
93
|
+
(!Number.isSafeInteger(source.expiresAt) || source.expiresAt <= 0))) {
|
|
94
|
+
throw new LocalCacheStateError("Cache snapshot entries are malformed");
|
|
95
|
+
}
|
|
96
|
+
seen.add(source.key);
|
|
97
|
+
const entry = {
|
|
98
|
+
key: source.key,
|
|
99
|
+
value: source.value,
|
|
100
|
+
bytes: source.bytes,
|
|
101
|
+
...(source.expiresAt === undefined ? {} : { expiresAt: source.expiresAt }),
|
|
102
|
+
lastUsed: source.lastUsed,
|
|
103
|
+
};
|
|
104
|
+
this.entries.set(entry.key, entry);
|
|
105
|
+
this.bytes += entry.bytes;
|
|
106
|
+
this.sequence = Math.max(this.sequence, entry.lastUsed);
|
|
107
|
+
}
|
|
108
|
+
if (!Number.isSafeInteger(this.bytes) || this.bytes < 0) {
|
|
109
|
+
throw new LocalCacheStateError("Cache snapshot byte count is invalid");
|
|
110
|
+
}
|
|
111
|
+
this.evict();
|
|
112
|
+
}
|
|
113
|
+
clear() {
|
|
114
|
+
this.entries.clear();
|
|
115
|
+
this.bytes = 0;
|
|
116
|
+
}
|
|
117
|
+
// ponytail: linear LRU scan; use an ordered index only if large bounds make it measurable.
|
|
118
|
+
evict() {
|
|
119
|
+
while (this.entries.size > this.policy.maxEntries || this.bytes > this.policy.maxBytes) {
|
|
120
|
+
let oldest;
|
|
121
|
+
for (const entry of this.entries.values()) {
|
|
122
|
+
if (oldest === undefined || entry.lastUsed < oldest.lastUsed)
|
|
123
|
+
oldest = entry;
|
|
124
|
+
}
|
|
125
|
+
if (oldest === undefined)
|
|
126
|
+
return;
|
|
127
|
+
this.remove(oldest.key);
|
|
128
|
+
this.evictions += 1;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/cache/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { CacheCapabilities, CacheOperationContext, CacheOperationOptions, CacheProvider } from "@relkit/cache";
|
|
2
|
+
export declare const LOCAL_CACHE_CAPABILITIES: Readonly<{
|
|
3
|
+
readonly increment: true;
|
|
4
|
+
readonly persistence: "memory-only";
|
|
5
|
+
readonly singleFlight: "generation-local";
|
|
6
|
+
}>;
|
|
7
|
+
export declare const LOCAL_CACHE_DURABLE_CAPABILITIES: Readonly<{
|
|
8
|
+
readonly increment: true;
|
|
9
|
+
readonly persistence: "restart-recovery";
|
|
10
|
+
readonly singleFlight: "generation-local";
|
|
11
|
+
}>;
|
|
12
|
+
export type LocalCacheEvictionPolicy = "lru";
|
|
13
|
+
export interface LocalCacheProviderOptions {
|
|
14
|
+
/** Provider-owned profile directory; enables atomic restart snapshots. */
|
|
15
|
+
readonly stateRoot?: string;
|
|
16
|
+
readonly cacheId?: string;
|
|
17
|
+
readonly schemaVersion?: string | number;
|
|
18
|
+
readonly defaultTtlMs?: number;
|
|
19
|
+
readonly maxTtlMs?: number;
|
|
20
|
+
readonly maxEntries?: number;
|
|
21
|
+
readonly maxBytes?: number;
|
|
22
|
+
readonly evictionPolicy?: LocalCacheEvictionPolicy;
|
|
23
|
+
/** Injectable clock used for TTL and deadline checks. */
|
|
24
|
+
readonly clock?: () => number;
|
|
25
|
+
/** Alias for clock, kept for small deterministic test seams. */
|
|
26
|
+
readonly now?: () => number;
|
|
27
|
+
/** Receives safe counters only; keys and values are never included. */
|
|
28
|
+
readonly onSnapshot?: (snapshot: LocalCacheSnapshot) => void;
|
|
29
|
+
}
|
|
30
|
+
export interface LocalCachePolicy {
|
|
31
|
+
readonly defaultTtlMs?: number;
|
|
32
|
+
readonly maxTtlMs?: number;
|
|
33
|
+
readonly maxEntries: number;
|
|
34
|
+
readonly maxBytes: number;
|
|
35
|
+
readonly evictionPolicy: LocalCacheEvictionPolicy;
|
|
36
|
+
}
|
|
37
|
+
export interface LocalCacheSnapshot {
|
|
38
|
+
readonly version: 1;
|
|
39
|
+
readonly cacheId: string;
|
|
40
|
+
readonly schemaVersion: string | number;
|
|
41
|
+
readonly entries: number;
|
|
42
|
+
readonly bytes: number;
|
|
43
|
+
readonly evictions: number;
|
|
44
|
+
readonly hits: number;
|
|
45
|
+
readonly misses: number;
|
|
46
|
+
readonly inFlight: number;
|
|
47
|
+
}
|
|
48
|
+
export interface LocalCacheCapabilities extends CacheCapabilities {
|
|
49
|
+
readonly persistence: "memory-only" | "restart-recovery";
|
|
50
|
+
readonly singleFlight: "generation-local";
|
|
51
|
+
}
|
|
52
|
+
export type LocalCacheProvider = Omit<CacheProvider, "capabilities"> & {
|
|
53
|
+
readonly capabilities: Readonly<LocalCacheCapabilities>;
|
|
54
|
+
readonly cacheId: string;
|
|
55
|
+
readonly schemaVersion: string | number;
|
|
56
|
+
readonly policy: Readonly<LocalCachePolicy>;
|
|
57
|
+
readonly snapshot: () => LocalCacheSnapshot;
|
|
58
|
+
readonly stateRoot?: string;
|
|
59
|
+
readonly ready: () => Promise<void>;
|
|
60
|
+
readonly close: () => Promise<void>;
|
|
61
|
+
readonly get: (key: unknown, context?: CacheOperationContext) => Promise<unknown | undefined>;
|
|
62
|
+
readonly set: (key: unknown, value: unknown, options?: CacheOperationOptions, context?: CacheOperationContext) => Promise<void>;
|
|
63
|
+
readonly delete: (key: unknown, context?: CacheOperationContext) => Promise<void>;
|
|
64
|
+
readonly has: (key: unknown, context?: CacheOperationContext) => Promise<boolean>;
|
|
65
|
+
readonly getOrSet: (key: unknown, produce: () => unknown | Promise<unknown>, options?: CacheOperationOptions, context?: CacheOperationContext) => Promise<unknown>;
|
|
66
|
+
readonly increment: (key: unknown, delta: number, options?: CacheOperationOptions, context?: CacheOperationContext) => Promise<number>;
|
|
67
|
+
readonly inspector: {
|
|
68
|
+
readonly scan: (request: {
|
|
69
|
+
readonly search?: string;
|
|
70
|
+
readonly cursor?: string;
|
|
71
|
+
readonly limit: number;
|
|
72
|
+
readonly signal: AbortSignal;
|
|
73
|
+
}) => Promise<{
|
|
74
|
+
readonly items: readonly unknown[];
|
|
75
|
+
readonly nextCursor?: string;
|
|
76
|
+
}>;
|
|
77
|
+
readonly value: (request: {
|
|
78
|
+
readonly key: string;
|
|
79
|
+
readonly limit: number;
|
|
80
|
+
readonly signal: AbortSignal;
|
|
81
|
+
}) => Promise<unknown | undefined>;
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
export declare class LocalCacheKeyError extends TypeError {
|
|
85
|
+
readonly code: "RELKIT_CACHE_KEY_INVALID";
|
|
86
|
+
constructor();
|
|
87
|
+
}
|
|
88
|
+
export declare class LocalCacheValueError extends TypeError {
|
|
89
|
+
readonly code: "RELKIT_CACHE_VALUE_INVALID";
|
|
90
|
+
constructor();
|
|
91
|
+
}
|
|
92
|
+
export declare class LocalCachePolicyError extends RangeError {
|
|
93
|
+
readonly code: "RELKIT_CACHE_POLICY_INVALID";
|
|
94
|
+
constructor(message: string);
|
|
95
|
+
}
|
|
96
|
+
export declare class LocalCacheStateError extends Error {
|
|
97
|
+
readonly code: "RELKIT_CACHE_STATE_INVALID";
|
|
98
|
+
constructor(message?: string);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export const LOCAL_CACHE_CAPABILITIES = Object.freeze({
|
|
2
|
+
increment: true,
|
|
3
|
+
persistence: "memory-only",
|
|
4
|
+
singleFlight: "generation-local",
|
|
5
|
+
});
|
|
6
|
+
export const LOCAL_CACHE_DURABLE_CAPABILITIES = Object.freeze({
|
|
7
|
+
increment: true,
|
|
8
|
+
persistence: "restart-recovery",
|
|
9
|
+
singleFlight: "generation-local",
|
|
10
|
+
});
|
|
11
|
+
export class LocalCacheKeyError extends TypeError {
|
|
12
|
+
code = "RELKIT_CACHE_KEY_INVALID";
|
|
13
|
+
constructor() {
|
|
14
|
+
super("Cache key must be canonical JSON data");
|
|
15
|
+
this.name = "LocalCacheKeyError";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
export class LocalCacheValueError extends TypeError {
|
|
19
|
+
code = "RELKIT_CACHE_VALUE_INVALID";
|
|
20
|
+
constructor() {
|
|
21
|
+
super("Cache value must be canonical JSON data");
|
|
22
|
+
this.name = "LocalCacheValueError";
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export class LocalCachePolicyError extends RangeError {
|
|
26
|
+
code = "RELKIT_CACHE_POLICY_INVALID";
|
|
27
|
+
constructor(message) {
|
|
28
|
+
super(message);
|
|
29
|
+
this.name = "LocalCachePolicyError";
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
export class LocalCacheStateError extends Error {
|
|
33
|
+
code = "RELKIT_CACHE_STATE_INVALID";
|
|
34
|
+
constructor(message = "Cache provider state is invalid") {
|
|
35
|
+
super(message);
|
|
36
|
+
this.name = "LocalCacheStateError";
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAOA,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,CAAC;IACpD,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,aAAa;IAC1B,YAAY,EAAE,kBAAkB;CACxB,CAAC,CAAC;AAEZ,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,MAAM,CAAC;IAC5D,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,kBAAkB;IAC/B,YAAY,EAAE,kBAAkB;CACxB,CAAC,CAAC;AA4FZ,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IACtC,IAAI,GAAG,0BAAmC,CAAC;IAEpD;QACE,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACxC,IAAI,GAAG,4BAAqC,CAAC;IAEtD;QACE,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IAC1C,IAAI,GAAG,6BAAsC,CAAC;IAEvD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IACpC,IAAI,GAAG,4BAAqC,CAAC;IAEtD,YAAY,OAAO,GAAG,iCAAiC;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CacheOperationOptions } from "@relkit/cache";
|
|
2
|
+
import type { LocalCacheStore } from "./store.js";
|
|
3
|
+
import { type LocalCachePolicy } from "./types.js";
|
|
4
|
+
export declare function writeCacheEntry(store: LocalCacheStore, policy: LocalCachePolicy, encoded: string, value: unknown, options: CacheOperationOptions | undefined, now: number): void;
|
|
5
|
+
//# sourceMappingURL=write.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../../src/cache/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAClD,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE1E,wBAAgB,eAAe,CAC7B,KAAK,EAAE,eAAe,EACtB,MAAM,EAAE,gBAAgB,EACxB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,qBAAqB,GAAG,SAAS,EAC1C,GAAG,EAAE,MAAM,GACV,IAAI,CAON"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { serializeLocalCacheValue } from "./keys.js";
|
|
2
|
+
import { byteLength, normalizeTtl } from "./policy.js";
|
|
3
|
+
import { LocalCachePolicyError } from "./types.js";
|
|
4
|
+
export function writeCacheEntry(store, policy, encoded, value, options, now) {
|
|
5
|
+
const serialized = serializeLocalCacheValue(value);
|
|
6
|
+
const stored = JSON.parse(serialized);
|
|
7
|
+
const bytes = byteLength(encoded) + byteLength(serialized);
|
|
8
|
+
if (bytes > policy.maxBytes)
|
|
9
|
+
throw new LocalCachePolicyError("Cache value exceeds maxBytes");
|
|
10
|
+
const ttlMs = normalizeTtl(options?.ttlMs, policy);
|
|
11
|
+
store.write(encoded, stored, bytes, ttlMs === undefined ? undefined : now + ttlMs);
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=write.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../src/cache/write.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,qBAAqB,EAAyB,MAAM,YAAY,CAAC;AAE1E,MAAM,UAAU,eAAe,CAC7B,KAAsB,EACtB,MAAwB,EACxB,OAAe,EACf,KAAc,EACd,OAA0C,EAC1C,GAAW;IAEX,MAAM,UAAU,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAY,CAAC;IACjD,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,KAAK,GAAG,MAAM,CAAC,QAAQ;QAAE,MAAM,IAAI,qBAAqB,CAAC,8BAA8B,CAAC,CAAC;IAC7F,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;AACrF,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { EventAdminAction, EventAdminActionRecord, EventAdminActionSink, EventAdminMode, EventDeliveryContract } from "./admin-contracts.js";
|
|
2
|
+
export declare function makeRecord(action: EventAdminAction, actionId: string, deliveryId: string, requestedAt: number, outcome: "applied" | "rejected", mode: EventAdminMode, before: EventDeliveryContract | undefined, after: EventDeliveryContract | undefined, errorCode?: string, reason?: string): EventAdminActionRecord;
|
|
3
|
+
export declare function recordAction(options: {
|
|
4
|
+
readonly records: EventAdminActionRecord[];
|
|
5
|
+
readonly onAction?: EventAdminActionSink;
|
|
6
|
+
}, record: EventAdminActionRecord): Promise<EventAdminActionRecord>;
|
|
7
|
+
//# sourceMappingURL=admin-actions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-actions.d.ts","sourceRoot":"","sources":["../../src/events/admin-actions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAChB,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACtB,MAAM,sBAAsB,CAAC;AAG9B,wBAAgB,UAAU,CACxB,MAAM,EAAE,gBAAgB,EACxB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,SAAS,GAAG,UAAU,EAC/B,IAAI,EAAE,cAAc,EACpB,MAAM,EAAE,qBAAqB,GAAG,SAAS,EACzC,KAAK,EAAE,qBAAqB,GAAG,SAAS,EACxC,SAAS,CAAC,EAAE,MAAM,EAClB,MAAM,CAAC,EAAE,MAAM,GACd,sBAAsB,CAexB;AAED,wBAAsB,YAAY,CAChC,OAAO,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,sBAAsB,EAAE,CAAC;IAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,oBAAoB,CAAA;CAAE,EACjG,MAAM,EAAE,sBAAsB,GAC7B,OAAO,CAAC,sBAAsB,CAAC,CAQjC"}
|