@ddd-ts-kit/aspects 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +381 -2
- package/dist/aspect/advice-factory.d.ts +9 -0
- package/dist/aspect/advice-factory.d.ts.map +1 -0
- package/dist/aspect/advice-factory.js +2 -0
- package/dist/aspect/advice-factory.js.map +1 -0
- package/dist/aspect/advice.d.ts +3 -0
- package/dist/aspect/advice.d.ts.map +1 -0
- package/dist/aspect/advice.js +2 -0
- package/dist/aspect/advice.js.map +1 -0
- package/dist/aspect/aspect-info.d.ts +12 -0
- package/dist/aspect/aspect-info.d.ts.map +1 -0
- package/dist/aspect/aspect-info.js +2 -0
- package/dist/aspect/aspect-info.js.map +1 -0
- package/dist/aspect/aspect-kind.d.ts +4 -0
- package/dist/aspect/aspect-kind.d.ts.map +1 -0
- package/dist/aspect/aspect-kind.js +2 -0
- package/dist/aspect/aspect-kind.js.map +1 -0
- package/dist/aspect/aspect-origins.d.ts +10 -0
- package/dist/aspect/aspect-origins.d.ts.map +1 -0
- package/dist/aspect/aspect-origins.js +3 -0
- package/dist/aspect/aspect-origins.js.map +1 -0
- package/dist/aspect/aspect.d.ts +9 -0
- package/dist/aspect/aspect.d.ts.map +1 -0
- package/dist/aspect/aspect.js +2 -0
- package/dist/aspect/aspect.js.map +1 -0
- package/dist/aspect/compose.d.ts +7 -0
- package/dist/aspect/compose.d.ts.map +1 -0
- package/dist/aspect/compose.js +11 -0
- package/dist/aspect/compose.js.map +1 -0
- package/dist/aspect/define-aspect.d.ts +5 -0
- package/dist/aspect/define-aspect.d.ts.map +1 -0
- package/dist/aspect/define-aspect.js +17 -0
- package/dist/aspect/define-aspect.js.map +1 -0
- package/dist/aspect/invocation.d.ts +6 -0
- package/dist/aspect/invocation.d.ts.map +1 -0
- package/dist/aspect/invocation.js +2 -0
- package/dist/aspect/invocation.js.map +1 -0
- package/dist/aspect/join-point.d.ts +13 -0
- package/dist/aspect/join-point.d.ts.map +1 -0
- package/dist/aspect/join-point.js +2 -0
- package/dist/aspect/join-point.js.map +1 -0
- package/dist/aspect/selector.d.ts +3 -0
- package/dist/aspect/selector.d.ts.map +1 -0
- package/dist/aspect/selector.js +2 -0
- package/dist/aspect/selector.js.map +1 -0
- package/dist/aspect/selectors.d.ts +14 -0
- package/dist/aspect/selectors.d.ts.map +1 -0
- package/dist/aspect/selectors.js +32 -0
- package/dist/aspect/selectors.js.map +1 -0
- package/dist/aspect/when.d.ts +8 -0
- package/dist/aspect/when.d.ts.map +1 -0
- package/dist/aspect/when.js +21 -0
- package/dist/aspect/when.js.map +1 -0
- package/dist/bulkhead/bulkhead-options.d.ts +10 -0
- package/dist/bulkhead/bulkhead-options.d.ts.map +1 -0
- package/dist/bulkhead/bulkhead-options.js +2 -0
- package/dist/bulkhead/bulkhead-options.js.map +1 -0
- package/dist/bulkhead/bulkhead.d.ts +11 -0
- package/dist/bulkhead/bulkhead.d.ts.map +1 -0
- package/dist/bulkhead/bulkhead.js +22 -0
- package/dist/bulkhead/bulkhead.js.map +1 -0
- package/dist/bulkhead/compartment.d.ts +13 -0
- package/dist/bulkhead/compartment.d.ts.map +1 -0
- package/dist/bulkhead/compartment.js +40 -0
- package/dist/bulkhead/compartment.js.map +1 -0
- package/dist/cached/cached.d.ts +26 -0
- package/dist/cached/cached.d.ts.map +1 -0
- package/dist/cached/cached.js +64 -0
- package/dist/cached/cached.js.map +1 -0
- package/dist/circuit-breaker/circuit-breaker-options.d.ts +20 -0
- package/dist/circuit-breaker/circuit-breaker-options.d.ts.map +1 -0
- package/dist/circuit-breaker/circuit-breaker-options.js +2 -0
- package/dist/circuit-breaker/circuit-breaker-options.js.map +1 -0
- package/dist/circuit-breaker/circuit-breaker.d.ts +11 -0
- package/dist/circuit-breaker/circuit-breaker.d.ts.map +1 -0
- package/dist/circuit-breaker/circuit-breaker.js +27 -0
- package/dist/circuit-breaker/circuit-breaker.js.map +1 -0
- package/dist/circuit-breaker/circuit-state-change.d.ts +10 -0
- package/dist/circuit-breaker/circuit-state-change.d.ts.map +1 -0
- package/dist/circuit-breaker/circuit-state-change.js +2 -0
- package/dist/circuit-breaker/circuit-state-change.js.map +1 -0
- package/dist/circuit-breaker/circuit-state-gauge.d.ts +8 -0
- package/dist/circuit-breaker/circuit-state-gauge.d.ts.map +1 -0
- package/dist/circuit-breaker/circuit-state-gauge.js +14 -0
- package/dist/circuit-breaker/circuit-state-gauge.js.map +1 -0
- package/dist/circuit-breaker/circuit-state.d.ts +2 -0
- package/dist/circuit-breaker/circuit-state.d.ts.map +1 -0
- package/dist/circuit-breaker/circuit-state.js +2 -0
- package/dist/circuit-breaker/circuit-state.js.map +1 -0
- package/dist/circuit-breaker/circuit.d.ts +22 -0
- package/dist/circuit-breaker/circuit.d.ts.map +1 -0
- package/dist/circuit-breaker/circuit.js +79 -0
- package/dist/circuit-breaker/circuit.js.map +1 -0
- package/dist/decorators/async-method-decorator.d.ts +13 -0
- package/dist/decorators/async-method-decorator.d.ts.map +1 -0
- package/dist/decorators/async-method-decorator.js +2 -0
- package/dist/decorators/async-method-decorator.js.map +1 -0
- package/dist/decorators/bulkhead.d.ts +5 -0
- package/dist/decorators/bulkhead.d.ts.map +1 -0
- package/dist/decorators/bulkhead.js +7 -0
- package/dist/decorators/bulkhead.js.map +1 -0
- package/dist/decorators/cached.d.ts +5 -0
- package/dist/decorators/cached.d.ts.map +1 -0
- package/dist/decorators/cached.js +7 -0
- package/dist/decorators/cached.js.map +1 -0
- package/dist/decorators/circuit-breaker.d.ts +5 -0
- package/dist/decorators/circuit-breaker.d.ts.map +1 -0
- package/dist/decorators/circuit-breaker.js +7 -0
- package/dist/decorators/circuit-breaker.js.map +1 -0
- package/dist/decorators/decorator-of.d.ts +9 -0
- package/dist/decorators/decorator-of.d.ts.map +1 -0
- package/dist/decorators/decorator-of.js +43 -0
- package/dist/decorators/decorator-of.js.map +1 -0
- package/dist/decorators/logged.d.ts +5 -0
- package/dist/decorators/logged.d.ts.map +1 -0
- package/dist/decorators/logged.js +7 -0
- package/dist/decorators/logged.js.map +1 -0
- package/dist/decorators/retry.d.ts +5 -0
- package/dist/decorators/retry.d.ts.map +1 -0
- package/dist/decorators/retry.js +7 -0
- package/dist/decorators/retry.js.map +1 -0
- package/dist/decorators/timed.d.ts +5 -0
- package/dist/decorators/timed.d.ts.map +1 -0
- package/dist/decorators/timed.js +7 -0
- package/dist/decorators/timed.js.map +1 -0
- package/dist/decorators/timeout.d.ts +5 -0
- package/dist/decorators/timeout.d.ts.map +1 -0
- package/dist/decorators/timeout.js +7 -0
- package/dist/decorators/timeout.js.map +1 -0
- package/dist/decorators.d.ts +10 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +9 -0
- package/dist/decorators.js.map +1 -0
- package/dist/di/aspects.d.ts +19 -0
- package/dist/di/aspects.d.ts.map +1 -0
- package/dist/di/aspects.js +22 -0
- package/dist/di/aspects.js.map +1 -0
- package/dist/errors/aspect-not-allowed-error.d.ts +6 -0
- package/dist/errors/aspect-not-allowed-error.d.ts.map +1 -0
- package/dist/errors/aspect-not-allowed-error.js +9 -0
- package/dist/errors/aspect-not-allowed-error.js.map +1 -0
- package/dist/errors/bulkhead-full-error.d.ts +7 -0
- package/dist/errors/bulkhead-full-error.d.ts.map +1 -0
- package/dist/errors/bulkhead-full-error.js +10 -0
- package/dist/errors/bulkhead-full-error.js.map +1 -0
- package/dist/errors/circuit-open-error.d.ts +11 -0
- package/dist/errors/circuit-open-error.d.ts.map +1 -0
- package/dist/errors/circuit-open-error.js +14 -0
- package/dist/errors/circuit-open-error.js.map +1 -0
- package/dist/errors/is-business-refusal.d.ts +3 -0
- package/dist/errors/is-business-refusal.d.ts.map +1 -0
- package/dist/errors/is-business-refusal.js +6 -0
- package/dist/errors/is-business-refusal.js.map +1 -0
- package/dist/errors/timeout-error.d.ts +8 -0
- package/dist/errors/timeout-error.d.ts.map +1 -0
- package/dist/errors/timeout-error.js +12 -0
- package/dist/errors/timeout-error.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +30 -0
- package/dist/index.js.map +1 -0
- package/dist/observability/log-call.d.ts +13 -0
- package/dist/observability/log-call.d.ts.map +1 -0
- package/dist/observability/log-call.js +22 -0
- package/dist/observability/log-call.js.map +1 -0
- package/dist/observability/logged.d.ts +22 -0
- package/dist/observability/logged.d.ts.map +1 -0
- package/dist/observability/logged.js +38 -0
- package/dist/observability/logged.js.map +1 -0
- package/dist/observability/logging-middleware.d.ts +13 -0
- package/dist/observability/logging-middleware.d.ts.map +1 -0
- package/dist/observability/logging-middleware.js +16 -0
- package/dist/observability/logging-middleware.js.map +1 -0
- package/dist/observability/metrics-middleware.d.ts +10 -0
- package/dist/observability/metrics-middleware.d.ts.map +1 -0
- package/dist/observability/metrics-middleware.js +12 -0
- package/dist/observability/metrics-middleware.js.map +1 -0
- package/dist/observability/observed.d.ts +14 -0
- package/dist/observability/observed.d.ts.map +1 -0
- package/dist/observability/observed.js +27 -0
- package/dist/observability/observed.js.map +1 -0
- package/dist/observability/safely.d.ts +3 -0
- package/dist/observability/safely.d.ts.map +1 -0
- package/dist/observability/safely.js +10 -0
- package/dist/observability/safely.js.map +1 -0
- package/dist/observability/stdout-logger.d.ts +45 -0
- package/dist/observability/stdout-logger.d.ts.map +1 -0
- package/dist/observability/stdout-logger.js +85 -0
- package/dist/observability/stdout-logger.js.map +1 -0
- package/dist/observability/time-call.d.ts +10 -0
- package/dist/observability/time-call.d.ts.map +1 -0
- package/dist/observability/time-call.js +11 -0
- package/dist/observability/time-call.js.map +1 -0
- package/dist/observability/timed.d.ts +19 -0
- package/dist/observability/timed.d.ts.map +1 -0
- package/dist/observability/timed.js +33 -0
- package/dist/observability/timed.js.map +1 -0
- package/dist/retry/backoff.d.ts +12 -0
- package/dist/retry/backoff.d.ts.map +1 -0
- package/dist/retry/backoff.js +2 -0
- package/dist/retry/backoff.js.map +1 -0
- package/dist/retry/delay-before-retry.d.ts +4 -0
- package/dist/retry/delay-before-retry.d.ts.map +1 -0
- package/dist/retry/delay-before-retry.js +10 -0
- package/dist/retry/delay-before-retry.js.map +1 -0
- package/dist/retry/full-jitter.d.ts +7 -0
- package/dist/retry/full-jitter.d.ts.map +1 -0
- package/dist/retry/full-jitter.js +8 -0
- package/dist/retry/full-jitter.js.map +1 -0
- package/dist/retry/is-transient.d.ts +6 -0
- package/dist/retry/is-transient.d.ts.map +1 -0
- package/dist/retry/is-transient.js +11 -0
- package/dist/retry/is-transient.js.map +1 -0
- package/dist/retry/jitter.d.ts +3 -0
- package/dist/retry/jitter.d.ts.map +1 -0
- package/dist/retry/jitter.js +2 -0
- package/dist/retry/jitter.js.map +1 -0
- package/dist/retry/no-jitter.d.ts +3 -0
- package/dist/retry/no-jitter.d.ts.map +1 -0
- package/dist/retry/no-jitter.js +2 -0
- package/dist/retry/no-jitter.js.map +1 -0
- package/dist/retry/retry.d.ts +20 -0
- package/dist/retry/retry.d.ts.map +1 -0
- package/dist/retry/retry.js +38 -0
- package/dist/retry/retry.js.map +1 -0
- package/dist/runtime/aspect-runtime-error.d.ts +6 -0
- package/dist/runtime/aspect-runtime-error.d.ts.map +1 -0
- package/dist/runtime/aspect-runtime-error.js +9 -0
- package/dist/runtime/aspect-runtime-error.js.map +1 -0
- package/dist/runtime/aspect-runtime.d.ts +15 -0
- package/dist/runtime/aspect-runtime.d.ts.map +1 -0
- package/dist/runtime/aspect-runtime.js +2 -0
- package/dist/runtime/aspect-runtime.js.map +1 -0
- package/dist/runtime/cache-or.d.ts +3 -0
- package/dist/runtime/cache-or.d.ts.map +1 -0
- package/dist/runtime/cache-or.js +6 -0
- package/dist/runtime/cache-or.js.map +1 -0
- package/dist/runtime/clock-or.d.ts +3 -0
- package/dist/runtime/clock-or.d.ts.map +1 -0
- package/dist/runtime/clock-or.js +7 -0
- package/dist/runtime/clock-or.js.map +1 -0
- package/dist/runtime/installed-runtime.d.ts +8 -0
- package/dist/runtime/installed-runtime.d.ts.map +1 -0
- package/dist/runtime/installed-runtime.js +16 -0
- package/dist/runtime/installed-runtime.js.map +1 -0
- package/dist/runtime/logger-or.d.ts +3 -0
- package/dist/runtime/logger-or.d.ts.map +1 -0
- package/dist/runtime/logger-or.js +6 -0
- package/dist/runtime/logger-or.js.map +1 -0
- package/dist/runtime/metrics-or.d.ts +3 -0
- package/dist/runtime/metrics-or.d.ts.map +1 -0
- package/dist/runtime/metrics-or.js +6 -0
- package/dist/runtime/metrics-or.js.map +1 -0
- package/dist/runtime/missing-collaborator.d.ts +2 -0
- package/dist/runtime/missing-collaborator.d.ts.map +1 -0
- package/dist/runtime/missing-collaborator.js +5 -0
- package/dist/runtime/missing-collaborator.js.map +1 -0
- package/dist/runtime/scheduler-or.d.ts +3 -0
- package/dist/runtime/scheduler-or.d.ts.map +1 -0
- package/dist/runtime/scheduler-or.js +6 -0
- package/dist/runtime/scheduler-or.js.map +1 -0
- package/dist/runtime/scheduler.d.ts +7 -0
- package/dist/runtime/scheduler.d.ts.map +1 -0
- package/dist/runtime/scheduler.js +5 -0
- package/dist/runtime/scheduler.js.map +1 -0
- package/dist/runtime/system-scheduler.d.ts +3 -0
- package/dist/runtime/system-scheduler.d.ts.map +1 -0
- package/dist/runtime/system-scheduler.js +9 -0
- package/dist/runtime/system-scheduler.js.map +1 -0
- package/dist/state/state-for.d.ts +5 -0
- package/dist/state/state-for.d.ts.map +1 -0
- package/dist/state/state-for.js +17 -0
- package/dist/state/state-for.js.map +1 -0
- package/dist/state/state-scope.d.ts +3 -0
- package/dist/state/state-scope.d.ts.map +1 -0
- package/dist/state/state-scope.js +2 -0
- package/dist/state/state-scope.js.map +1 -0
- package/dist/testing/create-aspect-fakes.d.ts +13 -0
- package/dist/testing/create-aspect-fakes.d.ts.map +1 -0
- package/dist/testing/create-aspect-fakes.js +15 -0
- package/dist/testing/create-aspect-fakes.js.map +1 -0
- package/dist/testing/manual-scheduler.d.ts +14 -0
- package/dist/testing/manual-scheduler.d.ts.map +1 -0
- package/dist/testing/manual-scheduler.js +30 -0
- package/dist/testing/manual-scheduler.js.map +1 -0
- package/dist/testing/with-aspect-runtime.d.ts +8 -0
- package/dist/testing/with-aspect-runtime.d.ts.map +1 -0
- package/dist/testing/with-aspect-runtime.js +10 -0
- package/dist/testing/with-aspect-runtime.js.map +1 -0
- package/dist/testing.d.ts +4 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +4 -0
- package/dist/testing.js.map +1 -0
- package/dist/timeout/timeout.d.ts +21 -0
- package/dist/timeout/timeout.d.ts.map +1 -0
- package/dist/timeout/timeout.js +42 -0
- package/dist/timeout/timeout.js.map +1 -0
- package/dist/weaving/advise-method.d.ts +7 -0
- package/dist/weaving/advise-method.d.ts.map +1 -0
- package/dist/weaving/advise-method.js +19 -0
- package/dist/weaving/advise-method.js.map +1 -0
- package/dist/weaving/advise-methods.d.ts +13 -0
- package/dist/weaving/advise-methods.d.ts.map +1 -0
- package/dist/weaving/advise-methods.js +119 -0
- package/dist/weaving/advise-methods.js.map +1 -0
- package/dist/weaving/advise-prototype-method.d.ts +8 -0
- package/dist/weaving/advise-prototype-method.d.ts.map +1 -0
- package/dist/weaving/advise-prototype-method.js +30 -0
- package/dist/weaving/advise-prototype-method.js.map +1 -0
- package/dist/weaving/advised.d.ts +6 -0
- package/dist/weaving/advised.d.ts.map +1 -0
- package/dist/weaving/advised.js +19 -0
- package/dist/weaving/advised.js.map +1 -0
- package/dist/weaving/from-outside.d.ts +10 -0
- package/dist/weaving/from-outside.d.ts.map +1 -0
- package/dist/weaving/from-outside.js +29 -0
- package/dist/weaving/from-outside.js.map +1 -0
- package/dist/weaving/is-wrappable.d.ts +3 -0
- package/dist/weaving/is-wrappable.d.ts.map +1 -0
- package/dist/weaving/is-wrappable.js +7 -0
- package/dist/weaving/is-wrappable.js.map +1 -0
- package/dist/weaving/known-async.d.ts +4 -0
- package/dist/weaving/known-async.d.ts.map +1 -0
- package/dist/weaving/known-async.js +3 -0
- package/dist/weaving/known-async.js.map +1 -0
- package/dist/weaving/lifecycle-hooks.d.ts +3 -0
- package/dist/weaving/lifecycle-hooks.d.ts.map +1 -0
- package/dist/weaving/lifecycle-hooks.js +9 -0
- package/dist/weaving/lifecycle-hooks.js.map +1 -0
- package/dist/weaving/method.d.ts +2 -0
- package/dist/weaving/method.d.ts.map +1 -0
- package/dist/weaving/method.js +2 -0
- package/dist/weaving/method.js.map +1 -0
- package/dist/weaving/named.d.ts +4 -0
- package/dist/weaving/named.d.ts.map +1 -0
- package/dist/weaving/named.js +7 -0
- package/dist/weaving/named.js.map +1 -0
- package/dist/weaving/shadowed.d.ts +4 -0
- package/dist/weaving/shadowed.d.ts.map +1 -0
- package/dist/weaving/shadowed.js +14 -0
- package/dist/weaving/shadowed.js.map +1 -0
- package/dist/weaving/site-of.d.ts +5 -0
- package/dist/weaving/site-of.d.ts.map +1 -0
- package/dist/weaving/site-of.js +15 -0
- package/dist/weaving/site-of.js.map +1 -0
- package/package.json +40 -4
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { defineAspect } from '../aspect/define-aspect.js';
|
|
2
|
+
import { TimeoutError } from '../errors/timeout-error.js';
|
|
3
|
+
import { schedulerOr } from '../runtime/scheduler-or.js';
|
|
4
|
+
/**
|
|
5
|
+
* Rejects with a `TimeoutError` when the call has not answered in time. Without `signal` the
|
|
6
|
+
* underlying call keeps running and its late outcome is dropped.
|
|
7
|
+
*/
|
|
8
|
+
export function timeout(timeoutMs, options = {}) {
|
|
9
|
+
return defineAspect(timeoutAdvice(timeoutMs, options));
|
|
10
|
+
}
|
|
11
|
+
export function timeoutAdvice(timeoutMs, options = {}) {
|
|
12
|
+
if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
|
|
13
|
+
throw new RangeError('timeout: the duration is a positive number of milliseconds');
|
|
14
|
+
}
|
|
15
|
+
return (joinPoint) => (invocation) => new Promise((resolve, reject) => {
|
|
16
|
+
const controller = new AbortController();
|
|
17
|
+
const cancel = schedulerOr(options.scheduler).schedule(() => {
|
|
18
|
+
const error = new TimeoutError(`${joinPoint.className}.${joinPoint.method}`, timeoutMs);
|
|
19
|
+
controller.abort(error);
|
|
20
|
+
reject(error);
|
|
21
|
+
}, timeoutMs);
|
|
22
|
+
const args = options.signal === true ? withSignal(invocation, joinPoint, controller.signal) : invocation.args;
|
|
23
|
+
invocation.proceed(args).then(resolve, reject).finally(cancel).catch(ignored);
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
function withSignal(invocation, joinPoint, signal) {
|
|
27
|
+
const position = joinPoint.arity - 1;
|
|
28
|
+
const given = invocation.args[position];
|
|
29
|
+
if (position < 0 || !(given === undefined || given instanceof AbortSignal)) {
|
|
30
|
+
return invocation.args;
|
|
31
|
+
}
|
|
32
|
+
const args = [...invocation.args];
|
|
33
|
+
while (args.length < position) {
|
|
34
|
+
args.push(undefined);
|
|
35
|
+
}
|
|
36
|
+
args[position] = given === undefined ? signal : AbortSignal.any([given, signal]);
|
|
37
|
+
return args;
|
|
38
|
+
}
|
|
39
|
+
function ignored() {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=timeout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timeout.js","sourceRoot":"","sources":["../../src/timeout/timeout.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAG1D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAezD;;;GAGG;AACH,MAAM,UAAU,OAAO,CAAC,SAAiB,EAAE,OAAO,GAAmB,EAAE;IACrE,OAAO,YAAY,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB,EAAE,OAAO,GAAmB,EAAE;IAC3E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,UAAU,CAAC,4DAA4D,CAAC,CAAC;IACrF,CAAC;IAED,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,UAAU,EAAE,EAAE,CACnC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QAEzC,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,GAAG,EAAE;YAC1D,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,GAAG,SAAS,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAC;YAExF,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,EAAE,SAAS,CAAC,CAAC;QAEd,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAE9G,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,UAAU,CAAC,UAAsB,EAAE,SAAoB,EAAE,MAAmB;IACnF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,QAAQ,GAAG,CAAC,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,KAAK,YAAY,WAAW,CAAC,EAAE,CAAC;QAC3E,OAAO,UAAU,CAAC,IAAI,CAAC;IACzB,CAAC;IAED,MAAM,IAAI,GAAG,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAElC,OAAO,IAAI,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAEjF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,OAAO;IACd,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AdviceFactory } from '../aspect/advice-factory.js';
|
|
2
|
+
/**
|
|
3
|
+
* Puts the advice around one method that is known to answer a promise, from its first call:
|
|
4
|
+
* what a method decorator asks for.
|
|
5
|
+
*/
|
|
6
|
+
export declare function adviseMethod(instance: object, name: string, advise: AdviceFactory): void;
|
|
7
|
+
//# sourceMappingURL=advise-method.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-method.d.ts","sourceRoot":"","sources":["../../src/weaving/advise-method.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAMjE;;;GAGG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,GAAG,IAAI,CAYxF"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { advised } from './advised.js';
|
|
2
|
+
import { isWrappable } from './is-wrappable.js';
|
|
3
|
+
import { shadowed } from './shadowed.js';
|
|
4
|
+
import { siteOf } from './site-of.js';
|
|
5
|
+
/**
|
|
6
|
+
* Puts the advice around one method that is known to answer a promise, from its first call:
|
|
7
|
+
* what a method decorator asks for.
|
|
8
|
+
*/
|
|
9
|
+
export function adviseMethod(instance, name, advise) {
|
|
10
|
+
const method = Reflect.get(instance, name);
|
|
11
|
+
if (!isWrappable(method)) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
const wrapper = advised(method, { ...siteOf(instance, {}), method: name, arity: method.length }, advise);
|
|
15
|
+
if (wrapper !== undefined) {
|
|
16
|
+
shadowed(instance, new Map([[name, wrapper]]));
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=advise-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-method.js","sourceRoot":"","sources":["../../src/weaving/advise-method.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,QAAgB,EAAE,IAAY,EAAE,MAAqB;IAChF,MAAM,MAAM,GAAY,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;IAEpD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;QACzB,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC;IAEzG,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AdviceFactory } from '../aspect/advice-factory.js';
|
|
2
|
+
import type { AspectInfo } from '../aspect/aspect-info.js';
|
|
3
|
+
/**
|
|
4
|
+
* Puts the advice around the calls that reach the instance from outside, on every asynchronous
|
|
5
|
+
* method. Public cannot be told from `private` once compiled, so every method is wrapped; what
|
|
6
|
+
* tells the calls apart is where they come from: a call the instance makes on itself while one
|
|
7
|
+
* of its advised calls is running is not advised again. A method declared `async` is advised
|
|
8
|
+
* from its first call; a method that merely returns a promise is advised from its second call
|
|
9
|
+
* (the first one teaches that it is asynchronous). Synchronous methods, getters, symbols,
|
|
10
|
+
* generators and lifecycle hooks are left alone.
|
|
11
|
+
*/
|
|
12
|
+
export declare function adviseMethods<T extends object>(instance: T, info: AspectInfo, advise: AdviceFactory): T;
|
|
13
|
+
//# sourceMappingURL=advise-methods.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-methods.d.ts","sourceRoot":"","sources":["../../src/weaving/advise-methods.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAc3D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,aAAa,GAAG,CAAC,CAkBvG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { advised } from './advised.js';
|
|
2
|
+
import { fromOutside } from './from-outside.js';
|
|
3
|
+
import { isWrappable } from './is-wrappable.js';
|
|
4
|
+
import { knownAsync } from './known-async.js';
|
|
5
|
+
import { LIFECYCLE_HOOKS } from './lifecycle-hooks.js';
|
|
6
|
+
import { named } from './named.js';
|
|
7
|
+
import { shadowed } from './shadowed.js';
|
|
8
|
+
import { siteOf } from './site-of.js';
|
|
9
|
+
// A function standing in for another is asynchronous when the other is.
|
|
10
|
+
const standsFor = new WeakMap();
|
|
11
|
+
/**
|
|
12
|
+
* Puts the advice around the calls that reach the instance from outside, on every asynchronous
|
|
13
|
+
* method. Public cannot be told from `private` once compiled, so every method is wrapped; what
|
|
14
|
+
* tells the calls apart is where they come from: a call the instance makes on itself while one
|
|
15
|
+
* of its advised calls is running is not advised again. A method declared `async` is advised
|
|
16
|
+
* from its first call; a method that merely returns a promise is advised from its second call
|
|
17
|
+
* (the first one teaches that it is asynchronous). Synchronous methods, getters, symbols,
|
|
18
|
+
* generators and lifecycle hooks are left alone.
|
|
19
|
+
*/
|
|
20
|
+
export function adviseMethods(instance, info, advise) {
|
|
21
|
+
const wrappers = new Map();
|
|
22
|
+
const site = siteOf(instance, info);
|
|
23
|
+
const application = {};
|
|
24
|
+
for (const [name, method] of wrappableMethods(instance)) {
|
|
25
|
+
const wrapper = advised(method, { ...site, method: name, arity: method.length }, advise);
|
|
26
|
+
if (wrapper !== undefined) {
|
|
27
|
+
wrappers.set(name, learning(method, fromOutside(method, wrapper, application)));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (wrappers.size === 0) {
|
|
31
|
+
return instance;
|
|
32
|
+
}
|
|
33
|
+
return Object.isExtensible(instance) ? shadowed(instance, wrappers) : proxied(instance, wrappers);
|
|
34
|
+
}
|
|
35
|
+
/** Own and inherited methods as they are reached now, without invoking any getter. */
|
|
36
|
+
function wrappableMethods(instance) {
|
|
37
|
+
const methods = new Map();
|
|
38
|
+
const seen = new Set(['constructor', ...LIFECYCLE_HOOKS]);
|
|
39
|
+
for (const owner of prototypeChain(instance)) {
|
|
40
|
+
for (const name of Object.getOwnPropertyNames(owner)) {
|
|
41
|
+
if (seen.has(name)) {
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
seen.add(name);
|
|
45
|
+
if (!holdsShadowableMethod(owner, name, instance)) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Read through the instance: a proxy put by another aspect answers its own wrapper.
|
|
49
|
+
const current = Reflect.get(instance, name);
|
|
50
|
+
if (isWrappable(current)) {
|
|
51
|
+
methods.set(name, current);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return methods;
|
|
56
|
+
}
|
|
57
|
+
function prototypeChain(instance) {
|
|
58
|
+
const chain = [];
|
|
59
|
+
for (let owner = instance; owner !== null && owner !== Object.prototype && owner !== Function.prototype; owner = Reflect.getPrototypeOf(owner)) {
|
|
60
|
+
chain.push(owner);
|
|
61
|
+
}
|
|
62
|
+
return chain;
|
|
63
|
+
}
|
|
64
|
+
/** A read-only own property cannot be shadowed, neither in place nor through a proxy. */
|
|
65
|
+
function holdsShadowableMethod(owner, name, instance) {
|
|
66
|
+
const descriptor = Object.getOwnPropertyDescriptor(owner, name);
|
|
67
|
+
if (descriptor === undefined || (owner === instance && isReadOnly(descriptor))) {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
70
|
+
return typeof descriptor.value === 'function';
|
|
71
|
+
}
|
|
72
|
+
function isReadOnly(descriptor) {
|
|
73
|
+
return !descriptor.writable && !descriptor.configurable;
|
|
74
|
+
}
|
|
75
|
+
function learning(original, wrapper) {
|
|
76
|
+
if (isAsync(original)) {
|
|
77
|
+
return wrapper;
|
|
78
|
+
}
|
|
79
|
+
const learner = function (...args) {
|
|
80
|
+
if (isAsync(original)) {
|
|
81
|
+
return wrapper.apply(this, args);
|
|
82
|
+
}
|
|
83
|
+
const result = original.apply(this, args);
|
|
84
|
+
if (isThenable(result)) {
|
|
85
|
+
knownAsync.add(original);
|
|
86
|
+
}
|
|
87
|
+
return result;
|
|
88
|
+
};
|
|
89
|
+
standsFor.set(learner, original);
|
|
90
|
+
return named(learner, original);
|
|
91
|
+
}
|
|
92
|
+
function isAsync(method) {
|
|
93
|
+
if (method.constructor.name === 'AsyncFunction' || knownAsync.has(method)) {
|
|
94
|
+
return true;
|
|
95
|
+
}
|
|
96
|
+
const other = standsFor.get(method);
|
|
97
|
+
return other !== undefined && isAsync(other);
|
|
98
|
+
}
|
|
99
|
+
function isThenable(value) {
|
|
100
|
+
return ((typeof value === 'object' || typeof value === 'function') &&
|
|
101
|
+
value !== null &&
|
|
102
|
+
'then' in value &&
|
|
103
|
+
typeof value.then === 'function');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* A sealed or frozen instance cannot receive own methods, so it is fronted by a proxy that
|
|
107
|
+
* answers the wrappers. A method runs with the proxy as `this`, as it would with the instance
|
|
108
|
+
* itself: a method it calls through `this` meets the same wrappers, and its fields are read
|
|
109
|
+
* through.
|
|
110
|
+
*/
|
|
111
|
+
function proxied(instance, wrappers) {
|
|
112
|
+
return new Proxy(instance, {
|
|
113
|
+
get(target, property, receiver) {
|
|
114
|
+
const wrapper = typeof property === 'string' ? wrappers.get(property) : undefined;
|
|
115
|
+
return wrapper ?? Reflect.get(target, property, receiver);
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=advise-methods.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-methods.js","sourceRoot":"","sources":["../../src/weaving/advise-methods.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AdviceFactory } from '../aspect/advice-factory.js';
|
|
2
|
+
/**
|
|
3
|
+
* The same advice for a method decorated in the legacy mode, which has no initializer to run
|
|
4
|
+
* at construction: the answer replaces the method on the prototype, and builds the advice of
|
|
5
|
+
* each instance at its first call. State is kept per instance and per method, as above.
|
|
6
|
+
*/
|
|
7
|
+
export declare function advisePrototypeMethod(name: string, original: unknown, advise: AdviceFactory): unknown;
|
|
8
|
+
//# sourceMappingURL=advise-prototype-method.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-prototype-method.d.ts","sourceRoot":"","sources":["../../src/weaving/advise-prototype-method.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAQjE;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,aAAa,GAAG,OAAO,CAsBrG"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { advised } from './advised.js';
|
|
2
|
+
import { isWrappable } from './is-wrappable.js';
|
|
3
|
+
import { knownAsync } from './known-async.js';
|
|
4
|
+
import { named } from './named.js';
|
|
5
|
+
import { siteOf } from './site-of.js';
|
|
6
|
+
/**
|
|
7
|
+
* The same advice for a method decorated in the legacy mode, which has no initializer to run
|
|
8
|
+
* at construction: the answer replaces the method on the prototype, and builds the advice of
|
|
9
|
+
* each instance at its first call. State is kept per instance and per method, as above.
|
|
10
|
+
*/
|
|
11
|
+
export function advisePrototypeMethod(name, original, advise) {
|
|
12
|
+
if (!isWrappable(original)) {
|
|
13
|
+
return original;
|
|
14
|
+
}
|
|
15
|
+
const wrappers = new WeakMap();
|
|
16
|
+
const dispatcher = function (...args) {
|
|
17
|
+
if (typeof this !== 'object' || this === null) {
|
|
18
|
+
return original.apply(this, args);
|
|
19
|
+
}
|
|
20
|
+
const wrapper = wrappers.get(this) ?? adviceOf(this, original, { name, advise });
|
|
21
|
+
wrappers.set(this, wrapper);
|
|
22
|
+
return wrapper.apply(this, args);
|
|
23
|
+
};
|
|
24
|
+
knownAsync.add(dispatcher);
|
|
25
|
+
return named(dispatcher, original);
|
|
26
|
+
}
|
|
27
|
+
function adviceOf(instance, original, { name, advise }) {
|
|
28
|
+
return advised(original, { ...siteOf(instance, {}), method: name, arity: original.length }, advise) ?? original;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=advise-prototype-method.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advise-prototype-method.js","sourceRoot":"","sources":["../../src/weaving/advise-prototype-method.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,QAAiB,EAAE,MAAqB;IAC1F,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,OAAO,EAAkB,CAAC;IAE/C,MAAM,UAAU,GAAW,UAAyB,GAAG,IAAe;QACpE,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9C,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QAEjF,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE5B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACnC,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;AACrC,CAAC;AAOD,SAAS,QAAQ,CAAC,QAAgB,EAAE,QAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAY;IAC9E,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC,IAAI,QAAQ,CAAC;AAClH,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AdviceFactory } from '../aspect/advice-factory.js';
|
|
2
|
+
import type { JoinPoint } from '../aspect/join-point.js';
|
|
3
|
+
import type { Method } from './method.js';
|
|
4
|
+
/** The method inside the advice built for its join point, `undefined` when the factory leaves it alone. */
|
|
5
|
+
export declare function advised(original: Method, joinPoint: JoinPoint, advise: AdviceFactory): Method | undefined;
|
|
6
|
+
//# sourceMappingURL=advised.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advised.d.ts","sourceRoot":"","sources":["../../src/weaving/advised.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAG1C,2GAA2G;AAC3G,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAkBzG"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { knownAsync } from './known-async.js';
|
|
2
|
+
import { named } from './named.js';
|
|
3
|
+
/** The method inside the advice built for its join point, `undefined` when the factory leaves it alone. */
|
|
4
|
+
export function advised(original, joinPoint, advise) {
|
|
5
|
+
const advice = advise(joinPoint);
|
|
6
|
+
if (advice === undefined) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
// Async so that an advice failing before its first await rejects the call instead of throwing.
|
|
10
|
+
const wrapper = async function (...args) {
|
|
11
|
+
return advice({
|
|
12
|
+
args,
|
|
13
|
+
proceed: async (next = args) => original.apply(this, [...next]),
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
knownAsync.add(wrapper);
|
|
17
|
+
return named(wrapper, original);
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=advised.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advised.js","sourceRoot":"","sources":["../../src/weaving/advised.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAEnC,2GAA2G;AAC3G,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,SAAoB,EAAE,MAAqB;IACnF,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;IAEjC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,+FAA+F;IAC/F,MAAM,OAAO,GAAW,KAAK,WAA0B,GAAG,IAAe;QACvE,OAAO,MAAM,CAAC;YACZ,IAAI;YACJ,OAAO,EAAE,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;SAChE,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAExB,OAAO,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Method } from './method.js';
|
|
2
|
+
/**
|
|
3
|
+
* The advice for a call that reaches the instance from outside, the method itself for a call
|
|
4
|
+
* made while an advised call of the same application (one aspect on one instance) is running
|
|
5
|
+
* in the same asynchronous flow: what the instance calls on itself, through a public or a
|
|
6
|
+
* `private` method, is the inside of the call being advised, not another call to advise.
|
|
7
|
+
* Concurrent calls from outside are separate flows: each is advised.
|
|
8
|
+
*/
|
|
9
|
+
export declare function fromOutside(original: Method, wrapper: Method, application: object): Method;
|
|
10
|
+
//# sourceMappingURL=from-outside.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-outside.d.ts","sourceRoot":"","sources":["../../src/weaving/from-outside.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAW1C;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAmB1F"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
import { named } from './named.js';
|
|
3
|
+
// The advised calls the current asynchronous flow is inside of, outermost first.
|
|
4
|
+
const callsInProgress = new AsyncLocalStorage();
|
|
5
|
+
/**
|
|
6
|
+
* The advice for a call that reaches the instance from outside, the method itself for a call
|
|
7
|
+
* made while an advised call of the same application (one aspect on one instance) is running
|
|
8
|
+
* in the same asynchronous flow: what the instance calls on itself, through a public or a
|
|
9
|
+
* `private` method, is the inside of the call being advised, not another call to advise.
|
|
10
|
+
* Concurrent calls from outside are separate flows: each is advised.
|
|
11
|
+
*/
|
|
12
|
+
export function fromOutside(original, wrapper, application) {
|
|
13
|
+
const entry = async function (...args) {
|
|
14
|
+
const outer = callsInProgress.getStore() ?? [];
|
|
15
|
+
if (outer.some((call) => call.running && call.application === application)) {
|
|
16
|
+
return original.apply(this, args);
|
|
17
|
+
}
|
|
18
|
+
const call = { application, running: true };
|
|
19
|
+
try {
|
|
20
|
+
return await callsInProgress.run([...outer, call], () => wrapper.apply(this, args));
|
|
21
|
+
}
|
|
22
|
+
finally {
|
|
23
|
+
// What the call left behind (a timer, a listener) is a caller from outside once it is over.
|
|
24
|
+
call.running = false;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return named(entry, original);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=from-outside.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"from-outside.js","sourceRoot":"","sources":["../../src/weaving/from-outside.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAOnC,iFAAiF;AACjF,MAAM,eAAe,GAAG,IAAI,iBAAiB,EAA0B,CAAC;AAExE;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAC,QAAgB,EAAE,OAAe,EAAE,WAAmB;IAChF,MAAM,KAAK,GAAW,KAAK,WAA0B,GAAG,IAAe;QACrE,MAAM,KAAK,GAAG,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC;QAE/C,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW,KAAK,WAAW,CAAC,EAAE,CAAC;YAC3E,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,IAAI,GAAgB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;QAEzD,IAAI,CAAC;YACH,OAAO,MAAM,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtF,CAAC;gBAAS,CAAC;YACT,4FAA4F;YAC5F,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACvB,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-wrappable.d.ts","sourceRoot":"","sources":["../../src/weaving/is-wrappable.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAI1C,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAM3D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
const UNWRAPPABLE_CONSTRUCTORS = new Set(['GeneratorFunction', 'AsyncGeneratorFunction']);
|
|
2
|
+
export function isWrappable(value) {
|
|
3
|
+
return (typeof value === 'function' &&
|
|
4
|
+
!UNWRAPPABLE_CONSTRUCTORS.has(value.constructor.name) &&
|
|
5
|
+
!Function.prototype.toString.call(value).startsWith('class'));
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=is-wrappable.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"is-wrappable.js","sourceRoot":"","sources":["../../src/weaving/is-wrappable.ts"],"names":[],"mappings":"AAEA,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,mBAAmB,EAAE,wBAAwB,CAAC,CAAC,CAAC;AAE1F,MAAM,UAAU,WAAW,CAAC,KAAc;IACxC,OAAO,CACL,OAAO,KAAK,KAAK,UAAU;QAC3B,CAAC,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;QACrD,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAC7D,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-async.d.ts","sourceRoot":"","sources":["../../src/weaving/known-async.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,2FAA2F;AAC3F,eAAO,MAAM,UAAU,iBAAwB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"known-async.js","sourceRoot":"","sources":["../../src/weaving/known-async.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,OAAO,EAAU,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-hooks.d.ts","sourceRoot":"","sources":["../../src/weaving/lifecycle-hooks.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAM5C,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** Method names never wrapped: frameworks call them outside of any unit of work. */
|
|
2
|
+
export const LIFECYCLE_HOOKS = [
|
|
3
|
+
'onModuleInit',
|
|
4
|
+
'onModuleDestroy',
|
|
5
|
+
'onApplicationBootstrap',
|
|
6
|
+
'onApplicationShutdown',
|
|
7
|
+
'dispose',
|
|
8
|
+
];
|
|
9
|
+
//# sourceMappingURL=lifecycle-hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-hooks.js","sourceRoot":"","sources":["../../src/weaving/lifecycle-hooks.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,MAAM,CAAC,MAAM,eAAe,GAAsB;IAChD,cAAc;IACd,iBAAiB;IACjB,wBAAwB;IACxB,uBAAuB;IACvB,SAAS;CACV,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method.d.ts","sourceRoot":"","sources":["../../src/weaving/method.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,CAAC,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"method.js","sourceRoot":"","sources":["../../src/weaving/method.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"named.d.ts","sourceRoot":"","sources":["../../src/weaving/named.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,+EAA+E;AAC/E,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAK/D"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/** The wrapper under the name and the declared parameters of what it wraps. */
|
|
2
|
+
export function named(wrapper, original) {
|
|
3
|
+
Object.defineProperty(wrapper, 'name', { value: original.name, configurable: true });
|
|
4
|
+
Object.defineProperty(wrapper, 'length', { value: original.length, configurable: true });
|
|
5
|
+
return wrapper;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=named.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"named.js","sourceRoot":"","sources":["../../src/weaving/named.ts"],"names":[],"mappings":"AAEA,+EAA+E;AAC/E,MAAM,UAAU,KAAK,CAAC,OAAe,EAAE,QAAgB;IACrD,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAEzF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { Method } from './method.js';
|
|
2
|
+
/** The instance with the wrappers as own methods, in front of the ones of its class. */
|
|
3
|
+
export declare function shadowed<T extends object>(instance: T, wrappers: ReadonlyMap<string, Method>): T;
|
|
4
|
+
//# sourceMappingURL=shadowed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadowed.d.ts","sourceRoot":"","sources":["../../src/weaving/shadowed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,wFAAwF;AACxF,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAahG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/** The instance with the wrappers as own methods, in front of the ones of its class. */
|
|
2
|
+
export function shadowed(instance, wrappers) {
|
|
3
|
+
for (const [name, wrapper] of wrappers) {
|
|
4
|
+
const own = Object.getOwnPropertyDescriptor(instance, name);
|
|
5
|
+
Object.defineProperty(instance, name, {
|
|
6
|
+
value: wrapper,
|
|
7
|
+
writable: true,
|
|
8
|
+
configurable: true,
|
|
9
|
+
enumerable: own?.enumerable ?? false,
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
return instance;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=shadowed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadowed.js","sourceRoot":"","sources":["../../src/weaving/shadowed.ts"],"names":[],"mappings":"AAEA,wFAAwF;AACxF,MAAM,UAAU,QAAQ,CAAmB,QAAW,EAAE,QAAqC;IAC3F,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,MAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QAE5D,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE,IAAI,EAAE;YACpC,KAAK,EAAE,OAAO;YACd,QAAQ,EAAE,IAAI;YACd,YAAY,EAAE,IAAI;YAClB,UAAU,EAAE,GAAG,EAAE,UAAU,IAAI,KAAK;SACrC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { AspectInfo } from '../aspect/aspect-info.js';
|
|
2
|
+
import type { JoinPoint } from '../aspect/join-point.js';
|
|
3
|
+
/** What every join point of an instance says of it. */
|
|
4
|
+
export declare function siteOf(instance: object, info: AspectInfo): Omit<JoinPoint, 'method' | 'arity'>;
|
|
5
|
+
//# sourceMappingURL=site-of.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-of.d.ts","sourceRoot":"","sources":["../../src/weaving/site-of.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,uDAAuD;AACvD,wBAAgB,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,OAAO,CAAC,CAQ9F"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** What every join point of an instance says of it. */
|
|
2
|
+
export function siteOf(instance, info) {
|
|
3
|
+
return {
|
|
4
|
+
instance,
|
|
5
|
+
className: info.className ?? constructorNameOf(instance),
|
|
6
|
+
...(info.kind === undefined ? {} : { kind: info.kind }),
|
|
7
|
+
...(info.context === undefined ? {} : { context: info.context }),
|
|
8
|
+
...(info.token === undefined ? {} : { token: info.token }),
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
function constructorNameOf(instance) {
|
|
12
|
+
const constructor = Reflect.get(instance, 'constructor');
|
|
13
|
+
return typeof constructor === 'function' && constructor.name !== '' ? constructor.name : 'Object';
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=site-of.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"site-of.js","sourceRoot":"","sources":["../../src/weaving/site-of.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,MAAM,UAAU,MAAM,CAAC,QAAgB,EAAE,IAAgB;IACvD,OAAO;QACL,QAAQ;QACR,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,iBAAiB,CAAC,QAAQ,CAAC;QACxD,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QACvD,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC;KAC3D,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB;IACzC,MAAM,WAAW,GAAY,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IAElE,OAAO,OAAO,WAAW,KAAK,UAAU,IAAI,WAAW,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AACpG,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,42 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ddd-ts-kit/aspects",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Cross-cutting behaviour applied from outside: logging, metrics, retry, timeout, circuit breaker and caching as composable wrappers at the composition root, as bus middlewares, or as standard decorators on adapters. The domain stays clean.",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git+https://github.com/gbourgeat/ddd-ts-kit.git",
|
|
9
|
+
"directory": "packages/aspects"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/gbourgeat/ddd-ts-kit/tree/main/packages/aspects#readme",
|
|
12
|
+
"bugs": "https://github.com/gbourgeat/ddd-ts-kit/issues",
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public",
|
|
15
|
+
"provenance": true
|
|
16
|
+
},
|
|
17
|
+
"type": "module",
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"default": "./dist/index.js"
|
|
23
|
+
},
|
|
24
|
+
"./decorators": {
|
|
25
|
+
"types": "./dist/decorators.d.ts",
|
|
26
|
+
"default": "./dist/decorators.js"
|
|
27
|
+
},
|
|
28
|
+
"./testing": {
|
|
29
|
+
"types": "./dist/testing.d.ts",
|
|
30
|
+
"default": "./dist/testing.js"
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"files": [
|
|
34
|
+
"dist"
|
|
35
|
+
],
|
|
36
|
+
"dependencies": {
|
|
37
|
+
"@ddd-ts-kit/kernel": "0.1.0"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"@ddd-ts-kit/di": "0.1.0"
|
|
41
|
+
}
|
|
42
|
+
}
|