@openora/core 0.4.1-canary.21 → 0.4.1-canary.25
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/dist/.tsbuildinfo +1 -1
- package/dist/casino/lobby/__tests__/lobby.cache.test.js +1 -1
- package/dist/casino/lobby/__tests__/lobby.cache.test.js.map +1 -1
- package/dist/cms/__tests__/cms.reads.test.d.ts +2 -0
- package/dist/cms/__tests__/cms.reads.test.d.ts.map +1 -0
- package/dist/cms/__tests__/{cms.cache.test.js → cms.reads.test.js} +2 -2
- package/dist/cms/__tests__/cms.reads.test.js.map +1 -0
- package/dist/cms/__tests__/cms.router.test.js +25 -22
- package/dist/cms/__tests__/cms.router.test.js.map +1 -1
- package/dist/engagement/chat/__tests__/chat.service.test.js +1 -1
- package/dist/engagement/chat/__tests__/chat.service.test.js.map +1 -1
- package/dist/iam/__tests__/iam.service.test.js +4 -3
- package/dist/iam/__tests__/iam.service.test.js.map +1 -1
- package/dist/pam/identity/__tests__/identity.rate-limit.test.js +4 -3
- package/dist/pam/identity/__tests__/identity.rate-limit.test.js.map +1 -1
- package/dist/pam/identity/__tests__/identity.service.test.js +6 -1
- package/dist/pam/identity/__tests__/identity.service.test.js.map +1 -1
- package/dist/pam/identity/service/identity.service.d.ts.map +1 -1
- package/dist/pam/identity/service/identity.service.js +1 -0
- package/dist/pam/identity/service/identity.service.js.map +1 -1
- package/dist/server/kernel/__tests__/cache.test.js +11 -57
- package/dist/server/kernel/__tests__/cache.test.js.map +1 -1
- package/dist/server/kernel/__tests__/event-bus.test.js +14 -1
- package/dist/server/kernel/__tests__/event-bus.test.js.map +1 -1
- package/dist/server/kernel/__tests__/rate-limiter.test.js +3 -45
- package/dist/server/kernel/__tests__/rate-limiter.test.js.map +1 -1
- package/dist/server/kernel/__tests__/redis-streams-broker.test.d.ts +2 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.test.d.ts.map +1 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.test.js +293 -0
- package/dist/server/kernel/__tests__/redis-streams-broker.test.js.map +1 -0
- package/dist/server/kernel/cache.d.ts +0 -12
- package/dist/server/kernel/cache.d.ts.map +1 -1
- package/dist/server/kernel/cache.js +0 -55
- package/dist/server/kernel/cache.js.map +1 -1
- package/dist/server/kernel/event-bus.d.ts +1 -16
- package/dist/server/kernel/event-bus.d.ts.map +1 -1
- package/dist/server/kernel/event-bus.js +3 -32
- package/dist/server/kernel/event-bus.js.map +1 -1
- package/dist/server/kernel/index.d.ts +4 -6
- package/dist/server/kernel/index.d.ts.map +1 -1
- package/dist/server/kernel/index.js +4 -6
- package/dist/server/kernel/index.js.map +1 -1
- package/dist/server/kernel/rate-limiter.d.ts +1 -10
- package/dist/server/kernel/rate-limiter.d.ts.map +1 -1
- package/dist/server/kernel/rate-limiter.js +0 -38
- package/dist/server/kernel/rate-limiter.js.map +1 -1
- package/dist/server/kernel/redis-streams-broker.d.ts +65 -0
- package/dist/server/kernel/redis-streams-broker.d.ts.map +1 -0
- package/dist/server/kernel/redis-streams-broker.js +208 -0
- package/dist/server/kernel/redis-streams-broker.js.map +1 -0
- package/dist/server/runtime/__tests__/create-app.test.d.ts +2 -0
- package/dist/server/runtime/__tests__/create-app.test.d.ts.map +1 -0
- package/dist/server/runtime/__tests__/create-app.test.js +60 -0
- package/dist/server/runtime/__tests__/create-app.test.js.map +1 -0
- package/dist/server/runtime/assert-durable-seams.d.ts +18 -0
- package/dist/server/runtime/assert-durable-seams.d.ts.map +1 -0
- package/dist/server/runtime/assert-durable-seams.js +32 -0
- package/dist/server/runtime/assert-durable-seams.js.map +1 -0
- package/dist/server/runtime/create-app.d.ts +15 -9
- package/dist/server/runtime/create-app.d.ts.map +1 -1
- package/dist/server/runtime/create-app.js +61 -49
- package/dist/server/runtime/create-app.js.map +1 -1
- package/dist/testing/fakes/__tests__/cache.test.d.ts +2 -0
- package/dist/testing/fakes/__tests__/cache.test.d.ts.map +1 -0
- package/dist/testing/fakes/__tests__/cache.test.js +89 -0
- package/dist/testing/fakes/__tests__/cache.test.js.map +1 -0
- package/dist/testing/fakes/__tests__/job-queue.test.d.ts.map +1 -0
- package/dist/{server/kernel → testing/fakes}/__tests__/job-queue.test.js +1 -1
- package/dist/testing/fakes/__tests__/job-queue.test.js.map +1 -0
- package/dist/testing/fakes/__tests__/rate-limiter.test.d.ts +2 -0
- package/dist/testing/fakes/__tests__/rate-limiter.test.d.ts.map +1 -0
- package/dist/testing/fakes/__tests__/rate-limiter.test.js +83 -0
- package/dist/testing/fakes/__tests__/rate-limiter.test.js.map +1 -0
- package/dist/testing/fakes/__tests__/realtime-authorizer.test.d.ts.map +1 -0
- package/dist/{server/kernel → testing/fakes}/__tests__/realtime-authorizer.test.js.map +1 -1
- package/dist/testing/fakes/__tests__/realtime-transport.test.d.ts.map +1 -0
- package/dist/{server/kernel → testing/fakes}/__tests__/realtime-transport.test.js.map +1 -1
- package/dist/testing/fakes/cache.d.ts +14 -0
- package/dist/testing/fakes/cache.d.ts.map +1 -0
- package/dist/testing/fakes/cache.js +56 -0
- package/dist/testing/fakes/cache.js.map +1 -0
- package/dist/testing/fakes/event-bus.d.ts +17 -0
- package/dist/testing/fakes/event-bus.d.ts.map +1 -0
- package/dist/testing/fakes/event-bus.js +30 -0
- package/dist/testing/fakes/event-bus.js.map +1 -0
- package/dist/{server/kernel → testing/fakes}/job-queue.d.ts +9 -9
- package/dist/{server/kernel → testing/fakes}/job-queue.d.ts.map +1 -1
- package/dist/{server/kernel → testing/fakes}/job-queue.js +9 -9
- package/dist/{server/kernel → testing/fakes}/job-queue.js.map +1 -1
- package/dist/testing/fakes/rate-limiter.d.ts +11 -0
- package/dist/testing/fakes/rate-limiter.d.ts.map +1 -0
- package/dist/testing/fakes/rate-limiter.js +39 -0
- package/dist/testing/fakes/rate-limiter.js.map +1 -0
- package/dist/{server/kernel → testing/fakes}/realtime-authorizer.d.ts.map +1 -1
- package/dist/{server/kernel → testing/fakes}/realtime-authorizer.js.map +1 -1
- package/dist/{server/kernel → testing/fakes}/realtime-transport.d.ts.map +1 -1
- package/dist/{server/kernel → testing/fakes}/realtime-transport.js +3 -1
- package/dist/testing/fakes/realtime-transport.js.map +1 -0
- package/dist/testing/index.d.ts +7 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +11 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/wallet/__tests__/wallet.rate-limit.test.js +1 -1
- package/dist/wallet/__tests__/wallet.rate-limit.test.js.map +1 -1
- package/package.json +6 -1
- package/turbo-generators/src/templates/module/agents.hbs +16 -57
- package/dist/cms/__tests__/cms.cache.test.d.ts +0 -2
- package/dist/cms/__tests__/cms.cache.test.d.ts.map +0 -1
- package/dist/cms/__tests__/cms.cache.test.js.map +0 -1
- package/dist/server/kernel/__tests__/job-queue.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/job-queue.test.js.map +0 -1
- package/dist/server/kernel/__tests__/realtime-authorizer.test.d.ts.map +0 -1
- package/dist/server/kernel/__tests__/realtime-transport.test.d.ts.map +0 -1
- package/dist/server/kernel/realtime-transport.js.map +0 -1
- /package/dist/{server/kernel → testing/fakes}/__tests__/job-queue.test.d.ts +0 -0
- /package/dist/{server/kernel → testing/fakes}/__tests__/realtime-authorizer.test.d.ts +0 -0
- /package/dist/{server/kernel → testing/fakes}/__tests__/realtime-authorizer.test.js +0 -0
- /package/dist/{server/kernel → testing/fakes}/__tests__/realtime-transport.test.d.ts +0 -0
- /package/dist/{server/kernel → testing/fakes}/__tests__/realtime-transport.test.js +0 -0
- /package/dist/{server/kernel → testing/fakes}/realtime-authorizer.d.ts +0 -0
- /package/dist/{server/kernel → testing/fakes}/realtime-authorizer.js +0 -0
- /package/dist/{server/kernel → testing/fakes}/realtime-transport.d.ts +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-streams-broker.test.js","sourceRoot":"","sources":["../../../../src/server/kernel/__tests__/redis-streams-broker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,4 @@
|
|
|
1
1
|
import type { CacheAdapter } from '@openora/core/contracts';
|
|
2
|
-
export declare class InProcessCache implements CacheAdapter {
|
|
3
|
-
private readonly entries;
|
|
4
|
-
private readonly sweeper;
|
|
5
|
-
constructor();
|
|
6
|
-
get<T>(key: string): Promise<T | undefined>;
|
|
7
|
-
set<T>(key: string, value: T, opts: {
|
|
8
|
-
ttlMs: number;
|
|
9
|
-
}): Promise<void>;
|
|
10
|
-
delete(key: string | string[]): Promise<void>;
|
|
11
|
-
private sweep;
|
|
12
|
-
close(): void;
|
|
13
|
-
}
|
|
14
2
|
export declare function cached<T>(cache: CacheAdapter | undefined, key: string, ttlMs: number, loader: () => Promise<T>): Promise<T>;
|
|
15
3
|
export declare function invalidate(cache: CacheAdapter | undefined, keys: string | string[]): Promise<void>;
|
|
16
4
|
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAQ5D,wBAAsB,MAAM,CAAC,CAAC,EAC5B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GACvB,OAAO,CAAC,CAAC,CAAC,CAuBZ;AAED,wBAAsB,UAAU,CAC9B,KAAK,EAAE,YAAY,GAAG,SAAS,EAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GACtB,OAAO,CAAC,IAAI,CAAC,CASf"}
|
|
@@ -1,60 +1,5 @@
|
|
|
1
1
|
import { createLogger } from './logger.js';
|
|
2
2
|
const logger = createLogger('cache');
|
|
3
|
-
const SWEEP_INTERVAL_MS = 60_000;
|
|
4
|
-
// ponytail: hard cap bounds memory against unbounded key growth (eg per-slug churn);
|
|
5
|
-
// eviction is oldest-insert (Map iteration order), not LRU - swap for an LRU if
|
|
6
|
-
// hit-rate under heavy key churn ever matters.
|
|
7
|
-
const MAX_ENTRIES = 5_000;
|
|
8
|
-
// Zero-dependency in-process default (set REDIS_URL to bind the distributed Redis
|
|
9
|
-
// reference adapter instead). Expiry is lazy (checked on access) plus an unref'd
|
|
10
|
-
// sweep so keys never revisited don't accumulate.
|
|
11
|
-
export class InProcessCache {
|
|
12
|
-
entries = new Map();
|
|
13
|
-
sweeper;
|
|
14
|
-
constructor() {
|
|
15
|
-
this.sweeper = setInterval(() => this.sweep(), SWEEP_INTERVAL_MS);
|
|
16
|
-
this.sweeper.unref?.();
|
|
17
|
-
}
|
|
18
|
-
get(key) {
|
|
19
|
-
const entry = this.entries.get(key);
|
|
20
|
-
if (!entry) {
|
|
21
|
-
return Promise.resolve(undefined);
|
|
22
|
-
}
|
|
23
|
-
if (Date.now() >= entry.expiresAt) {
|
|
24
|
-
this.entries.delete(key);
|
|
25
|
-
return Promise.resolve(undefined);
|
|
26
|
-
}
|
|
27
|
-
return Promise.resolve(entry.value);
|
|
28
|
-
}
|
|
29
|
-
set(key, value, opts) {
|
|
30
|
-
if (!this.entries.has(key) && this.entries.size >= MAX_ENTRIES) {
|
|
31
|
-
const oldestKey = this.entries.keys().next().value;
|
|
32
|
-
if (oldestKey !== undefined) {
|
|
33
|
-
this.entries.delete(oldestKey);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
this.entries.set(key, { value, expiresAt: Date.now() + opts.ttlMs });
|
|
37
|
-
return Promise.resolve();
|
|
38
|
-
}
|
|
39
|
-
delete(key) {
|
|
40
|
-
for (const k of Array.isArray(key) ? key : [key]) {
|
|
41
|
-
this.entries.delete(k);
|
|
42
|
-
}
|
|
43
|
-
return Promise.resolve();
|
|
44
|
-
}
|
|
45
|
-
sweep() {
|
|
46
|
-
const now = Date.now();
|
|
47
|
-
for (const [key, entry] of this.entries) {
|
|
48
|
-
if (now >= entry.expiresAt) {
|
|
49
|
-
this.entries.delete(key);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
close() {
|
|
54
|
-
clearInterval(this.sweeper);
|
|
55
|
-
this.entries.clear();
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
3
|
// ponytail: no single-flight guard - concurrent misses on the same key each run
|
|
59
4
|
// `loader`, so a hot key can stampede on cache-miss. Acceptable for the TTLs this
|
|
60
5
|
// is bound at (seconds); add a per-key in-flight promise map if that ever changes.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/server/kernel/cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;AAErC,gFAAgF;AAChF,kFAAkF;AAClF,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,KAA+B,EAC/B,GAAW,EACX,KAAa,EACb,MAAwB;IAExB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,MAAM,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,GAAkB,CAAC;IACvB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAI,GAAG,CAAC,CAAC;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;QAC9C,GAAG,GAAG,SAAS,CAAC;IAClB,CAAC;IACD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACtB,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,MAAM,EAAE,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IACzC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,kBAAkB,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAA+B,EAC/B,IAAuB;IAEvB,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO;IACT,CAAC;IACD,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,yBAAyB,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Token, type MessageBrokerAdapter, type OutboxWriter, type EventEnvelope, type
|
|
1
|
+
import { type Token, type MessageBrokerAdapter, type OutboxWriter, type EventEnvelope, type DomainEventName, type DomainEventPayload } from '@openora/core/contracts';
|
|
2
2
|
import type { Logger } from 'pino';
|
|
3
3
|
export type EventHandler<T = unknown> = (payload: T, envelope?: EventEnvelope) => void | Promise<void>;
|
|
4
4
|
export type EventBus = {
|
|
@@ -10,21 +10,6 @@ export type EventBus = {
|
|
|
10
10
|
on(event: string, handler: EventHandler): () => void;
|
|
11
11
|
};
|
|
12
12
|
export declare const EVENT_BUS: Token<EventBus>;
|
|
13
|
-
/**
|
|
14
|
-
* Default in-process `MESSAGE_BROKER` - `publish` fans out synchronously to
|
|
15
|
-
* whatever's subscribed in THIS process only; it does not survive a restart
|
|
16
|
-
* and does not reach other replicas. An overlay rebinds `MESSAGE_BROKER` to a
|
|
17
|
-
* durable `MessageBrokerAdapter` (eg RabbitMQ via `AMQP_URL`) once events must
|
|
18
|
-
* cross a process boundary. `subscribe`'s returned unsubscribe function is
|
|
19
|
-
* safe to call mid-dispatch: the handler list is copied on write, never
|
|
20
|
-
* mutated in place.
|
|
21
|
-
*/
|
|
22
|
-
export declare class InMemoryBroker implements MessageBrokerAdapter {
|
|
23
|
-
private readonly handlers;
|
|
24
|
-
publish(envelope: EventEnvelope): void;
|
|
25
|
-
subscribe(topic: string, handler: (env: EventEnvelope) => void | Promise<void>, _options?: SubscribeOptions): () => void;
|
|
26
|
-
close(): Promise<void>;
|
|
27
|
-
}
|
|
28
13
|
/** Typed facade over a MessageBrokerAdapter. Validates known payloads, isolates subscriber failures, and builds the envelope. */
|
|
29
14
|
export declare function createEventBus(broker: MessageBrokerAdapter, logger?: Logger, outbox?: OutboxWriter): EventBus;
|
|
30
15
|
//# sourceMappingURL=event-bus.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,
|
|
1
|
+
{"version":3,"file":"event-bus.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,KAAK,EACV,KAAK,oBAAoB,EACzB,KAAK,YAAY,EACjB,KAAK,aAAa,EAGlB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACxB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAInC,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,OAAO,IAAI,CACtC,OAAO,EAAE,CAAC,EACV,QAAQ,CAAC,EAAE,aAAa,KACrB,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAK1B,MAAM,MAAM,QAAQ,GAAG;IACrB,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAChF,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAS5C,iBAAiB,CAAC,CAAC,SAAS,eAAe,EACzC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAC7B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,iBAAiB,CAAC,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/E,EAAE,CAAC,CAAC,SAAS,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;IAClG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,IAAI,CAAC;CACtD,CAAC;AAEF,eAAO,MAAM,SAAS,EAAE,KAAK,CAAC,QAAQ,CAA4B,CAAC;AAkBnE,iIAAiI;AACjI,wBAAgB,cAAc,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,MAAM,GAAE,MAAkC,EAC1C,MAAM,CAAC,EAAE,YAAY,GACpB,QAAQ,CA2CV"}
|
|
@@ -2,35 +2,6 @@ import { createToken, domainEventSchemas, getEventVersion, } from '@openora/core
|
|
|
2
2
|
import { createLogger } from './logger.js';
|
|
3
3
|
import { getCurrentTraceId } from './request-context.js';
|
|
4
4
|
export const EVENT_BUS = createToken('EVENT_BUS');
|
|
5
|
-
/**
|
|
6
|
-
* Default in-process `MESSAGE_BROKER` - `publish` fans out synchronously to
|
|
7
|
-
* whatever's subscribed in THIS process only; it does not survive a restart
|
|
8
|
-
* and does not reach other replicas. An overlay rebinds `MESSAGE_BROKER` to a
|
|
9
|
-
* durable `MessageBrokerAdapter` (eg RabbitMQ via `AMQP_URL`) once events must
|
|
10
|
-
* cross a process boundary. `subscribe`'s returned unsubscribe function is
|
|
11
|
-
* safe to call mid-dispatch: the handler list is copied on write, never
|
|
12
|
-
* mutated in place.
|
|
13
|
-
*/
|
|
14
|
-
export class InMemoryBroker {
|
|
15
|
-
handlers = new Map();
|
|
16
|
-
publish(envelope) {
|
|
17
|
-
for (const fn of this.handlers.get(envelope.topic) ?? []) {
|
|
18
|
-
void fn(envelope);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
subscribe(topic, handler, _options) {
|
|
22
|
-
const fns = this.handlers.get(topic) ?? [];
|
|
23
|
-
const updated = [...fns, handler];
|
|
24
|
-
this.handlers.set(topic, updated);
|
|
25
|
-
return () => {
|
|
26
|
-
const current = this.handlers.get(topic) ?? [];
|
|
27
|
-
this.handlers.set(topic, current.filter((f) => f !== handler));
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
async close() {
|
|
31
|
-
this.handlers.clear();
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
5
|
function isKnownEvent(event) {
|
|
35
6
|
return event in domainEventSchemas;
|
|
36
7
|
}
|
|
@@ -61,13 +32,13 @@ export function createEventBus(broker, logger = createLogger('event-bus'), outbo
|
|
|
61
32
|
emit(event, payload) {
|
|
62
33
|
validate(event, payload);
|
|
63
34
|
const envelope = buildEnvelope(event, payload);
|
|
64
|
-
void broker.publish(envelope);
|
|
35
|
+
void Promise.resolve(broker.publish(envelope)).catch((err) => logger.error({ event, err }, 'event publish failed'));
|
|
65
36
|
},
|
|
66
37
|
async emitInTransaction(tx, event, payload) {
|
|
67
38
|
if (!outbox) {
|
|
68
39
|
throw new Error(`emitInTransaction('${event}') requires the transactional outbox, which is not bound. ` +
|
|
69
|
-
`Enable it (set OUTBOX_ENABLED=1
|
|
70
|
-
`
|
|
40
|
+
`Enable it (set OUTBOX_ENABLED=1) so the event is published reliably, or use emit() ` +
|
|
41
|
+
`for best-effort post-commit delivery.`);
|
|
71
42
|
}
|
|
72
43
|
validate(event, payload);
|
|
73
44
|
await outbox.write(tx, buildEnvelope(event, payload));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/server/kernel/event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,
|
|
1
|
+
{"version":3,"file":"event-bus.js","sourceRoot":"","sources":["../../../src/server/kernel/event-bus.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
export type { RequestContext, RequestStorage } from './request-context.js';
|
|
2
2
|
export { requestStorage, getCurrentRequestContext, getCurrentTraceId, withRequestContext, } from './request-context.js';
|
|
3
3
|
export type { EventBus, EventHandler } from './event-bus.js';
|
|
4
|
-
export { EVENT_BUS,
|
|
5
|
-
export { InProcessJobQueue } from './job-queue.js';
|
|
4
|
+
export { EVENT_BUS, createEventBus } from './event-bus.js';
|
|
6
5
|
export { BullMqJobQueue } from './bullmq-job-queue.js';
|
|
7
|
-
export {
|
|
8
|
-
export {
|
|
6
|
+
export { makeRateLimitError, assertRateLimit } from './rate-limiter.js';
|
|
7
|
+
export { cached, invalidate } from './cache.js';
|
|
9
8
|
export { createRedisClient, type RedisClient } from './redis-client.js';
|
|
10
9
|
export { RedisCache } from './redis-cache.js';
|
|
11
10
|
export { RedisRateLimiter } from './redis-rate-limiter.js';
|
|
12
|
-
export {
|
|
13
|
-
export { SseClientAuthorizer, type SseClientAuthorizerOptions } from './realtime-authorizer.js';
|
|
11
|
+
export { RedisStreamsBroker } from './redis-streams-broker.js';
|
|
14
12
|
export { Container } from './container.js';
|
|
15
13
|
export type { Factory } from './container.js';
|
|
16
14
|
export { createLogger } from './logger.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACpE,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC9C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAG5D,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
export { requestStorage, getCurrentRequestContext, getCurrentTraceId, withRequestContext, } from './request-context.js';
|
|
2
|
-
export { EVENT_BUS,
|
|
3
|
-
export { InProcessJobQueue } from './job-queue.js';
|
|
2
|
+
export { EVENT_BUS, createEventBus } from './event-bus.js';
|
|
4
3
|
export { BullMqJobQueue } from './bullmq-job-queue.js';
|
|
5
|
-
export {
|
|
6
|
-
export {
|
|
4
|
+
export { makeRateLimitError, assertRateLimit } from './rate-limiter.js';
|
|
5
|
+
export { cached, invalidate } from './cache.js';
|
|
7
6
|
export { createRedisClient } from './redis-client.js';
|
|
8
7
|
export { RedisCache } from './redis-cache.js';
|
|
9
8
|
export { RedisRateLimiter } from './redis-rate-limiter.js';
|
|
10
|
-
export {
|
|
11
|
-
export { SseClientAuthorizer } from './realtime-authorizer.js';
|
|
9
|
+
export { RedisStreamsBroker } from './redis-streams-broker.js';
|
|
12
10
|
export { Container } from './container.js';
|
|
13
11
|
export { createLogger } from './logger.js';
|
|
14
12
|
export { setErrorReporter, reportError } from './error-reporter.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/kernel/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/server/kernel/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAoB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAE/D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAE9C,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAG/D,iDAAiD;AACjD,OAAO,EAAE,kBAAkB,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1,14 +1,5 @@
|
|
|
1
1
|
import { ORPCError } from '@orpc/server';
|
|
2
|
-
import type { RateLimiterAdapter, RateLimitOptions
|
|
3
|
-
export declare class InProcessRateLimiter implements RateLimiterAdapter {
|
|
4
|
-
private readonly windows;
|
|
5
|
-
private readonly sweeper;
|
|
6
|
-
constructor();
|
|
7
|
-
consume(key: string, opts: RateLimitOptions): Promise<RateLimitResult>;
|
|
8
|
-
reset(key: string): Promise<void>;
|
|
9
|
-
private sweep;
|
|
10
|
-
close(): void;
|
|
11
|
-
}
|
|
2
|
+
import type { RateLimiterAdapter, RateLimitOptions } from '@openora/core/contracts';
|
|
12
3
|
/** A 429 (TOO_MANY_REQUESTS) error carrying the client-facing back-off hint in its data. */
|
|
13
4
|
export declare function makeRateLimitError(retryAfterMs: number): ORPCError<'TOO_MANY_REQUESTS', {
|
|
14
5
|
retryAfterMs: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEpF,4FAA4F;AAC5F,wBAAgB,kBAAkB,CAChC,YAAY,EAAE,MAAM,GACnB,SAAS,CAAC,mBAAmB,EAAE;IAAE,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAK1D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAC7D,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,GAAG,SAAS,EAC1C,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,IAAI,CAAC,CAQf"}
|
|
@@ -1,42 +1,4 @@
|
|
|
1
1
|
import { ORPCError } from '@orpc/server';
|
|
2
|
-
const SWEEP_INTERVAL_MS = 60_000;
|
|
3
|
-
export class InProcessRateLimiter {
|
|
4
|
-
windows = new Map();
|
|
5
|
-
sweeper;
|
|
6
|
-
constructor() {
|
|
7
|
-
this.sweeper = setInterval(() => this.sweep(), SWEEP_INTERVAL_MS);
|
|
8
|
-
this.sweeper.unref?.();
|
|
9
|
-
}
|
|
10
|
-
consume(key, opts) {
|
|
11
|
-
const now = Date.now();
|
|
12
|
-
const existing = this.windows.get(key);
|
|
13
|
-
if (!existing || now >= existing.resetAt) {
|
|
14
|
-
this.windows.set(key, { count: 1, resetAt: now + opts.windowMs });
|
|
15
|
-
return Promise.resolve({ allowed: true, retryAfterMs: 0 });
|
|
16
|
-
}
|
|
17
|
-
if (existing.count < opts.limit) {
|
|
18
|
-
existing.count += 1;
|
|
19
|
-
return Promise.resolve({ allowed: true, retryAfterMs: 0 });
|
|
20
|
-
}
|
|
21
|
-
return Promise.resolve({ allowed: false, retryAfterMs: existing.resetAt - now });
|
|
22
|
-
}
|
|
23
|
-
reset(key) {
|
|
24
|
-
this.windows.delete(key);
|
|
25
|
-
return Promise.resolve();
|
|
26
|
-
}
|
|
27
|
-
sweep() {
|
|
28
|
-
const now = Date.now();
|
|
29
|
-
for (const [key, window] of this.windows) {
|
|
30
|
-
if (now >= window.resetAt) {
|
|
31
|
-
this.windows.delete(key);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
close() {
|
|
36
|
-
clearInterval(this.sweeper);
|
|
37
|
-
this.windows.clear();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
2
|
/** A 429 (TOO_MANY_REQUESTS) error carrying the client-facing back-off hint in its data. */
|
|
41
3
|
export function makeRateLimitError(retryAfterMs) {
|
|
42
4
|
return new ORPCError('TOO_MANY_REQUESTS', {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/server/kernel/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"rate-limiter.js","sourceRoot":"","sources":["../../../src/server/kernel/rate-limiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,4FAA4F;AAC5F,MAAM,UAAU,kBAAkB,CAChC,YAAoB;IAEpB,OAAO,IAAI,SAAS,CAAC,mBAAmB,EAAE;QACxC,OAAO,EAAE,4CAA4C;QACrD,IAAI,EAAE,EAAE,YAAY,EAAE;KACvB,CAAC,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAA0C,EAC1C,GAAM,EACN,IAAsB;IAEtB,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;IACT,CAAC;IACD,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,kBAAkB,CAAC,YAAY,CAAC,CAAC;IACzC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { MessageBrokerAdapter, EventEnvelope, BrokerHandler, SubscribeOptions } from '@openora/core/contracts';
|
|
2
|
+
import type { RedisClient } from './redis-client.js';
|
|
3
|
+
type RedisStreamsBrokerOptions = {
|
|
4
|
+
serviceName: string;
|
|
5
|
+
startId?: '$' | '0';
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Durable `MESSAGE_BROKER` reference driver on Redis Streams, auto-bound by
|
|
9
|
+
* `createApp` when `REDIS_URL` is set (ADR-0030 - production is distributed-only,
|
|
10
|
+
* core ships no in-process default).
|
|
11
|
+
*
|
|
12
|
+
* Every `subscribe(topic, handler)` call for the same (topic, group) - default
|
|
13
|
+
* group is the deployment's `serviceName` - coalesces into ONE Redis consumer-group
|
|
14
|
+
* loop that fans out to every registered local handler, then XACKs once: an event
|
|
15
|
+
* is delivered to exactly one replica of the service (competing consumers across
|
|
16
|
+
* replicas via the shared group), and that replica runs every local handler for
|
|
17
|
+
* the topic (matches in-process fan-out semantics, but once per cluster, not once
|
|
18
|
+
* per replica). A distinct `SERVICE_NAME` per split service gives each service its
|
|
19
|
+
* own copy of every event; `createApp` requires one as soon as `SERVICE_MANIFEST`
|
|
20
|
+
* is set, since the group name is a durable identity and can't be derived from a
|
|
21
|
+
* module list that reorders and grows.
|
|
22
|
+
*
|
|
23
|
+
* Blocking `XREADGROUP` runs on a `client.duplicate()`d connection per loop, never
|
|
24
|
+
* on the shared client - `publish` (`XADD`, non-blocking) uses the shared client,
|
|
25
|
+
* so a blocked read never stalls the cache/rate-limiter commands sharing it.
|
|
26
|
+
* `publish` awaits the XADD and lets errors propagate (the `OutboxRelay` marks a
|
|
27
|
+
* row published only after this resolves - it must be reliable, not a silent
|
|
28
|
+
* no-op). Handler errors are guarded + logged, then the entry is XACKed regardless
|
|
29
|
+
* (matches `EventBus.on` - no per-handler retry; must-not-lose events use the
|
|
30
|
+
* outbox). A crash before XACK leaves the entry pending; `XAUTOCLAIM` periodically
|
|
31
|
+
* reclaims idle-pending entries so at-least-once delivery survives a replica crash.
|
|
32
|
+
*
|
|
33
|
+
* At-least-once holds from group creation onward, NOT before it. A group is created
|
|
34
|
+
* at `startId` (default `$`) on first subscribe and persists in Redis from then on,
|
|
35
|
+
* so restarts and outages are covered: the group keeps its cursor, undelivered
|
|
36
|
+
* entries wait in the stream, and pending ones are reclaimed. The one uncovered
|
|
37
|
+
* window is a group's FIRST-EVER creation - a service extracted after events were
|
|
38
|
+
* already flowing starts from `$` and never sees the backlog. `startId: '0'` closes
|
|
39
|
+
* that window by replaying everything still retained (up to STREAM_MAXLEN), at the
|
|
40
|
+
* cost of re-running every handler for those events: safe on a fresh deploy (empty
|
|
41
|
+
* streams), a duplicate-side-effect hazard for a late-added service, since core has
|
|
42
|
+
* no dedup layer - `EventBus.on` invokes handlers directly, and `eventId` is a key
|
|
43
|
+
* consumers must dedup on themselves.
|
|
44
|
+
*
|
|
45
|
+
* `orderingKey` is NOT honoured - Redis Streams have no partitioning, so per-key
|
|
46
|
+
* ordering across concurrent consumers isn't guaranteed (same footnote as
|
|
47
|
+
* `BullMqJobQueue`'s `orderingKey`).
|
|
48
|
+
*/
|
|
49
|
+
export declare class RedisStreamsBroker implements MessageBrokerAdapter {
|
|
50
|
+
private readonly client;
|
|
51
|
+
private readonly logger;
|
|
52
|
+
private readonly serviceName;
|
|
53
|
+
private readonly startId;
|
|
54
|
+
private readonly consumerId;
|
|
55
|
+
private readonly loops;
|
|
56
|
+
constructor(client: RedisClient, opts: RedisStreamsBrokerOptions);
|
|
57
|
+
publish(envelope: EventEnvelope): Promise<void>;
|
|
58
|
+
subscribe(topic: string, handler: BrokerHandler, options?: SubscribeOptions): () => void;
|
|
59
|
+
close(): Promise<void>;
|
|
60
|
+
private startLoop;
|
|
61
|
+
private reclaimPending;
|
|
62
|
+
private dispatch;
|
|
63
|
+
}
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=redis-streams-broker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redis-streams-broker.d.ts","sourceRoot":"","sources":["../../../src/server/kernel/redis-streams-broker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,gBAAgB,EACjB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AA4BrD,KAAK,yBAAyB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IAOpB,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,CAAC;CACrB,CAAC;AAgBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyCG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAQ3D,OAAO,CAAC,QAAQ,CAAC,MAAM;IAPzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkC;IACzD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;gBAGtC,MAAM,EAAE,WAAW,EACpC,IAAI,EAAE,yBAAyB;IAM3B,OAAO,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB,GAAG,MAAM,IAAI;IAwBlF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAS5B,OAAO,CAAC,SAAS;YA0EH,cAAc;YAyBd,QAAQ;CA6BvB"}
|