@rayondigital/nest-dapr 0.9.43 → 0.9.44

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.
@@ -1,5 +1,6 @@
1
1
  export declare const DAPR_BINDING_METADATA = "DAPR_BINDING_METADATA";
2
2
  export declare const DAPR_PUBSUB_METADATA = "DAPR_PUBSUB_METADATA";
3
3
  export declare const DAPR_ACTOR_PUBSUB_METADATA = "DAPR_PUBSUB_METADATA";
4
+ export declare const DAPR_ACTOR_EVENT_METADATA = "DAPR_ACTOR_EVENT_METADATA";
4
5
  export declare const DAPR_ACTOR_METADATA = "DAPR_ACTOR_METADATA";
5
6
  export declare const DAPR_ACTOR_STATE_METADATA = "DAPR_ACTOR_STATE_METADATA";
package/dist/constants.js CHANGED
@@ -1,8 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DAPR_ACTOR_STATE_METADATA = exports.DAPR_ACTOR_METADATA = exports.DAPR_ACTOR_PUBSUB_METADATA = exports.DAPR_PUBSUB_METADATA = exports.DAPR_BINDING_METADATA = void 0;
3
+ exports.DAPR_ACTOR_STATE_METADATA = exports.DAPR_ACTOR_METADATA = exports.DAPR_ACTOR_EVENT_METADATA = exports.DAPR_ACTOR_PUBSUB_METADATA = exports.DAPR_PUBSUB_METADATA = exports.DAPR_BINDING_METADATA = void 0;
4
4
  exports.DAPR_BINDING_METADATA = 'DAPR_BINDING_METADATA';
5
5
  exports.DAPR_PUBSUB_METADATA = 'DAPR_PUBSUB_METADATA';
6
6
  exports.DAPR_ACTOR_PUBSUB_METADATA = 'DAPR_PUBSUB_METADATA';
7
+ exports.DAPR_ACTOR_EVENT_METADATA = 'DAPR_ACTOR_EVENT_METADATA';
7
8
  exports.DAPR_ACTOR_METADATA = 'DAPR_ACTOR_METADATA';
8
9
  exports.DAPR_ACTOR_STATE_METADATA = 'DAPR_ACTOR_STATE_METADATA';
@@ -0,0 +1,7 @@
1
+ export interface DaprActorOnEventMetadata<T> {
2
+ event: DaprActorEventType;
3
+ actorId: (payload: T) => string;
4
+ ignoreErrors?: boolean;
5
+ }
6
+ export type DaprActorEventType = string | symbol | string[] | symbol[];
7
+ export declare function DaprActorOnEvent<T>(event: DaprActorEventType, actorId: (payload: T) => string, ignoreErrors?: boolean): MethodDecorator;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DaprActorOnEvent = void 0;
4
+ const extend_metadata_util_1 = require("@nestjs/common/utils/extend-metadata.util");
5
+ const constants_1 = require("./constants");
6
+ function DaprActorOnEvent(event, actorId, ignoreErrors) {
7
+ const decoratorFactory = (target, key, descriptor) => {
8
+ (0, extend_metadata_util_1.extendArrayMetadata)(constants_1.DAPR_ACTOR_EVENT_METADATA, [{ event, actorId, ignoreErrors }], descriptor.value);
9
+ return descriptor;
10
+ };
11
+ decoratorFactory.KEY = constants_1.DAPR_ACTOR_EVENT_METADATA;
12
+ return decoratorFactory;
13
+ }
14
+ exports.DaprActorOnEvent = DaprActorOnEvent;
@@ -0,0 +1,14 @@
1
+ import { OnOptions } from 'eventemitter2';
2
+ export declare class DaprEventEmitter {
3
+ private readonly logger;
4
+ private readonly eventEmitter;
5
+ emit(event: string, ...args: any[]): void;
6
+ emitAsync(event: string, ...args: any[]): Promise<any[]>;
7
+ on(event: string | symbol | string[] | symbol[], listener: (...args: any[]) => void, options?: boolean | OnOptions): void;
8
+ off(event: string, listener: (...args: any[]) => void): void;
9
+ prependListener(event: string, listener: (...args: any[]) => void): void;
10
+ once(event: string, listener: (...args: any[]) => void): void;
11
+ hasListeners(event: string): boolean;
12
+ listeners(event: string): import("eventemitter2").ListenerFn[];
13
+ removeAllListeners(event?: string): void;
14
+ }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ var DaprEventEmitter_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.DaprEventEmitter = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const eventemitter2_1 = __importDefault(require("eventemitter2"));
16
+ let DaprEventEmitter = DaprEventEmitter_1 = class DaprEventEmitter {
17
+ constructor() {
18
+ this.logger = new common_1.Logger(DaprEventEmitter_1.name);
19
+ this.eventEmitter = new eventemitter2_1.default({
20
+ maxListeners: 50,
21
+ ignoreErrors: true,
22
+ wildcard: true,
23
+ verboseMemoryLeak: true,
24
+ });
25
+ }
26
+ emit(event, ...args) {
27
+ this.eventEmitter.emit(event, ...args);
28
+ }
29
+ emitAsync(event, ...args) {
30
+ return this.eventEmitter.emitAsync(event, ...args);
31
+ }
32
+ on(event, listener, options) {
33
+ this.eventEmitter.on(event, listener, options);
34
+ }
35
+ off(event, listener) {
36
+ this.eventEmitter.off(event, listener);
37
+ }
38
+ prependListener(event, listener) {
39
+ this.eventEmitter.prependListener(event, listener);
40
+ }
41
+ once(event, listener) {
42
+ this.eventEmitter.once(event, listener);
43
+ }
44
+ hasListeners(event) {
45
+ return this.eventEmitter.listeners(event).length > 0;
46
+ }
47
+ listeners(event) {
48
+ return this.eventEmitter.listeners(event);
49
+ }
50
+ removeAllListeners(event) {
51
+ this.eventEmitter.removeAllListeners(event);
52
+ }
53
+ };
54
+ DaprEventEmitter = DaprEventEmitter_1 = __decorate([
55
+ (0, common_1.Injectable)()
56
+ ], DaprEventEmitter);
57
+ exports.DaprEventEmitter = DaprEventEmitter;
@@ -0,0 +1,19 @@
1
+ import { OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common';
2
+ import { DiscoveryService, MetadataScanner } from '@nestjs/core';
3
+ import { DaprActorClient } from './actors/dapr-actor-client.service';
4
+ import { DaprEventEmitter } from './dapr-event-emitter.service';
5
+ import { DaprMetadataAccessor } from './dapr-metadata.accessor';
6
+ export declare class DaprEventSubscriberLoader implements OnApplicationBootstrap, OnApplicationShutdown {
7
+ private readonly discoveryService;
8
+ private readonly metadataAccessor;
9
+ private readonly metadataScanner;
10
+ private readonly eventEmitter;
11
+ private readonly actorClient;
12
+ private readonly logger;
13
+ constructor(discoveryService: DiscoveryService, metadataAccessor: DaprMetadataAccessor, metadataScanner: MetadataScanner, eventEmitter: DaprEventEmitter, actorClient: DaprActorClient);
14
+ onApplicationBootstrap(): void;
15
+ onApplicationShutdown(): void;
16
+ loadEventListeners(): void;
17
+ private subscribeToEventIfListener;
18
+ private registerActorEventListener;
19
+ }
@@ -0,0 +1,97 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
12
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
13
+ return new (P || (P = Promise))(function (resolve, reject) {
14
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
16
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
17
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
18
+ });
19
+ };
20
+ Object.defineProperty(exports, "__esModule", { value: true });
21
+ exports.DaprEventSubscriberLoader = void 0;
22
+ const common_1 = require("@nestjs/common");
23
+ const core_1 = require("@nestjs/core");
24
+ const dapr_actor_client_service_1 = require("./actors/dapr-actor-client.service");
25
+ const dapr_event_emitter_service_1 = require("./dapr-event-emitter.service");
26
+ const dapr_metadata_accessor_1 = require("./dapr-metadata.accessor");
27
+ let DaprEventSubscriberLoader = class DaprEventSubscriberLoader {
28
+ constructor(discoveryService, metadataAccessor, metadataScanner, eventEmitter, actorClient) {
29
+ this.discoveryService = discoveryService;
30
+ this.metadataAccessor = metadataAccessor;
31
+ this.metadataScanner = metadataScanner;
32
+ this.eventEmitter = eventEmitter;
33
+ this.actorClient = actorClient;
34
+ this.logger = new common_1.Logger('DaprEventSubscriber');
35
+ }
36
+ onApplicationBootstrap() {
37
+ this.loadEventListeners();
38
+ }
39
+ onApplicationShutdown() {
40
+ this.eventEmitter.removeAllListeners();
41
+ }
42
+ loadEventListeners() {
43
+ const providers = this.discoveryService.getProviders();
44
+ const controllers = this.discoveryService.getControllers();
45
+ [...providers, ...controllers]
46
+ .filter((wrapper) => wrapper.instance && !wrapper.isAlias)
47
+ .forEach((wrapper) => {
48
+ const { instance } = wrapper;
49
+ const prototype = Object.getPrototypeOf(instance) || {};
50
+ this.metadataScanner.scanFromPrototype(instance, prototype, (methodKey) => this.subscribeToEventIfListener(instance, methodKey));
51
+ });
52
+ }
53
+ subscribeToEventIfListener(instance, methodKey) {
54
+ const actorMetadata = this.metadataAccessor.getDaprActorMetadata(instance.constructor);
55
+ if (!actorMetadata) {
56
+ return;
57
+ }
58
+ const eventListenerMetadatas = this.metadataAccessor.getDaprEventHandlerMetadata(instance[methodKey]);
59
+ if (!eventListenerMetadatas) {
60
+ return;
61
+ }
62
+ for (const eventListenerMetadata of eventListenerMetadatas) {
63
+ if (!eventListenerMetadata.actorId)
64
+ continue;
65
+ this.registerActorEventListener(actorMetadata, eventListenerMetadata, methodKey, eventListenerMetadata.ignoreErrors);
66
+ }
67
+ }
68
+ registerActorEventListener(actorMetadata, eventMetadata, methodKey, ignoreErrors = false) {
69
+ this.eventEmitter.on(eventMetadata.event, (data) => __awaiter(this, void 0, void 0, function* () {
70
+ var _a;
71
+ try {
72
+ const actorId = eventMetadata.actorId(data);
73
+ const actorType = (_a = actorMetadata.interfaceType.name) !== null && _a !== void 0 ? _a : actorMetadata.interfaceType.constructor.name;
74
+ const actor = this.actorClient.getActorByTypeName(actorType, actorId);
75
+ return yield actor[methodKey].call(actor, data);
76
+ }
77
+ catch (e) {
78
+ this.logger.error(e);
79
+ if (!ignoreErrors) {
80
+ throw e;
81
+ }
82
+ }
83
+ }), {
84
+ async: true,
85
+ promisify: true,
86
+ });
87
+ }
88
+ };
89
+ DaprEventSubscriberLoader = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [core_1.DiscoveryService,
92
+ dapr_metadata_accessor_1.DaprMetadataAccessor,
93
+ core_1.MetadataScanner,
94
+ dapr_event_emitter_service_1.DaprEventEmitter,
95
+ dapr_actor_client_service_1.DaprActorClient])
96
+ ], DaprEventSubscriberLoader);
97
+ exports.DaprEventSubscriberLoader = DaprEventSubscriberLoader;
@@ -1,5 +1,6 @@
1
1
  import { Type } from '@nestjs/common';
2
2
  import { Reflector } from '@nestjs/core';
3
+ import { DaprActorOnEventMetadata } from './dapr-actor-on-event.decorator';
3
4
  import { DaprActorMetadata } from './dapr-actor.decorator';
4
5
  import { DaprBindingMetadata } from './dapr-binding.decorator';
5
6
  import { DaprPubSubMetadata } from './dapr-pubsub.decorator';
@@ -9,4 +10,5 @@ export declare class DaprMetadataAccessor {
9
10
  getDaprPubSubHandlerMetadata(target: Type<unknown>): DaprPubSubMetadata | undefined;
10
11
  getDaprBindingHandlerMetadata(target: Type<unknown>): DaprBindingMetadata | undefined;
11
12
  getDaprActorMetadata(target: Function | Type<unknown>): DaprActorMetadata | undefined;
13
+ getDaprEventHandlerMetadata(target: Type<unknown>): DaprActorOnEventMetadata<any>[] | undefined;
12
14
  }
@@ -26,6 +26,16 @@ let DaprMetadataAccessor = class DaprMetadataAccessor {
26
26
  getDaprActorMetadata(target) {
27
27
  return this.reflector.get(constants_1.DAPR_ACTOR_METADATA, target);
28
28
  }
29
+ getDaprEventHandlerMetadata(target) {
30
+ if (!target || (typeof target !== 'function' && typeof target !== 'object')) {
31
+ return undefined;
32
+ }
33
+ const metadata = this.reflector.get(constants_1.DAPR_ACTOR_EVENT_METADATA, target);
34
+ if (!metadata) {
35
+ return undefined;
36
+ }
37
+ return Array.isArray(metadata) ? metadata : [metadata];
38
+ }
29
39
  };
30
40
  DaprMetadataAccessor = __decorate([
31
41
  (0, common_1.Injectable)(),
@@ -25,9 +25,11 @@ const actor_runtime_service_1 = require("./actors/actor-runtime.service");
25
25
  const dapr_actor_client_service_1 = require("./actors/dapr-actor-client.service");
26
26
  const nest_actor_manager_1 = require("./actors/nest-actor-manager");
27
27
  const dapr_context_service_1 = require("./dapr-context-service");
28
+ const dapr_event_subscriber_loader_1 = require("./dapr-event-subscriber.loader");
28
29
  const dapr_metadata_accessor_1 = require("./dapr-metadata.accessor");
29
30
  const dapr_loader_1 = require("./dapr.loader");
30
31
  const dapr_pubsub_client_service_1 = require("./pubsub/dapr-pubsub-client.service");
32
+ const dapr_event_emitter_service_1 = require("./dapr-event-emitter.service");
31
33
  exports.DAPR_MODULE_OPTIONS_TOKEN = 'DAPR_MODULE_OPTIONS_TOKEN';
32
34
  var DaprContextProvider;
33
35
  (function (DaprContextProvider) {
@@ -75,12 +77,22 @@ let DaprModule = DaprModule_1 = class DaprModule {
75
77
  },
76
78
  dapr_loader_1.DaprLoader,
77
79
  dapr_metadata_accessor_1.DaprMetadataAccessor,
80
+ dapr_event_subscriber_loader_1.DaprEventSubscriberLoader,
78
81
  dapr_context_service_1.DaprContextService,
79
82
  dapr_actor_client_service_1.DaprActorClient,
80
83
  dapr_pubsub_client_service_1.DaprPubSubClient,
84
+ dapr_event_emitter_service_1.DaprEventEmitter,
81
85
  core_1.Reflector,
82
86
  ],
83
- exports: [dapr_1.DaprClient, dapr_pubsub_client_service_1.DaprPubSubClient, dapr_context_service_1.DaprContextService, actor_runtime_service_1.ActorRuntimeService, dapr_actor_client_service_1.DaprActorClient],
87
+ exports: [
88
+ dapr_1.DaprClient,
89
+ dapr_pubsub_client_service_1.DaprPubSubClient,
90
+ dapr_context_service_1.DaprContextService,
91
+ actor_runtime_service_1.ActorRuntimeService,
92
+ dapr_actor_client_service_1.DaprActorClient,
93
+ dapr_event_subscriber_loader_1.DaprEventSubscriberLoader,
94
+ dapr_event_emitter_service_1.DaprEventEmitter,
95
+ ],
84
96
  };
85
97
  }
86
98
  static registerAsync(options) {
@@ -109,13 +121,23 @@ let DaprModule = DaprModule_1 = class DaprModule {
109
121
  },
110
122
  dapr_loader_1.DaprLoader,
111
123
  dapr_metadata_accessor_1.DaprMetadataAccessor,
124
+ dapr_event_subscriber_loader_1.DaprEventSubscriberLoader,
112
125
  dapr_context_service_1.DaprContextService,
113
126
  dapr_actor_client_service_1.DaprActorClient,
114
127
  dapr_pubsub_client_service_1.DaprPubSubClient,
128
+ dapr_event_emitter_service_1.DaprEventEmitter,
115
129
  core_1.Reflector,
116
130
  ...(options.extraProviders || []),
117
131
  ],
118
- exports: [dapr_1.DaprClient, dapr_pubsub_client_service_1.DaprPubSubClient, dapr_context_service_1.DaprContextService, actor_runtime_service_1.ActorRuntimeService, dapr_actor_client_service_1.DaprActorClient],
132
+ exports: [
133
+ dapr_1.DaprClient,
134
+ dapr_pubsub_client_service_1.DaprPubSubClient,
135
+ dapr_context_service_1.DaprContextService,
136
+ actor_runtime_service_1.ActorRuntimeService,
137
+ dapr_actor_client_service_1.DaprActorClient,
138
+ dapr_event_subscriber_loader_1.DaprEventSubscriberLoader,
139
+ dapr_event_emitter_service_1.DaprEventEmitter,
140
+ ],
119
141
  };
120
142
  }
121
143
  static createAsyncProviders(options) {
@@ -147,9 +169,9 @@ let DaprModule = DaprModule_1 = class DaprModule {
147
169
  };
148
170
  DaprModule = DaprModule_1 = __decorate([
149
171
  (0, common_1.Module)({
150
- imports: [nestjs_cls_1.ClsModule],
151
- providers: [dapr_actor_client_service_1.DaprActorClient, nest_actor_manager_1.NestActorManager, dapr_context_service_1.DaprContextService, actor_runtime_service_1.ActorRuntimeService],
152
- exports: [dapr_actor_client_service_1.DaprActorClient, dapr_context_service_1.DaprContextService, actor_runtime_service_1.ActorRuntimeService],
172
+ imports: [nestjs_cls_1.ClsModule, core_1.DiscoveryModule],
173
+ providers: [dapr_actor_client_service_1.DaprActorClient, nest_actor_manager_1.NestActorManager, dapr_context_service_1.DaprContextService, dapr_event_subscriber_loader_1.DaprEventSubscriberLoader, actor_runtime_service_1.ActorRuntimeService],
174
+ exports: [dapr_actor_client_service_1.DaprActorClient, dapr_context_service_1.DaprContextService, dapr_event_subscriber_loader_1.DaprEventSubscriberLoader, actor_runtime_service_1.ActorRuntimeService],
153
175
  })
154
176
  ], DaprModule);
155
177
  exports.DaprModule = DaprModule;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rayondigital/nest-dapr",
3
- "version": "0.9.43",
3
+ "version": "0.9.44",
4
4
  "description": "Develop NestJs microservices using Dapr pubsub, actors and other bindings",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -25,7 +25,12 @@
25
25
  "@nestjs/common": "^10.0.0",
26
26
  "@nestjs/core": "^10.0.0",
27
27
  "nestjs-cls": "^3.0.0",
28
- "rxjs": "^7.1.0"
28
+ "rxjs": "^7.1.0",
29
+ "eventemitter2": "^6.0.0"
30
+ },
31
+ "dependencies": {
32
+ "@dapr/dapr": "^3.2.0",
33
+ "async-lock": "^1.4.1"
29
34
  },
30
35
  "devDependencies": {
31
36
  "@nestjs/platform-express": "^10.0.0",
@@ -45,10 +50,6 @@
45
50
  "ts-node": "^10.9.1",
46
51
  "typescript": "^4.7.4"
47
52
  },
48
- "dependencies": {
49
- "@dapr/dapr": "^3.2.0",
50
- "async-lock": "^1.4.1"
51
- },
52
53
  "optionalDependencies": {
53
54
  "nestjs-cls": "^3.6.0"
54
55
  },