@lssm/lib.bus 0.0.0-canary-20251217063201 → 0.0.0-canary-20251217073102
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/auditableBus.js +131 -1
- package/dist/contracts/dist/capabilities/openbanking.js +88 -1
- package/dist/contracts/dist/client/index.js +5 -1
- package/dist/contracts/dist/client/react/feature-render.js +2 -1
- package/dist/contracts/dist/client/react/form-render.js +4 -1
- package/dist/contracts/dist/client/react/index.js +4 -1
- package/dist/contracts/dist/contract-registry/index.js +1 -1
- package/dist/contracts/dist/contract-registry/schemas.js +60 -1
- package/dist/contracts/dist/docs/PUBLISHING.docblock.js +16 -76
- package/dist/contracts/dist/docs/accessibility_wcag_compliance_specs.docblock.js +16 -350
- package/dist/contracts/dist/docs/index.js +29 -1
- package/dist/contracts/dist/docs/presentations.js +71 -1
- package/dist/contracts/dist/docs/registry.js +44 -1
- package/dist/contracts/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +16 -383
- package/dist/contracts/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +16 -68
- package/dist/contracts/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +16 -140
- package/dist/contracts/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +16 -86
- package/dist/contracts/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +16 -1
- package/dist/contracts/dist/docs/tech/auth/better-auth-nextjs.docblock.js +24 -2
- package/dist/contracts/dist/docs/tech/contracts/openapi-export.docblock.js +21 -2
- package/dist/contracts/dist/docs/tech/lifecycle-stage-system.docblock.js +16 -213
- package/dist/contracts/dist/docs/tech/llm/llm-integration.docblock.js +73 -5
- package/dist/contracts/dist/docs/tech/mcp-endpoints.docblock.js +37 -1
- package/dist/contracts/dist/docs/tech/presentation-runtime.docblock.js +16 -1
- package/dist/contracts/dist/docs/tech/schema/README.docblock.js +20 -262
- package/dist/contracts/dist/docs/tech/studio/learning-events.docblock.js +48 -1
- package/dist/contracts/dist/docs/tech/studio/learning-journeys.docblock.js +24 -2
- package/dist/contracts/dist/docs/tech/studio/platform-admin-panel.docblock.js +23 -2
- package/dist/contracts/dist/docs/tech/studio/project-access-teams.docblock.js +25 -16
- package/dist/contracts/dist/docs/tech/studio/project-routing.docblock.js +67 -1
- package/dist/contracts/dist/docs/tech/studio/sandbox-unlogged.docblock.js +22 -2
- package/dist/contracts/dist/docs/tech/studio/team-invitations.docblock.js +40 -36
- package/dist/contracts/dist/docs/tech/studio/workspace-ops.docblock.js +47 -1
- package/dist/contracts/dist/docs/tech/studio/workspaces.docblock.js +23 -2
- package/dist/contracts/dist/docs/tech/telemetry-ingest.docblock.js +36 -3
- package/dist/contracts/dist/docs/tech/templates/runtime.docblock.js +20 -1
- package/dist/contracts/dist/docs/tech/vscode-extension.docblock.js +36 -3
- package/dist/contracts/dist/docs/tech/workflows/overview.docblock.js +20 -1
- package/dist/contracts/dist/events.js +8 -1
- package/dist/contracts/dist/experiments/evaluator.js +1 -1
- package/dist/contracts/dist/index.js +71 -1
- package/dist/contracts/dist/install.js +2 -1
- package/dist/contracts/dist/integrations/contracts.js +377 -1
- package/dist/contracts/dist/integrations/index.js +18 -1
- package/dist/contracts/dist/integrations/openbanking/contracts/accounts.js +228 -1
- package/dist/contracts/dist/integrations/openbanking/contracts/balances.js +159 -1
- package/dist/contracts/dist/integrations/openbanking/contracts/index.js +3 -1
- package/dist/contracts/dist/integrations/openbanking/contracts/transactions.js +210 -1
- package/dist/contracts/dist/integrations/openbanking/models.js +242 -1
- package/dist/contracts/dist/integrations/openbanking/telemetry.js +13 -1
- package/dist/contracts/dist/integrations/providers/elevenlabs.js +52 -1
- package/dist/contracts/dist/integrations/providers/gcs-storage.js +75 -1
- package/dist/contracts/dist/integrations/providers/gmail.js +87 -1
- package/dist/contracts/dist/integrations/providers/google-calendar.js +66 -1
- package/dist/contracts/dist/integrations/providers/index.js +11 -1
- package/dist/contracts/dist/integrations/providers/mistral.js +68 -1
- package/dist/contracts/dist/integrations/providers/postmark.js +68 -1
- package/dist/contracts/dist/integrations/providers/powens.js +116 -1
- package/dist/contracts/dist/integrations/providers/qdrant.js +73 -1
- package/dist/contracts/dist/integrations/providers/registry.js +10 -1
- package/dist/contracts/dist/integrations/providers/stripe.js +83 -1
- package/dist/contracts/dist/integrations/providers/twilio-sms.js +61 -1
- package/dist/contracts/dist/jsonschema.js +1 -1
- package/dist/contracts/dist/knowledge/contracts.js +306 -1
- package/dist/contracts/dist/knowledge/index.js +7 -1
- package/dist/contracts/dist/knowledge/spaces/email-threads.js +34 -1
- package/dist/contracts/dist/knowledge/spaces/financial-docs.js +34 -1
- package/dist/contracts/dist/knowledge/spaces/financial-overview.js +38 -1
- package/dist/contracts/dist/knowledge/spaces/index.js +6 -1
- package/dist/contracts/dist/knowledge/spaces/product-canon.js +34 -1
- package/dist/contracts/dist/knowledge/spaces/support-faq.js +37 -1
- package/dist/contracts/dist/knowledge/spaces/uploaded-docs.js +34 -1
- package/dist/contracts/dist/llm/exporters.js +19 -1
- package/dist/contracts/dist/llm/index.js +2 -1
- package/dist/contracts/dist/llm/prompts.js +1 -1
- package/dist/contracts/dist/onboarding-base.js +196 -1
- package/dist/contracts/dist/openapi.js +1 -1
- package/dist/contracts/dist/ownership.js +21 -1
- package/dist/contracts/dist/presentations.js +1 -1
- package/dist/contracts/dist/presentations.v2.js +11 -1
- package/dist/contracts/dist/prompt.js +1 -1
- package/dist/contracts/dist/promptRegistry.js +1 -1
- package/dist/contracts/dist/regenerator/index.js +1 -1
- package/dist/contracts/dist/regenerator/service.js +6 -1
- package/dist/contracts/dist/registry.js +2 -1
- package/dist/contracts/dist/resources.js +1 -1
- package/dist/contracts/dist/schema/dist/EnumType.js +2 -1
- package/dist/contracts/dist/schema/dist/FieldType.js +49 -1
- package/dist/contracts/dist/schema/dist/ScalarTypeEnum.js +236 -1
- package/dist/contracts/dist/schema/dist/SchemaModel.js +34 -1
- package/dist/contracts/dist/schema/dist/entity/defineEntity.js +1 -1
- package/dist/contracts/dist/schema/dist/entity/index.js +2 -1
- package/dist/contracts/dist/schema/dist/entity/types.js +1 -1
- package/dist/contracts/dist/schema/dist/index.js +6 -1
- package/dist/contracts/dist/server/graphql-pothos.js +6 -1
- package/dist/contracts/dist/server/index.js +8 -1
- package/dist/contracts/dist/server/mcp/createMcpServer.js +4 -1
- package/dist/contracts/dist/server/mcp/registerPresentations.js +2 -1
- package/dist/contracts/dist/server/mcp/registerPrompts.js +1 -1
- package/dist/contracts/dist/server/mcp/registerResources.js +2 -1
- package/dist/contracts/dist/server/mcp/registerTools.js +1 -1
- package/dist/contracts/dist/server/provider-mcp.js +1 -1
- package/dist/contracts/dist/server/rest-elysia.js +1 -1
- package/dist/contracts/dist/server/rest-express.js +1 -1
- package/dist/contracts/dist/server/rest-generic.js +1 -1
- package/dist/contracts/dist/server/rest-next-app.js +1 -1
- package/dist/contracts/dist/server/rest-next-pages.js +1 -1
- package/dist/contracts/dist/spec.js +34 -1
- package/dist/contracts/dist/telemetry/index.js +1 -1
- package/dist/contracts/dist/telemetry/tracker.js +1 -1
- package/dist/contracts/dist/tests/index.js +1 -1
- package/dist/contracts/dist/tests/runner.js +2 -1
- package/dist/contracts/dist/workflow/index.js +1 -1
- package/dist/contracts/dist/workflow/runner.js +1 -1
- package/dist/eventBus.js +32 -1
- package/dist/filtering.js +130 -1
- package/dist/inMemoryBus.js +28 -1
- package/dist/index.js +8 -1
- package/dist/metadata.js +81 -1
- package/dist/subscriber.js +18 -1
- package/package.json +5 -5
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import"@modelcontextprotocol/sdk/server/mcp.js";
|
|
1
|
+
import "@modelcontextprotocol/sdk/server/mcp.js";
|
|
2
|
+
import "node:buffer";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../../jsonschema.js";
|
|
1
|
+
import "../../jsonschema.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./mcp/createMcpServer.js";
|
|
1
|
+
import "./mcp/createMcpServer.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rest-generic.js";
|
|
1
|
+
import "./rest-generic.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rest-generic.js";
|
|
1
|
+
import "./rest-generic.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"../jsonschema.js";
|
|
1
|
+
import "../jsonschema.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rest-generic.js";
|
|
1
|
+
import "./rest-generic.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./rest-generic.js";
|
|
1
|
+
import "./rest-generic.js";
|
|
@@ -1 +1,34 @@
|
|
|
1
|
-
|
|
1
|
+
//#region ../contracts/dist/spec.js
|
|
2
|
+
/**
|
|
3
|
+
* Helper to define a Command (write operation).
|
|
4
|
+
* Sets `kind: 'command'` and defaults `idempotent: false`.
|
|
5
|
+
*/
|
|
6
|
+
const defineCommand = (spec) => ({
|
|
7
|
+
...spec,
|
|
8
|
+
meta: {
|
|
9
|
+
...spec.meta,
|
|
10
|
+
kind: "command"
|
|
11
|
+
},
|
|
12
|
+
policy: {
|
|
13
|
+
...spec.policy,
|
|
14
|
+
idempotent: spec.policy?.["policy"]?.idempotent ?? false
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
/**
|
|
18
|
+
* Helper to define a Query (read-only operation).
|
|
19
|
+
* Sets `kind: 'query'` and forces `idempotent: true`.
|
|
20
|
+
*/
|
|
21
|
+
const defineQuery = (spec) => ({
|
|
22
|
+
...spec,
|
|
23
|
+
meta: {
|
|
24
|
+
...spec.meta,
|
|
25
|
+
kind: "query"
|
|
26
|
+
},
|
|
27
|
+
policy: {
|
|
28
|
+
...spec.policy,
|
|
29
|
+
idempotent: true
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
//#endregion
|
|
34
|
+
export { defineCommand, defineQuery };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./tracker.js";
|
|
1
|
+
import "./tracker.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"crypto";
|
|
1
|
+
import "crypto";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./runner.js";
|
|
1
|
+
import "./runner.js";
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
import"../index.js";
|
|
1
|
+
import "../index.js";
|
|
2
|
+
import "node:assert";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./runner.js";
|
|
1
|
+
import "./runner.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"node:crypto";
|
|
1
|
+
import "node:crypto";
|
package/dist/eventBus.js
CHANGED
|
@@ -1 +1,32 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import { eventKey } from "./contracts/dist/events.js";
|
|
2
|
+
import "./contracts/dist/index.js";
|
|
3
|
+
|
|
4
|
+
//#region src/eventBus.ts
|
|
5
|
+
/** Helper to encode a typed event envelope into JSON string */
|
|
6
|
+
function encodeEvent(envelope) {
|
|
7
|
+
return new TextEncoder().encode(JSON.stringify(envelope));
|
|
8
|
+
}
|
|
9
|
+
/** Helper to decode JSON string into a typed event envelope */
|
|
10
|
+
function decodeEvent(data) {
|
|
11
|
+
return JSON.parse(new TextDecoder().decode(data));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Create a typed publisher function for a given event spec.
|
|
15
|
+
* It ensures payload conformance at compile time and builds the correct topic.
|
|
16
|
+
*/
|
|
17
|
+
function makePublisher(bus, spec) {
|
|
18
|
+
return async (payload, traceId) => {
|
|
19
|
+
const envelope = {
|
|
20
|
+
id: crypto.randomUUID(),
|
|
21
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
22
|
+
name: spec.name,
|
|
23
|
+
version: spec.version,
|
|
24
|
+
payload,
|
|
25
|
+
traceId
|
|
26
|
+
};
|
|
27
|
+
await bus.publish(eventKey(spec.name, spec.version), encodeEvent(envelope));
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
//#endregion
|
|
32
|
+
export { decodeEvent, encodeEvent, makePublisher };
|
package/dist/filtering.js
CHANGED
|
@@ -1 +1,130 @@
|
|
|
1
|
-
import{decodeEvent
|
|
1
|
+
import { decodeEvent } from "./eventBus.js";
|
|
2
|
+
|
|
3
|
+
//#region src/filtering.ts
|
|
4
|
+
/**
|
|
5
|
+
* Check if an event matches a filter.
|
|
6
|
+
*/
|
|
7
|
+
function matchesFilter(envelope, filter) {
|
|
8
|
+
if (filter.eventName) {
|
|
9
|
+
const pattern = filter.eventName.replace(/\*/g, ".*");
|
|
10
|
+
if (!(/* @__PURE__ */ new RegExp(`^${pattern}$`)).test(envelope.name)) return false;
|
|
11
|
+
}
|
|
12
|
+
if (filter.domain) {
|
|
13
|
+
if (!envelope.name.startsWith(filter.domain + ".")) return false;
|
|
14
|
+
}
|
|
15
|
+
if (filter.version !== void 0 && envelope.version !== filter.version) return false;
|
|
16
|
+
if (filter.actorId && envelope.metadata?.actorId !== filter.actorId) return false;
|
|
17
|
+
if (filter.orgId && envelope.metadata?.orgId !== filter.orgId) return false;
|
|
18
|
+
if (filter.tags) {
|
|
19
|
+
const eventTags = envelope.metadata?.tags ?? {};
|
|
20
|
+
for (const [key, value] of Object.entries(filter.tags)) if (eventTags[key] !== value) return false;
|
|
21
|
+
}
|
|
22
|
+
if (filter.predicate && !filter.predicate(envelope)) return false;
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create a filtered subscriber that only receives matching events.
|
|
27
|
+
*/
|
|
28
|
+
function createFilteredSubscriber(bus, filter, handler) {
|
|
29
|
+
return async (topic) => {
|
|
30
|
+
return bus.subscribe(topic, async (bytes) => {
|
|
31
|
+
const envelope = decodeEvent(bytes);
|
|
32
|
+
if (matchesFilter(envelope, filter)) await handler(envelope);
|
|
33
|
+
});
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Domain-specific event bus that filters by domain prefix.
|
|
38
|
+
*/
|
|
39
|
+
var DomainEventBus = class {
|
|
40
|
+
constructor(bus, domain) {
|
|
41
|
+
this.bus = bus;
|
|
42
|
+
this.domain = domain;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Publish a domain event.
|
|
46
|
+
*/
|
|
47
|
+
async publish(spec, payload, metadata) {
|
|
48
|
+
const eventName = spec.name.startsWith(this.domain + ".") ? spec.name : `${this.domain}.${spec.name}`;
|
|
49
|
+
const envelope = {
|
|
50
|
+
id: crypto.randomUUID(),
|
|
51
|
+
occurredAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
52
|
+
name: eventName,
|
|
53
|
+
version: spec.version,
|
|
54
|
+
payload,
|
|
55
|
+
metadata
|
|
56
|
+
};
|
|
57
|
+
const bytes = new TextEncoder().encode(JSON.stringify(envelope));
|
|
58
|
+
await this.bus.publish(`${eventName}.v${spec.version}`, bytes);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Subscribe to all domain events.
|
|
62
|
+
*/
|
|
63
|
+
async subscribeAll(handler) {
|
|
64
|
+
return this.bus.subscribe(`${this.domain}.*`, async (bytes) => {
|
|
65
|
+
await handler(decodeEvent(bytes));
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Subscribe with filter.
|
|
70
|
+
*/
|
|
71
|
+
async subscribeFiltered(filter, handler) {
|
|
72
|
+
const fullFilter = {
|
|
73
|
+
...filter,
|
|
74
|
+
domain: this.domain
|
|
75
|
+
};
|
|
76
|
+
return this.bus.subscribe(`${this.domain}.*`, async (bytes) => {
|
|
77
|
+
const envelope = decodeEvent(bytes);
|
|
78
|
+
if (matchesFilter(envelope, fullFilter)) await handler(envelope);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Create a domain-scoped event bus.
|
|
84
|
+
*/
|
|
85
|
+
function createDomainBus(bus, domain) {
|
|
86
|
+
return new DomainEventBus(bus, domain);
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Event router that routes events to different handlers based on filters.
|
|
90
|
+
*/
|
|
91
|
+
var EventRouter = class {
|
|
92
|
+
routes = [];
|
|
93
|
+
/**
|
|
94
|
+
* Add a route.
|
|
95
|
+
*/
|
|
96
|
+
route(filter, handler) {
|
|
97
|
+
this.routes.push({
|
|
98
|
+
filter,
|
|
99
|
+
handler
|
|
100
|
+
});
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Route an event to matching handlers.
|
|
105
|
+
*/
|
|
106
|
+
async dispatch(envelope) {
|
|
107
|
+
const matchingRoutes = this.routes.filter((r) => matchesFilter(envelope, r.filter));
|
|
108
|
+
await Promise.all(matchingRoutes.map((r) => r.handler(envelope)));
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Create a subscriber that routes events.
|
|
112
|
+
*/
|
|
113
|
+
createSubscriber(bus) {
|
|
114
|
+
return async (topic) => {
|
|
115
|
+
return bus.subscribe(topic, async (bytes) => {
|
|
116
|
+
const envelope = decodeEvent(bytes);
|
|
117
|
+
await this.dispatch(envelope);
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
/**
|
|
123
|
+
* Create an event router.
|
|
124
|
+
*/
|
|
125
|
+
function createEventRouter() {
|
|
126
|
+
return new EventRouter();
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
//#endregion
|
|
130
|
+
export { DomainEventBus, EventRouter, createDomainBus, createEventRouter, createFilteredSubscriber, matchesFilter };
|
package/dist/inMemoryBus.js
CHANGED
|
@@ -1 +1,28 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/inMemoryBus.ts
|
|
2
|
+
/**
|
|
3
|
+
* In-memory bus for dev/test. Not for production scale.
|
|
4
|
+
* Subscribers receive events synchronously in the order they were published.
|
|
5
|
+
*/
|
|
6
|
+
var InMemoryBus = class {
|
|
7
|
+
listeners = /* @__PURE__ */ new Map();
|
|
8
|
+
async publish(topic, payload) {
|
|
9
|
+
const handlers = this.listeners.get(topic);
|
|
10
|
+
if (!handlers) return;
|
|
11
|
+
await Promise.all([...handlers].map((h) => h(payload)));
|
|
12
|
+
}
|
|
13
|
+
async subscribe(topic, handler) {
|
|
14
|
+
const topicStr = String(topic);
|
|
15
|
+
let set = this.listeners.get(topicStr);
|
|
16
|
+
if (!set) {
|
|
17
|
+
set = /* @__PURE__ */ new Set();
|
|
18
|
+
this.listeners.set(topicStr, set);
|
|
19
|
+
}
|
|
20
|
+
set.add(handler);
|
|
21
|
+
return async () => {
|
|
22
|
+
set?.delete(handler);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
//#endregion
|
|
28
|
+
export { InMemoryBus };
|
package/dist/index.js
CHANGED
|
@@ -1 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { decodeEvent, encodeEvent, makePublisher } from "./eventBus.js";
|
|
2
|
+
import { AuditableEventBus, InMemoryAuditStorage, createAuditableEventBus, makeAuditablePublisher } from "./auditableBus.js";
|
|
3
|
+
import { DomainEventBus, EventRouter, createDomainBus, createEventRouter, createFilteredSubscriber, matchesFilter } from "./filtering.js";
|
|
4
|
+
import { InMemoryBus } from "./inMemoryBus.js";
|
|
5
|
+
import { subscribeEvent } from "./subscriber.js";
|
|
6
|
+
import { MetadataContext, createMetadataContext, createMetadataFromContext, mergeMetadata } from "./metadata.js";
|
|
7
|
+
|
|
8
|
+
export { AuditableEventBus, DomainEventBus, EventRouter, InMemoryAuditStorage, InMemoryBus, MetadataContext, createAuditableEventBus, createDomainBus, createEventRouter, createFilteredSubscriber, createMetadataContext, createMetadataFromContext, decodeEvent, encodeEvent, makeAuditablePublisher, makePublisher, matchesFilter, mergeMetadata, subscribeEvent };
|
package/dist/metadata.js
CHANGED
|
@@ -1 +1,81 @@
|
|
|
1
|
-
|
|
1
|
+
//#region src/metadata.ts
|
|
2
|
+
/**
|
|
3
|
+
* Create metadata from request context.
|
|
4
|
+
*/
|
|
5
|
+
function createMetadataFromContext(context) {
|
|
6
|
+
return {
|
|
7
|
+
actorId: context.userId,
|
|
8
|
+
actorType: context.userId ? "user" : "system",
|
|
9
|
+
orgId: context.orgId,
|
|
10
|
+
tenantId: context.orgId,
|
|
11
|
+
sessionId: context.sessionId,
|
|
12
|
+
requestId: context.requestId,
|
|
13
|
+
traceId: context.traceId || crypto.randomUUID(),
|
|
14
|
+
clientIp: context.clientIp,
|
|
15
|
+
userAgent: context.userAgent
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Merge metadata with overrides.
|
|
20
|
+
*/
|
|
21
|
+
function mergeMetadata(base, overrides) {
|
|
22
|
+
return {
|
|
23
|
+
...base,
|
|
24
|
+
...overrides,
|
|
25
|
+
tags: {
|
|
26
|
+
...base.tags,
|
|
27
|
+
...overrides.tags
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create a metadata context that can be passed through operations.
|
|
33
|
+
*/
|
|
34
|
+
var MetadataContext = class MetadataContext {
|
|
35
|
+
metadata;
|
|
36
|
+
constructor(initial = {}) {
|
|
37
|
+
this.metadata = { ...initial };
|
|
38
|
+
if (!this.metadata.traceId) this.metadata.traceId = crypto.randomUUID();
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get the current metadata.
|
|
42
|
+
*/
|
|
43
|
+
get() {
|
|
44
|
+
return { ...this.metadata };
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set a metadata value.
|
|
48
|
+
*/
|
|
49
|
+
set(key, value) {
|
|
50
|
+
this.metadata[key] = value;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Add a tag.
|
|
55
|
+
*/
|
|
56
|
+
tag(key, value) {
|
|
57
|
+
this.metadata.tags = {
|
|
58
|
+
...this.metadata.tags,
|
|
59
|
+
[key]: value
|
|
60
|
+
};
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Create a child context with the same trace.
|
|
65
|
+
*/
|
|
66
|
+
child(overrides = {}) {
|
|
67
|
+
return new MetadataContext(mergeMetadata(this.metadata, {
|
|
68
|
+
...overrides,
|
|
69
|
+
spanId: crypto.randomUUID()
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
/**
|
|
74
|
+
* Create a new metadata context.
|
|
75
|
+
*/
|
|
76
|
+
function createMetadataContext(initial) {
|
|
77
|
+
return new MetadataContext(initial);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
//#endregion
|
|
81
|
+
export { MetadataContext, createMetadataContext, createMetadataFromContext, mergeMetadata };
|
package/dist/subscriber.js
CHANGED
|
@@ -1 +1,18 @@
|
|
|
1
|
-
import{decodeEvent
|
|
1
|
+
import { decodeEvent } from "./eventBus.js";
|
|
2
|
+
|
|
3
|
+
//#region src/subscriber.ts
|
|
4
|
+
/** Typed subscription using your EventSpec */
|
|
5
|
+
async function subscribeEvent(bus, spec, handler) {
|
|
6
|
+
const topic = `${spec.name}.v${spec.version}`;
|
|
7
|
+
return bus.subscribe(topic, async (u8) => {
|
|
8
|
+
const env = decodeEvent(u8);
|
|
9
|
+
if (env.name !== spec.name || env.version !== spec.version) return;
|
|
10
|
+
await handler(env.payload, {
|
|
11
|
+
traceId: env.traceId,
|
|
12
|
+
deliveryId: env.id
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
//#endregion
|
|
18
|
+
export { subscribeEvent };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lssm/lib.bus",
|
|
3
|
-
"version": "0.0.0-canary-
|
|
3
|
+
"version": "0.0.0-canary-20251217073102",
|
|
4
4
|
"scripts": {
|
|
5
5
|
"publish:pkg": "bun publish --tolerate-republish --ignore-scripts --verbose",
|
|
6
6
|
"publish:pkg:canary": "bun publish:pkg --tag canary",
|
|
@@ -14,15 +14,15 @@
|
|
|
14
14
|
"lint:check": "eslint src"
|
|
15
15
|
},
|
|
16
16
|
"devDependencies": {
|
|
17
|
-
"@lssm/tool.tsdown": "0.0.0-canary-
|
|
18
|
-
"@lssm/tool.typescript": "0.0.0-canary-
|
|
17
|
+
"@lssm/tool.tsdown": "0.0.0-canary-20251217073102",
|
|
18
|
+
"@lssm/tool.typescript": "0.0.0-canary-20251217073102",
|
|
19
19
|
"@types/express": "^5.0.3",
|
|
20
20
|
"tsdown": "^0.17.4",
|
|
21
21
|
"typescript": "^5.9.3"
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
|
-
"@lssm/lib.schema": "0.0.0-canary-
|
|
25
|
-
"@lssm/lib.contracts": "0.0.0-canary-
|
|
24
|
+
"@lssm/lib.schema": "0.0.0-canary-20251217073102",
|
|
25
|
+
"@lssm/lib.contracts": "0.0.0-canary-20251217073102"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"elysia": "^1.4.19",
|