@cqrs-ddd/core 0.3.0 → 0.4.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/README.md +3 -0
- package/dist/application/base.command.js +5 -9
- package/dist/application/base.command.js.map +1 -1
- package/dist/application/base.query.d.ts +1 -1
- package/dist/application/base.query.d.ts.map +1 -1
- package/dist/application/base.query.js +7 -11
- package/dist/application/base.query.js.map +1 -1
- package/dist/application/command-base.handler.d.ts +2 -2
- package/dist/application/command-base.handler.d.ts.map +1 -1
- package/dist/application/command-base.handler.js +3 -7
- package/dist/application/command-base.handler.js.map +1 -1
- package/dist/application/index.d.ts +10 -10
- package/dist/application/index.d.ts.map +1 -1
- package/dist/application/index.js +10 -26
- package/dist/application/index.js.map +1 -1
- package/dist/application/ports/cache.port.js +1 -4
- package/dist/application/ports/cache.port.js.map +1 -1
- package/dist/application/ports/command-repository.port.js +1 -2
- package/dist/application/ports/command-repository.port.js.map +1 -1
- package/dist/application/ports/domain-event-publisher.port.d.ts +1 -1
- package/dist/application/ports/domain-event-publisher.port.d.ts.map +1 -1
- package/dist/application/ports/domain-event-publisher.port.js +1 -2
- package/dist/application/ports/domain-event-publisher.port.js.map +1 -1
- package/dist/application/ports/query-repository.port.d.ts +1 -1
- package/dist/application/ports/query-repository.port.d.ts.map +1 -1
- package/dist/application/ports/query-repository.port.js +1 -2
- package/dist/application/ports/query-repository.port.js.map +1 -1
- package/dist/application/ports/write-side-aggregate-repository.port.d.ts +1 -1
- package/dist/application/ports/write-side-aggregate-repository.port.d.ts.map +1 -1
- package/dist/application/ports/write-side-aggregate-repository.port.js +1 -2
- package/dist/application/ports/write-side-aggregate-repository.port.js.map +1 -1
- package/dist/application/query.options.js +1 -2
- package/dist/application/query.options.js.map +1 -1
- package/dist/application/request-fields.helper.js +2 -6
- package/dist/application/request-fields.helper.js.map +1 -1
- package/dist/application/tenant-resolver.js +5 -10
- package/dist/application/tenant-resolver.js.map +1 -1
- package/dist/domain/decorators/apply-mutation.decorator.d.ts +1 -1
- package/dist/domain/decorators/apply-mutation.decorator.d.ts.map +1 -1
- package/dist/domain/decorators/apply-mutation.decorator.js +1 -4
- package/dist/domain/decorators/apply-mutation.decorator.js.map +1 -1
- package/dist/domain/decorators/mutable.decorator.js +2 -6
- package/dist/domain/decorators/mutable.decorator.js.map +1 -1
- package/dist/domain/events/domain.event.d.ts +1 -1
- package/dist/domain/events/domain.event.d.ts.map +1 -1
- package/dist/domain/events/domain.event.js +3 -7
- package/dist/domain/events/domain.event.js.map +1 -1
- package/dist/domain/events/event.interface.js +1 -2
- package/dist/domain/events/event.interface.js.map +1 -1
- package/dist/domain/events/root-domain.event.d.ts +3 -3
- package/dist/domain/events/root-domain.event.d.ts.map +1 -1
- package/dist/domain/events/root-domain.event.js +3 -8
- package/dist/domain/events/root-domain.event.js.map +1 -1
- package/dist/domain/exceptions/concurrency-conflict.error.d.ts +1 -1
- package/dist/domain/exceptions/concurrency-conflict.error.d.ts.map +1 -1
- package/dist/domain/exceptions/concurrency-conflict.error.js +2 -6
- package/dist/domain/exceptions/concurrency-conflict.error.js.map +1 -1
- package/dist/domain/exceptions/domain.exception.js +1 -5
- package/dist/domain/exceptions/domain.exception.js.map +1 -1
- package/dist/domain/exceptions/entity-not-found.exception.d.ts +1 -1
- package/dist/domain/exceptions/entity-not-found.exception.d.ts.map +1 -1
- package/dist/domain/exceptions/entity-not-found.exception.js +2 -6
- package/dist/domain/exceptions/entity-not-found.exception.js.map +1 -1
- package/dist/domain/exceptions/invalid-value.exception.d.ts +2 -2
- package/dist/domain/exceptions/invalid-value.exception.d.ts.map +1 -1
- package/dist/domain/exceptions/invalid-value.exception.js +2 -6
- package/dist/domain/exceptions/invalid-value.exception.js.map +1 -1
- package/dist/domain/exceptions/missing-tenant-context.exception.d.ts +1 -1
- package/dist/domain/exceptions/missing-tenant-context.exception.d.ts.map +1 -1
- package/dist/domain/exceptions/missing-tenant-context.exception.js +2 -6
- package/dist/domain/exceptions/missing-tenant-context.exception.js.map +1 -1
- package/dist/domain/exceptions/transient-operation.error.js +2 -7
- package/dist/domain/exceptions/transient-operation.error.js.map +1 -1
- package/dist/domain/exceptions/unknown-mutable-field.error.js +1 -5
- package/dist/domain/exceptions/unknown-mutable-field.error.js.map +1 -1
- package/dist/domain/index.d.ts +19 -19
- package/dist/domain/index.d.ts.map +1 -1
- package/dist/domain/index.js +19 -35
- package/dist/domain/index.js.map +1 -1
- package/dist/domain/interfaces/aggregate-root.interface.d.ts +1 -1
- package/dist/domain/interfaces/aggregate-root.interface.d.ts.map +1 -1
- package/dist/domain/interfaces/aggregate-root.interface.js +1 -2
- package/dist/domain/interfaces/aggregate-root.interface.js.map +1 -1
- package/dist/domain/interfaces/root-entity-snapshot.interface.js +1 -2
- package/dist/domain/interfaces/root-entity-snapshot.interface.js.map +1 -1
- package/dist/domain/models/aggregate-root.d.ts +2 -2
- package/dist/domain/models/aggregate-root.d.ts.map +1 -1
- package/dist/domain/models/aggregate-root.js +1 -5
- package/dist/domain/models/aggregate-root.js.map +1 -1
- package/dist/domain/models/root.entity.d.ts +3 -3
- package/dist/domain/models/root.entity.d.ts.map +1 -1
- package/dist/domain/models/root.entity.js +9 -13
- package/dist/domain/models/root.entity.js.map +1 -1
- package/dist/domain/rules/number.rule.d.ts +1 -1
- package/dist/domain/rules/number.rule.d.ts.map +1 -1
- package/dist/domain/rules/number.rule.js +4 -7
- package/dist/domain/rules/number.rule.js.map +1 -1
- package/dist/domain/rules/rule-support.d.ts +1 -1
- package/dist/domain/rules/rule-support.d.ts.map +1 -1
- package/dist/domain/rules/rule-support.js +3 -7
- package/dist/domain/rules/rule-support.js.map +1 -1
- package/dist/domain/rules/text.rule.d.ts +1 -1
- package/dist/domain/rules/text.rule.d.ts.map +1 -1
- package/dist/domain/rules/text.rule.js +4 -7
- package/dist/domain/rules/text.rule.js.map +1 -1
- package/dist/domain/rules/value-violation.js +1 -2
- package/dist/domain/rules/value-violation.js.map +1 -1
- package/dist/http/domain-error-http-status.d.ts +1 -1
- package/dist/http/domain-error-http-status.d.ts.map +1 -1
- package/dist/http/domain-error-http-status.js +9 -12
- package/dist/http/domain-error-http-status.js.map +1 -1
- package/dist/http/index.d.ts +1 -1
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +1 -17
- package/dist/http/index.js.map +1 -1
- package/dist/index.d.ts +5 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -21
- package/dist/index.js.map +1 -1
- package/dist/persistence/cache/cache-logger.js +2 -6
- package/dist/persistence/cache/cache-logger.js.map +1 -1
- package/dist/persistence/cache/memory.cache.d.ts +1 -1
- package/dist/persistence/cache/memory.cache.d.ts.map +1 -1
- package/dist/persistence/cache/memory.cache.js +4 -8
- package/dist/persistence/cache/memory.cache.js.map +1 -1
- package/dist/persistence/command-repository.abstract.d.ts +2 -2
- package/dist/persistence/command-repository.abstract.d.ts.map +1 -1
- package/dist/persistence/command-repository.abstract.js +1 -5
- package/dist/persistence/command-repository.abstract.js.map +1 -1
- package/dist/persistence/decorators/acknowledge-persisted.decorator.js +1 -4
- package/dist/persistence/decorators/acknowledge-persisted.decorator.js.map +1 -1
- package/dist/persistence/decorators/cache.decorator.d.ts +1 -1
- package/dist/persistence/decorators/cache.decorator.d.ts.map +1 -1
- package/dist/persistence/decorators/cache.decorator.js +22 -26
- package/dist/persistence/decorators/cache.decorator.js.map +1 -1
- package/dist/persistence/decorators/from-cache.decorator.d.ts +3 -3
- package/dist/persistence/decorators/from-cache.decorator.d.ts.map +1 -1
- package/dist/persistence/decorators/from-cache.decorator.js +16 -20
- package/dist/persistence/decorators/from-cache.decorator.js.map +1 -1
- package/dist/persistence/decorators/map-persistence-errors.decorator.d.ts +1 -1
- package/dist/persistence/decorators/map-persistence-errors.decorator.d.ts.map +1 -1
- package/dist/persistence/decorators/map-persistence-errors.decorator.js +3 -6
- package/dist/persistence/decorators/map-persistence-errors.decorator.js.map +1 -1
- package/dist/persistence/decorators/persisted-write.decorator.d.ts +4 -4
- package/dist/persistence/decorators/persisted-write.decorator.d.ts.map +1 -1
- package/dist/persistence/decorators/persisted-write.decorator.js +7 -10
- package/dist/persistence/decorators/persisted-write.decorator.js.map +1 -1
- package/dist/persistence/helpers/cache-barrier.helper.js +4 -8
- package/dist/persistence/helpers/cache-barrier.helper.js.map +1 -1
- package/dist/persistence/helpers/cache-key.helper.d.ts +1 -1
- package/dist/persistence/helpers/cache-key.helper.d.ts.map +1 -1
- package/dist/persistence/helpers/cache-key.helper.js +11 -15
- package/dist/persistence/helpers/cache-key.helper.js.map +1 -1
- package/dist/persistence/helpers/cache-owner.helper.d.ts +1 -1
- package/dist/persistence/helpers/cache-owner.helper.d.ts.map +1 -1
- package/dist/persistence/helpers/cache-owner.helper.js +4 -7
- package/dist/persistence/helpers/cache-owner.helper.js.map +1 -1
- package/dist/persistence/helpers/cache-snapshot.helper.js +1 -4
- package/dist/persistence/helpers/cache-snapshot.helper.js.map +1 -1
- package/dist/persistence/helpers/cache-version.helper.js +5 -8
- package/dist/persistence/helpers/cache-version.helper.js.map +1 -1
- package/dist/persistence/index.d.ts +14 -14
- package/dist/persistence/index.d.ts.map +1 -1
- package/dist/persistence/index.js +14 -30
- package/dist/persistence/index.js.map +1 -1
- package/dist/persistence/persistence-dialect.js +2 -6
- package/dist/persistence/persistence-dialect.js.map +1 -1
- package/dist/persistence/query-repository.abstract.d.ts +3 -3
- package/dist/persistence/query-repository.abstract.d.ts.map +1 -1
- package/dist/persistence/query-repository.abstract.js +1 -5
- package/dist/persistence/query-repository.abstract.js.map +1 -1
- package/dist/types/Method.type.js +1 -2
- package/dist/types/Method.type.js.map +1 -1
- package/package.json +6 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"acknowledge-persisted.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/acknowledge-persisted.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"acknowledge-persisted.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/acknowledge-persisted.decorator.ts"],"names":[],"mappings":"AAgBA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+DG;AACH,MAAM,UAAU,oBAAoB,CAA0B,OAE7D;IACC,OAAO,CACL,OAAe,EACf,IAAqB,EACrB,UAAyE,EACnE,EAAE;QACR,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;QAClC,IAAI,OAAO,QAAQ,KAAK,UAAU;YAChC,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAClE,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAW;YAC/C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;YAC/B,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAChD,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/cache.decorator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/cache.decorator.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA2C7D;;GAEG;AACH,MAAM,WAAW,YAAY,CAAC,OAAO,GAAG,OAAO;IAC7C;;;OAGG;IACH,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,GAAG,IAAI,CAAC;IAE9C;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAEpD;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,IAAI,CAAC;IAExD;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;;OAIG;IACH,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;IAEnE;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,QAAS,CAAC;AAE7C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO,GAAG,IAAI,EAC/D,eAAe,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,EAC7E,YAAY,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,IAAI,EACrD,gBAAgB,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,MAAM,EAAE,CAAC,GAAG,IAAI,GACxD,eAAe,CAmKjB"}
|
|
@@ -1,15 +1,11 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
const cache_snapshot_helper_1 = require("../helpers/cache-snapshot.helper");
|
|
11
|
-
const cache_version_helper_1 = require("../helpers/cache-version.helper");
|
|
12
|
-
const defaultLogger = (0, cache_logger_1.consoleCacheLogger)('CacheDecorator');
|
|
2
|
+
import { isVersionedCache, } from '../../application/ports/cache.port.js';
|
|
3
|
+
import { consoleCacheLogger, safeWarn } from '../cache/cache-logger.js';
|
|
4
|
+
import { createCacheMutationBarrier, } from '../helpers/cache-barrier.helper.js';
|
|
5
|
+
import { reportMissingCacheProperty } from '../helpers/cache-owner.helper.js';
|
|
6
|
+
import { toCacheSnapshot } from '../helpers/cache-snapshot.helper.js';
|
|
7
|
+
import { isCacheNewer } from '../helpers/cache-version.helper.js';
|
|
8
|
+
const defaultLogger = consoleCacheLogger('CacheDecorator');
|
|
13
9
|
function errorMessage(err) {
|
|
14
10
|
return err instanceof Error ? err.message : String(err);
|
|
15
11
|
}
|
|
@@ -24,11 +20,11 @@ function errorMessage(err) {
|
|
|
24
20
|
* and wherever it meets a barrier it treats it as a miss, never as a snapshot.
|
|
25
21
|
*/
|
|
26
22
|
async function evictKey(cache, key, reason, entity, barrierTtl) {
|
|
27
|
-
if (
|
|
23
|
+
if (isVersionedCache(cache)) {
|
|
28
24
|
await cache.invalidate(key);
|
|
29
25
|
return;
|
|
30
26
|
}
|
|
31
|
-
const barrier =
|
|
27
|
+
const barrier = createCacheMutationBarrier(reason, entity);
|
|
32
28
|
await cache.set(key, barrier, { ttl: barrierTtl });
|
|
33
29
|
}
|
|
34
30
|
/**
|
|
@@ -36,7 +32,7 @@ async function evictKey(cache, key, reason, entity, barrierTtl) {
|
|
|
36
32
|
* that started before the mutation, short enough that deleted aggregates do not
|
|
37
33
|
* accumulate keys indefinitely.
|
|
38
34
|
*/
|
|
39
|
-
|
|
35
|
+
export const DEFAULT_BARRIER_TTL_MS = 60_000;
|
|
40
36
|
/**
|
|
41
37
|
* Write-through cache decorator for a {@link CommandRepository} `save` method.
|
|
42
38
|
*
|
|
@@ -76,7 +72,7 @@ exports.DEFAULT_BARRIER_TTL_MS = 60_000;
|
|
|
76
72
|
* async save(user: User): Promise<null> { ... }
|
|
77
73
|
* ```
|
|
78
74
|
*/
|
|
79
|
-
function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
75
|
+
export function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
80
76
|
const options = typeof setKeyOrOptions === 'function' || setKeyOrOptions === null
|
|
81
77
|
? {
|
|
82
78
|
setKey: setKeyOrOptions,
|
|
@@ -91,9 +87,9 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
91
87
|
const resolvedDeleteKeys = options.deleteKeys ?? null;
|
|
92
88
|
const resolvedInvalidateKeys = options.invalidateKeys ?? null;
|
|
93
89
|
const resolvedTtl = options.ttl;
|
|
94
|
-
const resolvedBarrierTtl = options.barrierTtl ??
|
|
90
|
+
const resolvedBarrierTtl = options.barrierTtl ?? DEFAULT_BARRIER_TTL_MS;
|
|
95
91
|
const logger = options.logger ?? defaultLogger;
|
|
96
|
-
const resolvedIsNewer = options.isNewer === null ? undefined : (options.isNewer ??
|
|
92
|
+
const resolvedIsNewer = options.isNewer === null ? undefined : (options.isNewer ?? isCacheNewer);
|
|
97
93
|
if (!resolvedSetKey && !resolvedDeleteKeys && !resolvedInvalidateKeys) {
|
|
98
94
|
throw new Error('@Cache decorator requires at least one of setKey, deleteKeys, or invalidateKeys to be specified.');
|
|
99
95
|
}
|
|
@@ -107,7 +103,7 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
107
103
|
let observedKey;
|
|
108
104
|
let observedRevision;
|
|
109
105
|
let observedValue;
|
|
110
|
-
if (this.cache && resolvedSetKey &&
|
|
106
|
+
if (this.cache && resolvedSetKey && isVersionedCache(this.cache)) {
|
|
111
107
|
try {
|
|
112
108
|
observedKey = resolvedSetKey(entity);
|
|
113
109
|
const state = await this.cache.readState(observedKey);
|
|
@@ -121,7 +117,7 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
121
117
|
}
|
|
122
118
|
const result = await original.call(this, entity);
|
|
123
119
|
if (!this.cache) {
|
|
124
|
-
|
|
120
|
+
reportMissingCacheProperty(this, '@Cache', options.logger);
|
|
125
121
|
return result;
|
|
126
122
|
}
|
|
127
123
|
// Cache maintenance is best-effort: the DB write already succeeded,
|
|
@@ -137,7 +133,7 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
137
133
|
catch (err) {
|
|
138
134
|
const keyOption = deleting ? 'deleteKeys' : 'invalidateKeys';
|
|
139
135
|
const operation = deleting ? 'cache eviction' : 'cache maintenance';
|
|
140
|
-
|
|
136
|
+
safeWarn(logger, `Failed resolving ${keyOption} during ${operation}: ${errorMessage(err)}`);
|
|
141
137
|
}
|
|
142
138
|
for (const key of keys) {
|
|
143
139
|
try {
|
|
@@ -145,7 +141,7 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
145
141
|
}
|
|
146
142
|
catch (err) {
|
|
147
143
|
const action = deleting ? 'evicting deletion' : 'invalidating';
|
|
148
|
-
|
|
144
|
+
safeWarn(logger, `Failed ${action} key "${key}": ${errorMessage(err)}`);
|
|
149
145
|
}
|
|
150
146
|
}
|
|
151
147
|
}
|
|
@@ -157,12 +153,12 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
157
153
|
setKey = resolvedSetKey(entity);
|
|
158
154
|
}
|
|
159
155
|
catch (err) {
|
|
160
|
-
|
|
156
|
+
safeWarn(logger, `Failed resolving setKey during cache maintenance: ${errorMessage(err)}`);
|
|
161
157
|
}
|
|
162
158
|
if (setKey) {
|
|
163
159
|
try {
|
|
164
|
-
const snapshot =
|
|
165
|
-
if (
|
|
160
|
+
const snapshot = toCacheSnapshot(result);
|
|
161
|
+
if (isVersionedCache(this.cache)) {
|
|
166
162
|
if (observedRevision !== undefined && setKey === observedKey) {
|
|
167
163
|
// Skip the write-through when the snapshot observed before
|
|
168
164
|
// persistence is already newer; otherwise commit it only if
|
|
@@ -185,13 +181,13 @@ function Cache(setKeyOrOptions, deleteKeysFn, invalidateKeysFn) {
|
|
|
185
181
|
}
|
|
186
182
|
}
|
|
187
183
|
catch (err) {
|
|
188
|
-
|
|
184
|
+
safeWarn(logger, `Failed setting cache key "${setKey}": ${errorMessage(err)}`);
|
|
189
185
|
}
|
|
190
186
|
}
|
|
191
187
|
}
|
|
192
188
|
}
|
|
193
189
|
catch (err) {
|
|
194
|
-
|
|
190
|
+
safeWarn(logger, `Unexpected error during cache maintenance: ${errorMessage(err)}`);
|
|
195
191
|
}
|
|
196
192
|
return result;
|
|
197
193
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/cache.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/cache.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { IQueryOptions } from '../../application/query.options';
|
|
2
|
-
import type { ICacheLogger } from '../cache/cache-logger';
|
|
3
|
-
import { isCacheNewer } from '../helpers/cache-version.helper';
|
|
1
|
+
import { IQueryOptions } from '../../application/query.options.js';
|
|
2
|
+
import type { ICacheLogger } from '../cache/cache-logger.js';
|
|
3
|
+
import { isCacheNewer } from '../helpers/cache-version.helper.js';
|
|
4
4
|
export { isCacheNewer };
|
|
5
5
|
/**
|
|
6
6
|
* Options for configuring read-through caching and rehydration via {@link FromCache}.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-cache.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/from-cache.decorator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"from-cache.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/from-cache.decorator.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAK7D,OAAO,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMlE,OAAO,EAAE,YAAY,EAAE,CAAC;AAsBxB;;GAEG;AACH,MAAM,WAAW,gBAAgB,CAAC,MAAM,GAAG,OAAO,EAAE,OAAO,GAAG,OAAO;IACnE;;;OAGG;IACH,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IAElD;;;;OAIG;IACH,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;IAElD;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,GAAG,IAAI,CAAC;IAEpD;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IAExB;;OAEG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC;IAEb;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,KAAK,OAAO,CAAC;IAE1D;;;;OAIG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AA8BD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,SAAS,CACvB,MAAM,SAAS,aAAa,GAAG,aAAa,EAC5C,OAAO,GAAG,OAAO,EAEjB,cAAc,EACV,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC,GAClC,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,kBAAkB,CAAC,EACf,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,GAC9B,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,EACrC,YAAY,CAAC,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/C,eAAe,CAyIjB"}
|
|
@@ -1,16 +1,12 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const cache_version_helper_1 = require("../helpers/cache-version.helper");
|
|
12
|
-
Object.defineProperty(exports, "isCacheNewer", { enumerable: true, get: function () { return cache_version_helper_1.isCacheNewer; } });
|
|
13
|
-
const defaultLogger = (0, cache_logger_1.consoleCacheLogger)('FromCacheDecorator');
|
|
2
|
+
import { isVersionedCache, } from '../../application/ports/cache.port.js';
|
|
3
|
+
import { consoleCacheLogger, safeWarn } from '../cache/cache-logger.js';
|
|
4
|
+
import { isCacheMutationBarrier } from '../helpers/cache-barrier.helper.js';
|
|
5
|
+
import { reportMissingCacheProperty } from '../helpers/cache-owner.helper.js';
|
|
6
|
+
import { toCacheSnapshot } from '../helpers/cache-snapshot.helper.js';
|
|
7
|
+
import { isCacheNewer } from '../helpers/cache-version.helper.js';
|
|
8
|
+
export { isCacheNewer };
|
|
9
|
+
const defaultLogger = consoleCacheLogger('FromCacheDecorator');
|
|
14
10
|
const warnedUnversionedAdapters = new WeakSet();
|
|
15
11
|
/**
|
|
16
12
|
* Reports an unversioned adapter once per instance: a silent loss of caching is
|
|
@@ -20,7 +16,7 @@ function warnUnversionedAdapterOnce(cache, logger) {
|
|
|
20
16
|
if (warnedUnversionedAdapters.has(cache))
|
|
21
17
|
return;
|
|
22
18
|
warnedUnversionedAdapters.add(cache);
|
|
23
|
-
|
|
19
|
+
safeWarn(logger, `${cache.constructor?.name ?? 'Cache adapter'} implements only get/set/delete, ` +
|
|
24
20
|
'so @FromCache read-through is disabled for repositories using it. ' +
|
|
25
21
|
'Implement IVersionedCache (readState/invalidate/tryFill) to enable ' +
|
|
26
22
|
'revision-fenced caching.');
|
|
@@ -60,7 +56,7 @@ function isPlainData(value, ancestors = new WeakSet()) {
|
|
|
60
56
|
* - **Bounded retry**: Contended fills inspect current cache state and boundedly retry authoritative reads before
|
|
61
57
|
* falling back to un-cached database results.
|
|
62
58
|
*/
|
|
63
|
-
function FromCache(keyFnOrOptions, hydrateFnOrOptions, extraOptions) {
|
|
59
|
+
export function FromCache(keyFnOrOptions, hydrateFnOrOptions, extraOptions) {
|
|
64
60
|
const positionalKey = typeof keyFnOrOptions === 'function';
|
|
65
61
|
const positionalHydrator = positionalKey && typeof hydrateFnOrOptions === 'function';
|
|
66
62
|
let resolvedOptions = positionalKey ? hydrateFnOrOptions : keyFnOrOptions;
|
|
@@ -83,7 +79,7 @@ function FromCache(keyFnOrOptions, hydrateFnOrOptions, extraOptions) {
|
|
|
83
79
|
const original = descriptor.value;
|
|
84
80
|
descriptor.value = async function (query) {
|
|
85
81
|
if (!this.cache) {
|
|
86
|
-
|
|
82
|
+
reportMissingCacheProperty(this, '@FromCache', resolvedOptions?.logger);
|
|
87
83
|
return original.call(this, query);
|
|
88
84
|
}
|
|
89
85
|
if (query.refresh)
|
|
@@ -112,9 +108,9 @@ function FromCache(keyFnOrOptions, hydrateFnOrOptions, extraOptions) {
|
|
|
112
108
|
const isUsableSnapshot = (state) => state.status === 'hit' &&
|
|
113
109
|
state.value !== undefined &&
|
|
114
110
|
state.value !== null &&
|
|
115
|
-
!
|
|
111
|
+
!isCacheMutationBarrier(state.value);
|
|
116
112
|
// 1. Versioned coordination path (capable adapters)
|
|
117
|
-
if (
|
|
113
|
+
if (isVersionedCache(this.cache)) {
|
|
118
114
|
let observedState = await this.cache.readState(key);
|
|
119
115
|
if (isUsableSnapshot(observedState)) {
|
|
120
116
|
return hydrateCached(observedState.value);
|
|
@@ -133,19 +129,19 @@ function FromCache(keyFnOrOptions, hydrateFnOrOptions, extraOptions) {
|
|
|
133
129
|
if (!hydrateFn && (serializeFn || !isPlainData(result))) {
|
|
134
130
|
if (!reportedUncacheable) {
|
|
135
131
|
reportedUncacheable = true;
|
|
136
|
-
|
|
132
|
+
safeWarn(logger, `${this.constructor.name} caches a result that a hit could not reproduce without a hydrateFn; ` +
|
|
137
133
|
'the result is returned uncached. Configure a hydrateFn or return plain data.');
|
|
138
134
|
}
|
|
139
135
|
return result;
|
|
140
136
|
}
|
|
141
|
-
const snapshot =
|
|
137
|
+
const snapshot = toCacheSnapshot(result, serializeFn);
|
|
142
138
|
const committed = await this.cache.tryFill(key, observedState.revision, snapshot, { ttl: resolvedOptions?.ttl });
|
|
143
139
|
if (committed) {
|
|
144
140
|
return result;
|
|
145
141
|
}
|
|
146
142
|
const currentState = await this.cache.readState(key);
|
|
147
143
|
if (isUsableSnapshot(currentState)) {
|
|
148
|
-
const newerCheck = resolvedOptions?.isNewer ??
|
|
144
|
+
const newerCheck = resolvedOptions?.isNewer ?? isCacheNewer;
|
|
149
145
|
if (newerCheck(currentState.value, snapshot)) {
|
|
150
146
|
return hydrateCached(currentState.value);
|
|
151
147
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-cache.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/from-cache.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"from-cache.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/from-cache.decorator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type IPersistenceDialect } from '../persistence-dialect';
|
|
1
|
+
import { type IPersistenceDialect } from '../persistence-dialect.js';
|
|
2
2
|
/**
|
|
3
3
|
* Domain errors per violated unique constraint, keyed by the entity property the
|
|
4
4
|
* constraint covers. A multi-column constraint has no single property: key it by
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-persistence-errors.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/map-persistence-errors.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,mBAAmB,EAEzB,MAAM,
|
|
1
|
+
{"version":3,"file":"map-persistence-errors.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/map-persistence-errors.decorator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,mBAAmB,EAEzB,MAAM,2BAA2B,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,MAAM,YAAY,CAAC,OAAO,EAAE,WAAW,SAAS,MAAM,GAAG,KAAK,IAAI;IACtE,QAAQ,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,OAAO,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,EAAE,CAC7D,MAAM,EAAE,OAAO,KACZ,KAAK;CACX,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,SAAS,OAAO,EAAE,EACvB,OAAO,EACP,WAAW,SAAS,MAAM,GAAG,KAAK,EAClC,KAAK,GAAG,OAAO,EACf,OAAO,EAAE;IACT,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;IACjC,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;;;;;;;;;;;;;;OAmBG;IACH,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;CACvE,IACS,OAAO,WACJ,MAAM,QACT,MAAM,GAAG,MAAM,cACT,uBAAuB,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,KACxE,IAAI,CA+BR"}
|
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MapPersistenceErrors = MapPersistenceErrors;
|
|
4
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
5
|
-
|
|
2
|
+
import { persistenceDialect, } from '../persistence-dialect.js';
|
|
6
3
|
/**
|
|
7
4
|
* Method decorator that intercepts persistence failures from the wrapped method and
|
|
8
5
|
* translates identifiable database unique constraint violations into domain exceptions.
|
|
@@ -54,7 +51,7 @@ const persistence_dialect_1 = require("../persistence-dialect");
|
|
|
54
51
|
* }
|
|
55
52
|
* ```
|
|
56
53
|
*/
|
|
57
|
-
function MapPersistenceErrors(options) {
|
|
54
|
+
export function MapPersistenceErrors(options) {
|
|
58
55
|
return (_target, _key, descriptor) => {
|
|
59
56
|
const original = descriptor.value;
|
|
60
57
|
if (typeof original !== 'function')
|
|
@@ -62,7 +59,7 @@ function MapPersistenceErrors(options) {
|
|
|
62
59
|
const unique = options.unique ?? {};
|
|
63
60
|
const hasUnique = Object.keys(unique).length > 0;
|
|
64
61
|
descriptor.value = async function (...args) {
|
|
65
|
-
const dialect = options.dialect ??
|
|
62
|
+
const dialect = options.dialect ?? persistenceDialect();
|
|
66
63
|
if (hasUnique && !dialect) {
|
|
67
64
|
throw new TypeError('Unique-constraint mapping needs a persistence dialect: call setPersistenceDialect() or pass { dialect }.');
|
|
68
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"map-persistence-errors.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/map-persistence-errors.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"map-persistence-errors.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/map-persistence-errors.decorator.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,OAAO,EAEL,kBAAkB,GACnB,MAAM,2BAA2B,CAAC;AAcnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkDG;AACH,MAAM,UAAU,oBAAoB,CAKlC,OAyBD;IACC,OAAO,CACL,OAAe,EACf,IAAqB,EACrB,UAAyE,EACnE,EAAE;QACR,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;QAClC,IAAI,OAAO,QAAQ,KAAK,UAAU;YAChC,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QAClE,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;QACjD,UAAU,CAAC,KAAK,GAAG,KAAK,WAAW,GAAG,IAAW;YAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC;YACxD,IAAI,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,IAAI,SAAS,CACjB,0GAA0G,CAC3G,CAAC;YACJ,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpC,MAAM,GAAG,GAAG,SAAS;oBACnB,CAAC,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,EAAE,MAAgB,CAAC;oBACnD,CAAC,CAAC,SAAS,CAAC;gBACd,MAAM,OAAO,GACX,GAAG,KAAK,SAAS;oBACf,CAAC,CAAC,SAAS;oBACX,CAAC,CAAE,MAAqD,CAAC,GAAG,CAAC,CAAC;gBAClE,IAAI,OAAO;oBAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;gBACnC,IAAI,OAAO,CAAC,SAAS;oBACnB,MAAM,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAa,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;gBAC7D,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { IPersistenceDialect } from '../persistence-dialect';
|
|
2
|
-
import { type PersistedAggregate } from './acknowledge-persisted.decorator';
|
|
3
|
-
import { type CacheOptions } from './cache.decorator';
|
|
4
|
-
import { type UniqueErrors } from './map-persistence-errors.decorator';
|
|
1
|
+
import type { IPersistenceDialect } from '../persistence-dialect.js';
|
|
2
|
+
import { type PersistedAggregate } from './acknowledge-persisted.decorator.js';
|
|
3
|
+
import { type CacheOptions } from './cache.decorator.js';
|
|
4
|
+
import { type UniqueErrors } from './map-persistence-errors.decorator.js';
|
|
5
5
|
/**
|
|
6
6
|
* Options for {@link PersistedWrite}. The aggregate is always the method's
|
|
7
7
|
* first argument.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persisted-write.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/persisted-write.decorator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"persisted-write.decorator.d.ts","sourceRoot":"","sources":["../../../persistence/decorators/persisted-write.decorator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAEL,KAAK,kBAAkB,EACxB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAE/C;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CACpC,OAAO,EACP,WAAW,SAAS,MAAM,GAAG,KAAK;IAElC;;;OAGG;IACH,KAAK,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,CAAC;IAE9B;;;OAGG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE5C,gFAAgF;IAChF,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC;CAC1D;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,cAAc,CAC5B,OAAO,SAAS,kBAAkB,EAClC,WAAW,SAAS,MAAM,GAAG,KAAK,EAClC,OAAO,GAAE,qBAAqB,CAAC,OAAO,EAAE,WAAW,CAAM,IAYjD,OAAO,UACL,MAAM,OACT,MAAM,GAAG,MAAM,cACR,uBAAuB,CAAC,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,KACzE,IAAI,CAKR"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const cache_decorator_1 = require("./cache.decorator");
|
|
7
|
-
const map_persistence_errors_decorator_1 = require("./map-persistence-errors.decorator");
|
|
2
|
+
import { AcknowledgePersisted, } from './acknowledge-persisted.decorator.js';
|
|
3
|
+
import { Cache } from './cache.decorator.js';
|
|
4
|
+
import { MapPersistenceErrors, } from './map-persistence-errors.decorator.js';
|
|
8
5
|
/**
|
|
9
6
|
* Applies the canonical persistence write lifecycle to a repository method
|
|
10
7
|
* whose first argument is the aggregate being written.
|
|
@@ -37,12 +34,12 @@ const map_persistence_errors_decorator_1 = require("./map-persistence-errors.dec
|
|
|
37
34
|
* async save(user: User): Promise<UserSnapshot> { ... }
|
|
38
35
|
* ```
|
|
39
36
|
*/
|
|
40
|
-
function PersistedWrite(options = {}) {
|
|
41
|
-
const cache = options.cache ?
|
|
42
|
-
const acknowledge =
|
|
37
|
+
export function PersistedWrite(options = {}) {
|
|
38
|
+
const cache = options.cache ? Cache(options.cache) : undefined;
|
|
39
|
+
const acknowledge = AcknowledgePersisted({
|
|
43
40
|
entity: ([entity]) => entity,
|
|
44
41
|
});
|
|
45
|
-
const mapErrors =
|
|
42
|
+
const mapErrors = MapPersistenceErrors({
|
|
46
43
|
entity: ([entity]) => entity,
|
|
47
44
|
unique: options.unique,
|
|
48
45
|
dialect: options.dialect,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persisted-write.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/persisted-write.decorator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"persisted-write.decorator.js","sourceRoot":"","sources":["../../../persistence/decorators/persisted-write.decorator.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAGtE,OAAO,EACL,oBAAoB,GAErB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAqB,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,oBAAoB,GAErB,MAAM,uCAAuC,CAAC;AAgC/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,cAAc,CAG5B,OAAO,GAAgD,EAAE;IACzD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAU,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACxE,MAAM,WAAW,GAAG,oBAAoB,CAAY;QAClD,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM;KAC7B,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,oBAAoB,CAAkC;QACtE,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,MAAM;QAC5B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,SAAS,EAAE,OAAO,CAAC,SAAS;KAC7B,CAAC,CAAC;IAEH,OAAO,CACL,MAAc,EACd,GAAoB,EACpB,UAA0E,EACpE,EAAE;QACR,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QACnC,WAAW,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;QACrC,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC;IACnC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
3
|
-
|
|
4
|
-
exports.createCacheMutationBarrier = createCacheMutationBarrier;
|
|
5
|
-
exports.isCacheMutationBarrier = isCacheMutationBarrier;
|
|
6
|
-
const uuidv7_1 = require("@cqrs-ddd/uuidv7");
|
|
2
|
+
import { uuidv7 } from '@cqrs-ddd/uuidv7';
|
|
7
3
|
/**
|
|
8
4
|
* Factory creating a new {@link CacheMutationBarrier} with a unique token.
|
|
9
5
|
*
|
|
@@ -17,7 +13,7 @@ const uuidv7_1 = require("@cqrs-ddd/uuidv7");
|
|
|
17
13
|
* await cache.set(key, barrier, { ttl: DEFAULT_BARRIER_TTL_MS });
|
|
18
14
|
* ```
|
|
19
15
|
*/
|
|
20
|
-
function createCacheMutationBarrier(reason, entity) {
|
|
16
|
+
export function createCacheMutationBarrier(reason, entity) {
|
|
21
17
|
const e = typeof entity === 'object' && entity !== null
|
|
22
18
|
? entity
|
|
23
19
|
: undefined;
|
|
@@ -29,7 +25,7 @@ function createCacheMutationBarrier(reason, entity) {
|
|
|
29
25
|
: undefined;
|
|
30
26
|
return {
|
|
31
27
|
__cacheBarrier: true,
|
|
32
|
-
token:
|
|
28
|
+
token: uuidv7(),
|
|
33
29
|
reason,
|
|
34
30
|
createdAt: Date.now(),
|
|
35
31
|
...(aggregateId !== undefined ? { aggregateId } : {}),
|
|
@@ -49,7 +45,7 @@ function createCacheMutationBarrier(reason, entity) {
|
|
|
49
45
|
* }
|
|
50
46
|
* ```
|
|
51
47
|
*/
|
|
52
|
-
function isCacheMutationBarrier(value) {
|
|
48
|
+
export function isCacheMutationBarrier(value) {
|
|
53
49
|
return (typeof value === 'object' &&
|
|
54
50
|
value !== null &&
|
|
55
51
|
value.__cacheBarrier === true);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-barrier.helper.js","sourceRoot":"","sources":["../../../persistence/helpers/cache-barrier.helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-barrier.helper.js","sourceRoot":"","sources":["../../../persistence/helpers/cache-barrier.helper.ts"],"names":[],"mappings":"AAAA,sEAAsE;AAEtE,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAmD1C;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAA0B,EAC1B,MAAgB;IAEhB,MAAM,CAAC,GACL,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAC3C,CAAC,CAAE,MAAkC;QACrC,CAAC,CAAC,SAAS,CAAC;IAEhB,MAAM,WAAW,GAAG,OAAO,CAAC,EAAE,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,MAAM,OAAO,GACX,OAAO,CAAC,EAAE,OAAO,KAAK,QAAQ;QAC5B,CAAC,CAAC,CAAC,CAAC,OAAO;QACX,CAAC,CAAC,OAAQ,CAA4B,EAAE,QAAQ,KAAK,QAAQ;YAC3D,CAAC,CAAG,CAA0B,CAAC,QAAmB;YAClD,CAAC,CAAC,SAAS,CAAC;IAElB,OAAO;QACL,cAAc,EAAE,IAAI;QACpB,KAAK,EAAE,MAAM,EAAE;QACf,MAAM;QACN,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrD,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9C,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAc;IAEd,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAAiC,CAAC,cAAc,KAAK,IAAI,CAC3D,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-key.helper.d.ts","sourceRoot":"","sources":["../../../persistence/helpers/cache-key.helper.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-key.helper.d.ts","sourceRoot":"","sources":["../../../persistence/helpers/cache-key.helper.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,sCAAsC,CAAC;AAE9C;;;;GAIG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG;IAAE,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzE;;;;;;;GAOG;AACH,MAAM,MAAM,oBAAoB,GAAG,YAAY,CAAC;AAEhD;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACxC;AAmCD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,QAAQ,CACtB,gBAAgB,EAAE,sBAAsB,EACxC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACnC,eAAe,CAAC,EAAE,oBAAoB,GACrC,MAAM,CA0BR;AAiBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC1D,QAAQ,EAAE,MAAM,EAChB,eAAe,CAAC,EAAE,oBAAoB,GACrC,CAAC,MAAM,EAAE,CAAC,GAAG,sBAAsB,KAAK,MAAM,CA8BhD"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/* Copyright (C) 2026-present Aristotelis — see repository license. */
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
const node_crypto_1 = require("node:crypto");
|
|
7
|
-
const safe_stringify_1 = require("@cqrs-ddd/safe-stringify");
|
|
8
|
-
const tenant_resolver_1 = require("../../application/tenant-resolver");
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { escapeKeySegment, stableStringify } from '@cqrs-ddd/safe-stringify';
|
|
4
|
+
import { requireTenant, } from '../../application/tenant-resolver.js';
|
|
9
5
|
/**
|
|
10
6
|
* Normalizes filter conditions for canonical tuple construction:
|
|
11
7
|
* - Omits undefined properties.
|
|
@@ -50,8 +46,8 @@ function normalizeFilterConditions(conditions) {
|
|
|
50
46
|
* @throws {MissingTenantContextError} When tenant identity cannot be resolved.
|
|
51
47
|
* @throws {TypeError} When conditions contain non-serializable values.
|
|
52
48
|
*/
|
|
53
|
-
function cacheKey(resourceOrEntity, conditions, tenantOrContext) {
|
|
54
|
-
const schema =
|
|
49
|
+
export function cacheKey(resourceOrEntity, conditions, tenantOrContext) {
|
|
50
|
+
const schema = requireTenant('cache key derivation', tenantOrContext);
|
|
55
51
|
let resource;
|
|
56
52
|
if (typeof resourceOrEntity === 'string') {
|
|
57
53
|
resource = resourceOrEntity;
|
|
@@ -67,8 +63,8 @@ function cacheKey(resourceOrEntity, conditions, tenantOrContext) {
|
|
|
67
63
|
resource = resource.replace(/:+$/, '');
|
|
68
64
|
const normalizedFilter = normalizeFilterConditions(conditions);
|
|
69
65
|
const tuple = [schema, resource, normalizedFilter];
|
|
70
|
-
const serializedTuple =
|
|
71
|
-
const hash =
|
|
66
|
+
const serializedTuple = stableStringify(tuple);
|
|
67
|
+
const hash = createHash('sha256').update(serializedTuple).digest('hex');
|
|
72
68
|
return `${schema}:${resource}:v1:${hash}`;
|
|
73
69
|
}
|
|
74
70
|
/**
|
|
@@ -81,9 +77,9 @@ function cacheKey(resourceOrEntity, conditions, tenantOrContext) {
|
|
|
81
77
|
*/
|
|
82
78
|
function canonicalizeValue(val) {
|
|
83
79
|
if (typeof val === 'object') {
|
|
84
|
-
return
|
|
80
|
+
return stableStringify(val);
|
|
85
81
|
}
|
|
86
|
-
return
|
|
82
|
+
return escapeKeySegment(String(val));
|
|
87
83
|
}
|
|
88
84
|
/**
|
|
89
85
|
* Resolves a template string (e.g. `user:{userId}`) against a query/command payload,
|
|
@@ -109,13 +105,13 @@ function canonicalizeValue(val) {
|
|
|
109
105
|
* // tenant-a:user:019...
|
|
110
106
|
* ```
|
|
111
107
|
*/
|
|
112
|
-
function cacheKeyTemplate(template, tenantOrContext) {
|
|
108
|
+
export function cacheKeyTemplate(template, tenantOrContext) {
|
|
113
109
|
return (source) => {
|
|
114
110
|
const ctx = source && typeof source === 'object' && 'request' in source
|
|
115
111
|
? source
|
|
116
112
|
: undefined;
|
|
117
113
|
const data = (ctx ? ctx.request : source);
|
|
118
|
-
const schema =
|
|
114
|
+
const schema = requireTenant('cache key derivation', tenantOrContext ?? ctx);
|
|
119
115
|
const resolved = template.replace(/\{(\w+)(\?)?\}/g, (_, prop, optional) => {
|
|
120
116
|
const val = data?.[prop];
|
|
121
117
|
if (val !== undefined && val !== null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-key.helper.js","sourceRoot":"","sources":["../../../persistence/helpers/cache-key.helper.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cache-key.helper.js","sourceRoot":"","sources":["../../../persistence/helpers/cache-key.helper.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ICacheLogger } from '../cache/cache-logger';
|
|
1
|
+
import type { ICacheLogger } from '../cache/cache-logger.js';
|
|
2
2
|
/**
|
|
3
3
|
* Reports, once per repository class, a cache decorator running on an instance
|
|
4
4
|
* that has no `cache` property. Such a repository is miswired: cache
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache-owner.helper.d.ts","sourceRoot":"","sources":["../../../persistence/helpers/cache-owner.helper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"cache-owner.helper.d.ts","sourceRoot":"","sources":["../../../persistence/helpers/cache-owner.helper.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAM7D;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,QAAQ,GAAG,YAAY,EAClC,MAAM,GAAE,YAA4B,GACnC,IAAI,CASN"}
|