@zlink-systems/nestjs 0.10.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.
Files changed (41) hide show
  1. package/LICENSE +105 -0
  2. package/dist/.tsbuildinfo +1 -0
  3. package/dist/auto-discovery-marker.d.ts +3 -0
  4. package/dist/auto-discovery-marker.js +12 -0
  5. package/dist/contracts.d.ts +229 -0
  6. package/dist/contracts.js +4 -0
  7. package/dist/decorators.d.ts +16 -0
  8. package/dist/decorators.js +174 -0
  9. package/dist/dispatch-scope.d.ts +5 -0
  10. package/dist/dispatch-scope.js +19 -0
  11. package/dist/drain-health-indicator.d.ts +9 -0
  12. package/dist/drain-health-indicator.js +32 -0
  13. package/dist/framework-integration-contracts.d.ts +368 -0
  14. package/dist/framework-integration-contracts.js +2 -0
  15. package/dist/framework-loader.d.ts +50 -0
  16. package/dist/framework-loader.js +16 -0
  17. package/dist/handler-adapters.d.ts +13 -0
  18. package/dist/handler-adapters.js +155 -0
  19. package/dist/handler-metadata.d.ts +55 -0
  20. package/dist/handler-metadata.js +84 -0
  21. package/dist/http-client-module.d.ts +28 -0
  22. package/dist/http-client-module.js +96 -0
  23. package/dist/index.d.ts +10 -0
  24. package/dist/index.js +27 -0
  25. package/dist/internal-tokens.d.ts +2 -0
  26. package/dist/internal-tokens.js +5 -0
  27. package/dist/module.d.ts +11 -0
  28. package/dist/module.js +203 -0
  29. package/dist/options-builder.d.ts +2 -0
  30. package/dist/options-builder.js +973 -0
  31. package/dist/provider-discovery.d.ts +36 -0
  32. package/dist/provider-discovery.js +186 -0
  33. package/dist/providers.d.ts +16 -0
  34. package/dist/providers.js +426 -0
  35. package/dist/registration-composer.d.ts +7 -0
  36. package/dist/registration-composer.js +310 -0
  37. package/dist/spot-node-handler-registry.d.ts +24 -0
  38. package/dist/spot-node-handler-registry.js +105 -0
  39. package/dist/tokens.d.ts +19 -0
  40. package/dist/tokens.js +22 -0
  41. package/package.json +26 -0
@@ -0,0 +1,310 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasNestHandlerDiscovery = hasNestHandlerDiscovery;
4
+ exports.createDiscoveredOptions = createDiscoveredOptions;
5
+ exports.createRegistrationOptions = createRegistrationOptions;
6
+ exports.assertBuiltModuleOptions = assertBuiltModuleOptions;
7
+ const contracts_1 = require("./contracts");
8
+ const provider_discovery_1 = require("./provider-discovery");
9
+ const handler_adapters_1 = require("./handler-adapters");
10
+ const framework_loader_1 = require("./framework-loader");
11
+ const spot_node_handler_registry_1 = require("./spot-node-handler-registry");
12
+ function hasNestHandlerDiscovery(options) {
13
+ return hasConfiguredSpotNodes(options.spotNodes)
14
+ || Object.values(options.clientServerChannels ?? {}).some((channel) => (channel.handlerGroups ?? []).length > 0
15
+ || (channel.requestHandlerTypes ?? []).length > 0
16
+ || (channel.sendHandlerTypes ?? []).length > 0)
17
+ || Object.values(options.fanoutChannels ?? {}).some((channel) => (channel.handlerGroups ?? []).length > 0
18
+ || (channel.publishHandlerTypes ?? []).length > 0);
19
+ }
20
+ function hasConfiguredSpotNodes(value) {
21
+ if (value === undefined) {
22
+ return false;
23
+ }
24
+ return Array.isArray(value) ? value.length > 0 : Object.keys(value).length > 0;
25
+ }
26
+ function createDiscoveredOptions(options, discovery, moduleRef) {
27
+ const registrationOptions = createRegistrationOptions(options);
28
+ const channels = { ...(registrationOptions.channels ?? {}) };
29
+ const useImplicitHandlers = options.implicitHandlerAutoRegistration !== false;
30
+ const providerRefs = useImplicitHandlers ? (0, provider_discovery_1.discoverProviderRefs)(discovery, moduleRef) : [];
31
+ const spotActorProviderRefs = useImplicitHandlers ? (0, provider_discovery_1.discoverSpotActorProviderRefs)(discovery, moduleRef) : [];
32
+ const spotProviderRefs = useImplicitHandlers ? (0, provider_discovery_1.discoverSpotProviderRefs)(discovery, moduleRef) : [];
33
+ const spotTimerProviderRefs = useImplicitHandlers ? (0, provider_discovery_1.discoverSpotTimerProviderRefs)(discovery, moduleRef) : [];
34
+ const sessionProviderRefs = useImplicitHandlers ? (0, provider_discovery_1.discoverSessionProviderRefs)(discovery, moduleRef) : [];
35
+ const spotNodes = createDiscoveredMeshChannelOptions(createDiscoveredSpotNodeOptions(registrationOptions.spotNodes, spotActorProviderRefs, spotProviderRefs, spotTimerProviderRefs), providerRefs, moduleRef);
36
+ for (const [channelName, channel] of Object.entries(options.fanoutChannels ?? {})) {
37
+ const existingChannel = channels[channelName];
38
+ const publishHandlers = (0, handler_adapters_1.createDiscoveredPublishHandlers)(providerRefs, channel.handlerGroups, moduleRef);
39
+ const manualPublishHandlers = (0, handler_adapters_1.createManualPublishHandlers)(channel.publishHandlerTypes, moduleRef);
40
+ channels[channelName] = {
41
+ ...existingChannel,
42
+ publishHandlers: [
43
+ ...(existingChannel?.publishHandlers ?? []),
44
+ ...manualPublishHandlers,
45
+ ...publishHandlers
46
+ ]
47
+ };
48
+ }
49
+ for (const [channelName, channel] of Object.entries(options.clientServerChannels ?? {})) {
50
+ const existingChannel = channels[channelName];
51
+ channels[channelName] = {
52
+ ...existingChannel,
53
+ requestHandlers: [
54
+ ...(existingChannel.requestHandlers ?? []),
55
+ ...(0, handler_adapters_1.createManualRequestHandlers)(channel.requestHandlerTypes, moduleRef),
56
+ ...(0, handler_adapters_1.createDiscoveredRequestHandlers)(providerRefs, channel.handlerGroups, moduleRef)
57
+ ],
58
+ sendHandlers: [
59
+ ...(existingChannel.sendHandlers ?? []),
60
+ ...(0, handler_adapters_1.createManualSendHandlers)(channel.sendHandlerTypes, moduleRef),
61
+ ...(0, handler_adapters_1.createDiscoveredChannelSendHandlers)(providerRefs, channel.handlerGroups, moduleRef)
62
+ ]
63
+ };
64
+ }
65
+ return {
66
+ ...registrationOptions,
67
+ channels,
68
+ spotNodes,
69
+ streamNodes: attachDiscoveredSessionHandlers(registrationOptions.streamNodes, sessionProviderRefs.map((ref) => ref.handlerKey))
70
+ };
71
+ }
72
+ const ZLINK_SESSION_HANDLER_TYPES = Symbol.for('@zlink-systems/framework:session-handler-types');
73
+ function attachDiscoveredSessionHandlers(streamNodes, handlerTypes) {
74
+ if (streamNodes === undefined || handlerTypes.length === 0) {
75
+ return streamNodes;
76
+ }
77
+ return Object.fromEntries(Object.entries(streamNodes).map(([name, stream]) => {
78
+ const configured = { ...stream };
79
+ configured[ZLINK_SESSION_HANDLER_TYPES] = handlerTypes;
80
+ return [name, configured];
81
+ }));
82
+ }
83
+ function createDiscoveredMeshChannelOptions(value, providerRefs, moduleRef) {
84
+ if (value === undefined || Array.isArray(value)) {
85
+ return value;
86
+ }
87
+ return Object.fromEntries(Object.entries(value).map(([meshName, mesh]) => [meshName, {
88
+ ...mesh,
89
+ meshChannels: mesh.meshChannels === undefined
90
+ ? undefined
91
+ : Object.fromEntries(Object.entries(mesh.meshChannels).map(([channelName, channel]) => [channelName, {
92
+ ...channel,
93
+ requestHandlers: [
94
+ ...(0, handler_adapters_1.createManualRequestHandlers)(channel.requestHandlers, moduleRef),
95
+ ...(0, handler_adapters_1.createDiscoveredRequestHandlers)(providerRefs, channel.handlerGroups, moduleRef)
96
+ ],
97
+ sendHandlers: [
98
+ ...(0, handler_adapters_1.createManualSendHandlers)(channel.sendHandlers, moduleRef),
99
+ ...(0, handler_adapters_1.createDiscoveredSendHandlers)(providerRefs, channel.handlerGroups, moduleRef)
100
+ ]
101
+ }]))
102
+ }]));
103
+ }
104
+ function createDiscoveredSpotNodeOptions(value, refs, spotRefs = [], timerRefs = []) {
105
+ if (refs.length === 0 && spotRefs.length === 0 && timerRefs.length === 0) {
106
+ return value;
107
+ }
108
+ const registry = spot_node_handler_registry_1.SpotNodeHandlerRegistry.from(value);
109
+ if (registry.isEmpty) {
110
+ throw new framework_loader_1.framework.ZLinkConfigurationException('ZLink SPOT actor handlers require a registered SpotNode.');
111
+ }
112
+ addDiscoveredSpotTimers(registry, timerRefs);
113
+ addDiscoveredSpotHandlers(registry, spotRefs);
114
+ addDiscoveredSpotActorHandlers(registry, refs);
115
+ return registry.toOptions();
116
+ }
117
+ function addDiscoveredSpotTimers(registry, timerRefs) {
118
+ for (const ref of timerRefs) {
119
+ if (ref.metadata.entrySpot !== undefined) {
120
+ const entrySpotType = resolveNestType(ref.metadata.entrySpot, 'entrySpot');
121
+ const targets = registry.entrySpotTargets(entrySpotType, `ZLink Entry Spot timer handler '${ref.handlerName}' targets an Entry Spot that is not registered on any SpotNode.`);
122
+ for (const spotNode of targets) {
123
+ registry.addEntrySpotTimer(spotNode, {
124
+ entrySpotType,
125
+ handlerType: ref.handlerKey,
126
+ name: ref.metadata.name,
127
+ options: ref.metadata.options,
128
+ periodMs: ref.metadata.periodMs
129
+ });
130
+ }
131
+ continue;
132
+ }
133
+ const spotType = resolveNestType(ref.metadata.spot, 'spot');
134
+ const targets = registry.spotTargets(spotType, `ZLink SPOT timer handler '${ref.handlerName}' targets a Spot type that is not registered on any SpotNode.`);
135
+ for (const spotNode of targets) {
136
+ registry.addSpotTimer(spotNode, {
137
+ handlerType: ref.handlerKey,
138
+ name: ref.metadata.name,
139
+ options: ref.metadata.options,
140
+ periodMs: ref.metadata.periodMs,
141
+ spotType
142
+ });
143
+ }
144
+ }
145
+ }
146
+ function addDiscoveredSpotHandlers(registry, spotRefs) {
147
+ for (const ref of spotRefs) {
148
+ if (ref.metadata.kind === 'entrySpotPacket' || ref.metadata.kind === 'entrySpotSubscription') {
149
+ const entrySpotType = resolveNestType(ref.metadata.entrySpot, 'entrySpot');
150
+ const targets = registry.entrySpotTargets(entrySpotType, `ZLink Entry Spot handler '${ref.handlerName}' targets an Entry Spot that is not registered on any SpotNode.`);
151
+ for (const spotNode of targets) {
152
+ if (ref.metadata.kind === 'entrySpotPacket') {
153
+ registry.addEntrySpotPacket(spotNode, {
154
+ entrySpotType,
155
+ handlerType: ref.handlerKey,
156
+ packetName: ref.metadata.packetName
157
+ });
158
+ }
159
+ else {
160
+ registry.addEntrySpotSubscription(spotNode, {
161
+ entrySpotType,
162
+ handlerType: ref.handlerKey,
163
+ channelName: requireSpotSubscriptionChannelName(ref),
164
+ topic: requireSpotSubscriptionTopic(ref)
165
+ });
166
+ }
167
+ }
168
+ continue;
169
+ }
170
+ const spotType = resolveNestType(ref.metadata.spot, 'spot');
171
+ const targets = registry.spotTargets(spotType, `ZLink SPOT handler '${ref.handlerName}' targets a Spot type that is not registered on any SpotNode.`);
172
+ for (const spotNode of targets) {
173
+ if (ref.metadata.kind === 'spotPacket') {
174
+ registry.addSpotPacket(spotNode, {
175
+ handlerType: ref.handlerKey,
176
+ packetName: ref.metadata.packetName,
177
+ spotType: spotType
178
+ });
179
+ }
180
+ else {
181
+ registry.addSpotSubscription(spotNode, {
182
+ channelName: requireSpotSubscriptionChannelName(ref),
183
+ handlerType: ref.handlerKey,
184
+ spotType: spotType,
185
+ topic: requireSpotSubscriptionTopic(ref)
186
+ });
187
+ }
188
+ }
189
+ }
190
+ }
191
+ function addDiscoveredSpotActorHandlers(registry, refs) {
192
+ for (const ref of refs) {
193
+ if (ref.metadata.kind === 'entrySpotActorSend' || ref.metadata.kind === 'entrySpotActorRequest') {
194
+ const entrySpotType = resolveNestType(ref.metadata.entrySpot, 'entrySpot');
195
+ const actorType = resolveNestType(ref.metadata.actor, 'actor');
196
+ const targets = registry.entrySpotTargets(entrySpotType, `ZLink Entry Spot actor handler '${ref.handlerName}' targets an Entry Spot that is not registered on any SpotNode.`);
197
+ for (const spotNode of targets) {
198
+ const next = {
199
+ actorType,
200
+ entrySpotType,
201
+ handlerType: ref.handlerKey,
202
+ packetName: ref.metadata.packetName
203
+ };
204
+ registry.addEntrySpotActor(spotNode, ref.metadata.kind === 'entrySpotActorSend' ? 'send' : 'request', next);
205
+ }
206
+ continue;
207
+ }
208
+ const spotType = resolveNestType(ref.metadata.spot, 'spot');
209
+ const actorType = resolveNestType(ref.metadata.actor, 'actor');
210
+ const targets = registry.spotTargets(spotType, `ZLink SPOT actor handler '${ref.handlerName}' targets a Spot type that is not registered on any SpotNode.`);
211
+ for (const spotNode of targets) {
212
+ const next = {
213
+ actorType,
214
+ handlerType: ref.handlerKey,
215
+ packetName: ref.metadata.packetName,
216
+ spotType
217
+ };
218
+ registry.addSpotActor(spotNode, ref.metadata.kind === 'spotActorSend' ? 'send' : 'request', next);
219
+ }
220
+ }
221
+ }
222
+ function resolveNestType(resolver, name) {
223
+ if (resolver === undefined) {
224
+ throw new framework_loader_1.framework.ZLinkConfigurationException(`ZLink SPOT actor handler ${name} type is required.`);
225
+ }
226
+ if (isClassType(resolver)) {
227
+ return resolver;
228
+ }
229
+ const resolved = resolver();
230
+ if (!isClassType(resolved)) {
231
+ throw new framework_loader_1.framework.ZLinkConfigurationException(`ZLink SPOT actor handler ${name} type resolver must return a class.`);
232
+ }
233
+ return resolved;
234
+ }
235
+ function isClassType(value) {
236
+ return typeof value === 'function' && /^class\s/.test(Function.prototype.toString.call(value));
237
+ }
238
+ function requireSpotSubscriptionTopic(ref) {
239
+ const topic = ref.metadata.topic;
240
+ if (topic === undefined || topic.trim().length === 0) {
241
+ throw new framework_loader_1.framework.ZLinkConfigurationException(`ZLink SPOT subscription handler '${ref.handlerName}' requires a topic.`);
242
+ }
243
+ return topic;
244
+ }
245
+ function requireSpotSubscriptionChannelName(ref) {
246
+ const channelName = ref.metadata.channelName;
247
+ if (channelName === undefined || channelName.trim().length === 0) {
248
+ throw new framework_loader_1.framework.ZLinkConfigurationException(`ZLink SPOT subscription handler '${ref.handlerName}' requires a channelName.`);
249
+ }
250
+ return channelName;
251
+ }
252
+ function createRegistrationOptions(options) {
253
+ const channels = {};
254
+ for (const [name, channel] of Object.entries(options.clientServerChannels ?? {})) {
255
+ assertChannelNameAvailable(channels, name, 'ClientServerChannel');
256
+ channels[name] = {
257
+ client: channel.client,
258
+ server: channel.server
259
+ };
260
+ }
261
+ for (const [name, channel] of Object.entries(options.fanoutChannels ?? {})) {
262
+ assertChannelNameAvailable(channels, name, 'FanoutChannel');
263
+ channels[name] = {
264
+ routingId: channel.routingId,
265
+ routingIdPrefix: channel.routingIdPrefix,
266
+ publishHandlers: channel.publishHandlers,
267
+ publisher: channel.publisher,
268
+ subscriber: channel.subscriber
269
+ };
270
+ }
271
+ return {
272
+ network: options.network,
273
+ applicationVersion: options.applicationVersion,
274
+ maintenanceWave: options.maintenanceWave,
275
+ actorTransferTimeoutMs: options.actorTransferTimeoutMs,
276
+ messageFollowDurationMs: options.messageFollowDurationMs,
277
+ sessionReplacementCallbackTimeoutMs: options.sessionReplacementCallbackTimeoutMs,
278
+ channels,
279
+ codecs: options.codecs,
280
+ coreHwm: options.coreHwm,
281
+ applicationJobQueue: options.applicationJobQueue,
282
+ dispatch: options.dispatch,
283
+ filters: options.filters,
284
+ locations: options.locations,
285
+ metrics: options.metrics,
286
+ requestTimeoutMs: options.requestTimeoutMs,
287
+ spotFactories: options.spotFactories,
288
+ spotNodes: options.spotNodes,
289
+ spotPublisherClients: options.spotPublisherClients,
290
+ streamCompression: options.streamCompression,
291
+ streamNodes: options.streams,
292
+ worker: options.worker
293
+ };
294
+ }
295
+ function assertChannelNameAvailable(channels, name, kind) {
296
+ if (Object.hasOwn(channels, name)) {
297
+ throw new framework_loader_1.framework.ZLinkConfigurationException(`Channel '${name}' is already registered before ${kind}.`);
298
+ }
299
+ }
300
+ function assertBuiltModuleOptions(options) {
301
+ if (!isBuiltModuleOptions(options)) {
302
+ throw new framework_loader_1.framework.ZLinkConfigurationException('NestJS ZLinkModule options must be created with zlinkFramework().build().');
303
+ }
304
+ return options;
305
+ }
306
+ function isBuiltModuleOptions(options) {
307
+ return typeof options === 'object'
308
+ && options !== null
309
+ && options[contracts_1.ZLINK_MODULE_OPTIONS_BRAND] === true;
310
+ }
@@ -0,0 +1,24 @@
1
+ import type { ZLinkEntrySpotActorRequestHandlerRegistration, ZLinkEntrySpotActorSendHandlerRegistration, ZLinkEntrySpotPacketHandlerRegistration, ZLinkEntrySpotSubscriptionHandlerRegistration, ZLinkEntrySpotTimerHandlerRegistration, ZLinkFrameworkRegistrationOptions, ZLinkSpotActorRequestHandlerRegistration, ZLinkSpotActorSendHandlerRegistration, ZLinkSpotNodeOptions, ZLinkSpotPacketHandlerRegistration, ZLinkSpotSubscriptionHandlerRegistration, ZLinkSpotTimerHandlerRegistration } from './framework-integration-contracts';
2
+ import type { Mutable } from './contracts';
3
+ import type { Type, ZLinkInstanceSpot, ZLinkSpot } from '@zlink-systems/framework';
4
+ type MutableSpotNode = Mutable<ZLinkSpotNodeOptions>;
5
+ export declare class SpotNodeHandlerRegistry {
6
+ private readonly nodes;
7
+ private constructor();
8
+ static from(value: ZLinkFrameworkRegistrationOptions['spotNodes']): SpotNodeHandlerRegistry;
9
+ get isEmpty(): boolean;
10
+ toOptions(): ZLinkFrameworkRegistrationOptions['spotNodes'];
11
+ entrySpotTargets(entrySpotType: NonNullable<ZLinkSpotNodeOptions['entrySpotType']>, missingMessage: string): readonly MutableSpotNode[];
12
+ spotTargets(spotType: Type<ZLinkSpot | ZLinkInstanceSpot>, missingMessage: string): readonly MutableSpotNode[];
13
+ addEntrySpotTimer(node: MutableSpotNode, registration: ZLinkEntrySpotTimerHandlerRegistration): void;
14
+ addSpotTimer(node: MutableSpotNode, registration: ZLinkSpotTimerHandlerRegistration): void;
15
+ addEntrySpotPacket(node: MutableSpotNode, registration: ZLinkEntrySpotPacketHandlerRegistration): void;
16
+ addEntrySpotSubscription(node: MutableSpotNode, registration: ZLinkEntrySpotSubscriptionHandlerRegistration): void;
17
+ addSpotPacket(node: MutableSpotNode, registration: ZLinkSpotPacketHandlerRegistration): void;
18
+ addSpotSubscription(node: MutableSpotNode, registration: ZLinkSpotSubscriptionHandlerRegistration): void;
19
+ addEntrySpotActor(node: MutableSpotNode, kind: 'send' | 'request', registration: ZLinkEntrySpotActorSendHandlerRegistration | ZLinkEntrySpotActorRequestHandlerRegistration): void;
20
+ addSpotActor(node: MutableSpotNode, kind: 'send' | 'request', registration: ZLinkSpotActorSendHandlerRegistration | ZLinkSpotActorRequestHandlerRegistration): void;
21
+ private requireTargets;
22
+ private assertUnique;
23
+ }
24
+ export {};
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SpotNodeHandlerRegistry = void 0;
4
+ const framework_loader_1 = require("./framework-loader");
5
+ class SpotNodeHandlerRegistry {
6
+ nodes;
7
+ constructor(nodes) {
8
+ this.nodes = nodes;
9
+ }
10
+ static from(value) {
11
+ if (value === undefined) {
12
+ return new SpotNodeHandlerRegistry({});
13
+ }
14
+ if (!Array.isArray(value)) {
15
+ return new SpotNodeHandlerRegistry(Object.fromEntries(Object.entries(value).map(([name, node]) => [name, { ...node }])));
16
+ }
17
+ return new SpotNodeHandlerRegistry(Object.fromEntries(value.map((node) => {
18
+ if (typeof node === 'string') {
19
+ return [node, {}];
20
+ }
21
+ const { name, ...options } = node;
22
+ return [name, { ...options }];
23
+ })));
24
+ }
25
+ get isEmpty() {
26
+ return Object.keys(this.nodes).length === 0;
27
+ }
28
+ toOptions() {
29
+ return this.nodes;
30
+ }
31
+ entrySpotTargets(entrySpotType, missingMessage) {
32
+ return this.requireTargets((node) => node.entrySpotType === entrySpotType, missingMessage);
33
+ }
34
+ spotTargets(spotType, missingMessage) {
35
+ return this.requireTargets((node) => (node.spotFactories ?? []).includes(spotType)
36
+ || Object.values(node.instanceSpotFactories ?? {}).includes(spotType), missingMessage);
37
+ }
38
+ addEntrySpotTimer(node, registration) {
39
+ node.entrySpotTimerHandlers = [...(node.entrySpotTimerHandlers ?? []), registration];
40
+ }
41
+ addSpotTimer(node, registration) {
42
+ node.spotTimerHandlers = [...(node.spotTimerHandlers ?? []), registration];
43
+ }
44
+ addEntrySpotPacket(node, registration) {
45
+ const packetName = registration.packetName ?? registration.handlerType.name;
46
+ this.assertUnique(node.entrySpotPacketHandlers, (existing) => existing.entrySpotType === registration.entrySpotType &&
47
+ (existing.packetName ?? existing.handlerType.name) === packetName, `Duplicate Entry Spot packet handler '${registration.entrySpotType.name}:${packetName}'.`);
48
+ node.entrySpotPacketHandlers = [...(node.entrySpotPacketHandlers ?? []), registration];
49
+ }
50
+ addEntrySpotSubscription(node, registration) {
51
+ this.assertUnique(node.entrySpotSubscriptionHandlers, (existing) => existing.entrySpotType === registration.entrySpotType &&
52
+ existing.channelName === registration.channelName && existing.topic === registration.topic, `Duplicate Entry Spot subscription handler '${registration.entrySpotType.name}:${registration.channelName}:${registration.topic}'.`);
53
+ node.entrySpotSubscriptionHandlers = [...(node.entrySpotSubscriptionHandlers ?? []), registration];
54
+ }
55
+ addSpotPacket(node, registration) {
56
+ const packetName = registration.packetName ?? registration.handlerType.name;
57
+ this.assertUnique(node.spotPacketHandlers, (existing) => existing.spotType === registration.spotType &&
58
+ (existing.packetName ?? existing.handlerType.name) === packetName, `Duplicate SPOT packet handler '${registration.spotType.name}:${packetName}'.`);
59
+ node.spotPacketHandlers = [...(node.spotPacketHandlers ?? []), registration];
60
+ }
61
+ addSpotSubscription(node, registration) {
62
+ this.assertUnique(node.spotSubscriptionHandlers, (existing) => existing.spotType === registration.spotType &&
63
+ existing.channelName === registration.channelName && existing.topic === registration.topic, `Duplicate SPOT subscription handler '${registration.spotType.name}:${registration.channelName}:${registration.topic}'.`);
64
+ node.spotSubscriptionHandlers = [...(node.spotSubscriptionHandlers ?? []), registration];
65
+ }
66
+ addEntrySpotActor(node, kind, registration) {
67
+ const existing = kind === 'send'
68
+ ? node.entrySpotActorSendHandlers
69
+ : node.entrySpotActorRequestHandlers;
70
+ this.assertUnique(existing, (handler) => handler.entrySpotType === registration.entrySpotType &&
71
+ handler.actorType === registration.actorType &&
72
+ handler.packetName === registration.packetName, `Duplicate Entry Spot actor handler '${registration.entrySpotType.name}:${registration.actorType.name}:${registration.packetName}'.`);
73
+ if (kind === 'send') {
74
+ node.entrySpotActorSendHandlers = [...(node.entrySpotActorSendHandlers ?? []), registration];
75
+ }
76
+ else {
77
+ node.entrySpotActorRequestHandlers = [...(node.entrySpotActorRequestHandlers ?? []), registration];
78
+ }
79
+ }
80
+ addSpotActor(node, kind, registration) {
81
+ const existing = kind === 'send' ? node.spotActorSendHandlers : node.spotActorRequestHandlers;
82
+ this.assertUnique(existing, (handler) => handler.spotType === registration.spotType &&
83
+ handler.actorType === registration.actorType &&
84
+ handler.packetName === registration.packetName, `Duplicate SPOT actor handler '${registration.spotType.name}:${registration.actorType.name}:${registration.packetName}'.`);
85
+ if (kind === 'send') {
86
+ node.spotActorSendHandlers = [...(node.spotActorSendHandlers ?? []), registration];
87
+ }
88
+ else {
89
+ node.spotActorRequestHandlers = [...(node.spotActorRequestHandlers ?? []), registration];
90
+ }
91
+ }
92
+ requireTargets(predicate, missingMessage) {
93
+ const matches = Object.values(this.nodes).filter(predicate);
94
+ if (matches.length === 0) {
95
+ throw new framework_loader_1.framework.ZLinkConfigurationException(missingMessage);
96
+ }
97
+ return matches;
98
+ }
99
+ assertUnique(existing, isDuplicate, duplicateMessage) {
100
+ if ((existing ?? []).some(isDuplicate)) {
101
+ throw new framework_loader_1.framework.ZLinkConfigurationException(duplicateMessage);
102
+ }
103
+ }
104
+ }
105
+ exports.SpotNodeHandlerRegistry = SpotNodeHandlerRegistry;
@@ -0,0 +1,19 @@
1
+ export declare const ZLINK_NEST_HANDLER_GROUP: unique symbol;
2
+ export declare const ZLINK_FRAMEWORK_REGISTRATION: unique symbol;
3
+ export declare const ZLINK_FRAMEWORK_RUNTIME: unique symbol;
4
+ export declare const ZLINK_CHANNEL_CLIENT: unique symbol;
5
+ export declare const ZLINK_CHANNEL_RUNTIME_OPTIONS: unique symbol;
6
+ export declare const ZLINK_CLIENT_SERVER_RUNTIME: unique symbol;
7
+ export declare const ZLINK_ROUTE_MESH_RUNTIME_OPTIONS: unique symbol;
8
+ export declare const ZLINK_ROUTE_CLIENT: unique symbol;
9
+ export declare const ZLINK_FANOUT_CLIENT: unique symbol;
10
+ export declare const ZLINK_FANOUT_RUNTIME: unique symbol;
11
+ export declare const ZLINK_ACTOR_CLIENT: unique symbol;
12
+ export declare const ZLINK_BOUND_SESSION_FACTORY: unique symbol;
13
+ export declare const ZLINK_MESSAGE_METADATA_POLICY: unique symbol;
14
+ export declare const ZLINK_SPOT_MANAGER: unique symbol;
15
+ export declare const ZLINK_SPOT_OUTBOUND: unique symbol;
16
+ export declare const ZLINK_SPOT_PUBLISHER_CLIENT: unique symbol;
17
+ export declare const ZLINK_ACTOR_MANAGER: unique symbol;
18
+ export declare const ZLINK_ROUTE_MESH_RUNTIME: unique symbol;
19
+ export declare const ZLINK_LOCATION_RUNTIME_QUERY: unique symbol;
package/dist/tokens.js ADDED
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ZLINK_LOCATION_RUNTIME_QUERY = exports.ZLINK_ROUTE_MESH_RUNTIME = exports.ZLINK_ACTOR_MANAGER = exports.ZLINK_SPOT_PUBLISHER_CLIENT = exports.ZLINK_SPOT_OUTBOUND = exports.ZLINK_SPOT_MANAGER = exports.ZLINK_MESSAGE_METADATA_POLICY = exports.ZLINK_BOUND_SESSION_FACTORY = exports.ZLINK_ACTOR_CLIENT = exports.ZLINK_FANOUT_RUNTIME = exports.ZLINK_FANOUT_CLIENT = exports.ZLINK_ROUTE_CLIENT = exports.ZLINK_ROUTE_MESH_RUNTIME_OPTIONS = exports.ZLINK_CLIENT_SERVER_RUNTIME = exports.ZLINK_CHANNEL_RUNTIME_OPTIONS = exports.ZLINK_CHANNEL_CLIENT = exports.ZLINK_FRAMEWORK_RUNTIME = exports.ZLINK_FRAMEWORK_REGISTRATION = exports.ZLINK_NEST_HANDLER_GROUP = void 0;
4
+ exports.ZLINK_NEST_HANDLER_GROUP = Symbol.for('@zlink-systems/nestjs:handler-group');
5
+ exports.ZLINK_FRAMEWORK_REGISTRATION = Symbol.for('@zlink-systems/framework:registration');
6
+ exports.ZLINK_FRAMEWORK_RUNTIME = Symbol.for('@zlink-systems/framework:runtime');
7
+ exports.ZLINK_CHANNEL_CLIENT = Symbol.for('@zlink-systems/framework:channel-client');
8
+ exports.ZLINK_CHANNEL_RUNTIME_OPTIONS = Symbol.for('@zlink-systems/framework:channel-runtime-options');
9
+ exports.ZLINK_CLIENT_SERVER_RUNTIME = Symbol.for('@zlink-systems/framework:client-server-runtime');
10
+ exports.ZLINK_ROUTE_MESH_RUNTIME_OPTIONS = Symbol.for('@zlink-systems/framework:route-mesh-runtime-options');
11
+ exports.ZLINK_ROUTE_CLIENT = Symbol.for('@zlink-systems/framework:route-client');
12
+ exports.ZLINK_FANOUT_CLIENT = Symbol.for('@zlink-systems/framework:fanout-client');
13
+ exports.ZLINK_FANOUT_RUNTIME = Symbol.for('@zlink-systems/framework:fanout-runtime');
14
+ exports.ZLINK_ACTOR_CLIENT = Symbol.for('@zlink-systems/framework:actor-client');
15
+ exports.ZLINK_BOUND_SESSION_FACTORY = Symbol.for('@zlink-systems/framework:bound-session-factory');
16
+ exports.ZLINK_MESSAGE_METADATA_POLICY = Symbol.for('@zlink-systems/framework:message-metadata-policy');
17
+ exports.ZLINK_SPOT_MANAGER = Symbol.for('@zlink-systems/framework:spot-manager');
18
+ exports.ZLINK_SPOT_OUTBOUND = Symbol.for('@zlink-systems/framework:spot-outbound');
19
+ exports.ZLINK_SPOT_PUBLISHER_CLIENT = Symbol.for('@zlink-systems/framework:spot-publisher-client');
20
+ exports.ZLINK_ACTOR_MANAGER = Symbol.for('@zlink-systems/framework:actor-manager');
21
+ exports.ZLINK_ROUTE_MESH_RUNTIME = Symbol.for('@zlink-systems/framework:route-mesh-runtime');
22
+ exports.ZLINK_LOCATION_RUNTIME_QUERY = Symbol.for('@zlink-systems/framework:location-runtime-query');
package/package.json ADDED
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "@zlink-systems/nestjs",
3
+ "version": "0.10.0",
4
+ "license": "SEE LICENSE IN LICENSE",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "default": "./dist/index.js"
14
+ }
15
+ },
16
+ "dependencies": {
17
+ "@nestjs/common": "^10.4.22",
18
+ "@zlink-systems/framework": "0.10.0",
19
+ "@zlink-systems/http-client": "0.10.0",
20
+ "reflect-metadata": "^0.2.2",
21
+ "rxjs": "^7.8.2"
22
+ },
23
+ "peerDependencies": {
24
+ "@nestjs/core": "^10.4.22"
25
+ }
26
+ }