@omen.foundation/node-microservice-runtime 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (145) hide show
  1. package/.env +13 -0
  2. package/dist/auth.cjs +97 -0
  3. package/dist/auth.d.ts +14 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +93 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/cli/index.d.ts +3 -0
  8. package/dist/cli/index.d.ts.map +1 -0
  9. package/dist/cli/index.js +588 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/decorators.cjs +181 -0
  12. package/dist/decorators.d.ts +23 -0
  13. package/dist/decorators.d.ts.map +1 -0
  14. package/dist/decorators.js +155 -0
  15. package/dist/decorators.js.map +1 -0
  16. package/dist/dependency.cjs +165 -0
  17. package/dist/dependency.d.ts +56 -0
  18. package/dist/dependency.d.ts.map +1 -0
  19. package/dist/dependency.js +162 -0
  20. package/dist/dependency.js.map +1 -0
  21. package/dist/dev.cjs +34 -0
  22. package/dist/dev.d.ts +9 -0
  23. package/dist/dev.d.ts.map +1 -0
  24. package/dist/dev.js +32 -0
  25. package/dist/dev.js.map +1 -0
  26. package/dist/discovery.cjs +79 -0
  27. package/dist/discovery.d.ts +20 -0
  28. package/dist/discovery.d.ts.map +1 -0
  29. package/dist/discovery.js +75 -0
  30. package/dist/discovery.js.map +1 -0
  31. package/dist/docs.cjs +206 -0
  32. package/dist/docs.d.ts +30 -0
  33. package/dist/docs.d.ts.map +1 -0
  34. package/dist/docs.js +209 -0
  35. package/dist/docs.js.map +1 -0
  36. package/dist/env.cjs +106 -0
  37. package/dist/env.d.ts +4 -0
  38. package/dist/env.d.ts.map +1 -0
  39. package/dist/env.js +108 -0
  40. package/dist/env.js.map +1 -0
  41. package/dist/errors.cjs +58 -0
  42. package/dist/errors.d.ts +26 -0
  43. package/dist/errors.d.ts.map +1 -0
  44. package/dist/errors.js +48 -0
  45. package/dist/errors.js.map +1 -0
  46. package/dist/federation.cjs +356 -0
  47. package/dist/federation.d.ts +108 -0
  48. package/dist/federation.d.ts.map +1 -0
  49. package/dist/federation.js +341 -0
  50. package/dist/federation.js.map +1 -0
  51. package/dist/index.cjs +42 -0
  52. package/dist/index.d.ts +13 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +10 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/inventory.cjs +361 -0
  57. package/dist/inventory.d.ts +116 -0
  58. package/dist/inventory.d.ts.map +1 -0
  59. package/dist/inventory.js +351 -0
  60. package/dist/inventory.js.map +1 -0
  61. package/dist/logger.cjs +62 -0
  62. package/dist/logger.d.ts +9 -0
  63. package/dist/logger.d.ts.map +1 -0
  64. package/dist/logger.js +29 -0
  65. package/dist/logger.js.map +1 -0
  66. package/dist/message.cjs +19 -0
  67. package/dist/message.d.ts +5 -0
  68. package/dist/message.d.ts.map +1 -0
  69. package/dist/message.js +15 -0
  70. package/dist/message.js.map +1 -0
  71. package/dist/requester.cjs +100 -0
  72. package/dist/requester.d.ts +20 -0
  73. package/dist/requester.d.ts.map +1 -0
  74. package/dist/requester.js +99 -0
  75. package/dist/requester.js.map +1 -0
  76. package/dist/routing.cjs +39 -0
  77. package/dist/routing.d.ts +2 -0
  78. package/dist/routing.d.ts.map +1 -0
  79. package/dist/routing.js +36 -0
  80. package/dist/routing.js.map +1 -0
  81. package/dist/runtime.cjs +735 -0
  82. package/dist/runtime.d.ts +40 -0
  83. package/dist/runtime.d.ts.map +1 -0
  84. package/dist/runtime.js +825 -0
  85. package/dist/runtime.js.map +1 -0
  86. package/dist/services.cjs +346 -0
  87. package/dist/services.d.ts +46 -0
  88. package/dist/services.d.ts.map +1 -0
  89. package/dist/services.js +343 -0
  90. package/dist/services.js.map +1 -0
  91. package/dist/storage.cjs +147 -0
  92. package/dist/storage.d.ts +46 -0
  93. package/dist/storage.d.ts.map +1 -0
  94. package/dist/storage.js +144 -0
  95. package/dist/storage.js.map +1 -0
  96. package/dist/types.cjs +2 -0
  97. package/dist/types.d.ts +108 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/utils/urls.cjs +55 -0
  102. package/dist/utils/urls.d.ts +5 -0
  103. package/dist/utils/urls.d.ts.map +1 -0
  104. package/dist/utils/urls.js +50 -0
  105. package/dist/utils/urls.js.map +1 -0
  106. package/dist/websocket.cjs +142 -0
  107. package/dist/websocket.d.ts +33 -0
  108. package/dist/websocket.d.ts.map +1 -0
  109. package/dist/websocket.js +139 -0
  110. package/dist/websocket.js.map +1 -0
  111. package/env.sample +13 -0
  112. package/package.json +49 -0
  113. package/scripts/generate-openapi.mjs +114 -0
  114. package/scripts/lib/cli-utils.mjs +58 -0
  115. package/scripts/prepare-cjs.mjs +44 -0
  116. package/scripts/publish-service.mjs +1126 -0
  117. package/scripts/validate-service.mjs +103 -0
  118. package/scripts/ws-test.mjs +25 -0
  119. package/src/auth.ts +117 -0
  120. package/src/cli/index.ts +699 -0
  121. package/src/decorators.ts +207 -0
  122. package/src/dependency.ts +211 -0
  123. package/src/dev.ts +17 -0
  124. package/src/discovery.ts +88 -0
  125. package/src/docs.ts +262 -0
  126. package/src/env.ts +125 -0
  127. package/src/errors.ts +55 -0
  128. package/src/federation.ts +559 -0
  129. package/src/index.ts +51 -0
  130. package/src/inventory.ts +491 -0
  131. package/src/logger.ts +38 -0
  132. package/src/message.ts +19 -0
  133. package/src/requester.ts +126 -0
  134. package/src/routing.ts +42 -0
  135. package/src/runtime.ts +967 -0
  136. package/src/services.ts +459 -0
  137. package/src/storage.ts +206 -0
  138. package/src/types/beamable-sdk-api.d.ts +5 -0
  139. package/src/types.ts +117 -0
  140. package/src/utils/urls.ts +53 -0
  141. package/src/websocket.ts +170 -0
  142. package/tsconfig.base.json +31 -0
  143. package/tsconfig.build.json +10 -0
  144. package/tsconfig.cjs.json +16 -0
  145. package/tsconfig.dev.json +14 -0
@@ -0,0 +1,165 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BEAMABLE_SERVICES_TOKEN = exports.REQUEST_CONTEXT_TOKEN = exports.ENVIRONMENT_CONFIG_TOKEN = exports.LOGGER_TOKEN = exports.ServiceProvider = exports.DependencyBuilder = exports.ServiceLifetime = void 0;
4
+ require("reflect-metadata");
5
+ var ServiceLifetime;
6
+ (function (ServiceLifetime) {
7
+ ServiceLifetime["Singleton"] = "singleton";
8
+ ServiceLifetime["Scoped"] = "scoped";
9
+ ServiceLifetime["Transient"] = "transient";
10
+ })(ServiceLifetime || (exports.ServiceLifetime = ServiceLifetime = {}));
11
+ function isConstructor(key) {
12
+ return typeof key === 'function';
13
+ }
14
+ function instantiate(ctor, scope) {
15
+ var _a;
16
+ const paramTypes = (_a = Reflect.getMetadata('design:paramtypes', ctor)) !== null && _a !== void 0 ? _a : [];
17
+ if (paramTypes.length === 0) {
18
+ return new ctor();
19
+ }
20
+ const dependencies = paramTypes.map((param) => {
21
+ if (param === Object || param === Array || param === Promise) {
22
+ throw new Error(`Cannot resolve dependency '${param && param.name ? param.name : String(param)}' for ${ctor.name}. ` +
23
+ 'Use ConfigureServices to register a factory explicitly.');
24
+ }
25
+ return scope.resolve(param);
26
+ });
27
+ return new ctor(...dependencies);
28
+ }
29
+ class DependencyBuilder {
30
+ constructor() {
31
+ this.descriptors = new Map();
32
+ }
33
+ addSingleton(key, factory) {
34
+ return this.addDescriptor(key, ServiceLifetime.Singleton, factory);
35
+ }
36
+ addSingletonClass(ctor) {
37
+ return this.addSingleton(ctor, (scope) => instantiate(ctor, scope));
38
+ }
39
+ addSingletonInstance(key, instance) {
40
+ return this.addSingleton(key, () => instance);
41
+ }
42
+ addScoped(key, factory) {
43
+ return this.addDescriptor(key, ServiceLifetime.Scoped, factory);
44
+ }
45
+ addScopedClass(ctor) {
46
+ return this.addScoped(ctor, (scope) => instantiate(ctor, scope));
47
+ }
48
+ addTransient(key, factory) {
49
+ return this.addDescriptor(key, ServiceLifetime.Transient, factory);
50
+ }
51
+ addTransientClass(ctor) {
52
+ return this.addTransient(ctor, (scope) => instantiate(ctor, scope));
53
+ }
54
+ tryAddSingleton(key, factory) {
55
+ if (!this.descriptors.has(key)) {
56
+ this.addSingleton(key, factory);
57
+ }
58
+ return this;
59
+ }
60
+ tryAddSingletonInstance(key, instance) {
61
+ if (!this.descriptors.has(key)) {
62
+ this.addSingletonInstance(key, instance);
63
+ }
64
+ return this;
65
+ }
66
+ build() {
67
+ return new ServiceProvider(this.descriptors);
68
+ }
69
+ addDescriptor(key, lifetime, factory) {
70
+ if (!key) {
71
+ throw new Error('Dependency registration requires a non-empty key.');
72
+ }
73
+ this.descriptors.set(key, { key, lifetime, factory });
74
+ return this;
75
+ }
76
+ }
77
+ exports.DependencyBuilder = DependencyBuilder;
78
+ class ServiceProvider {
79
+ constructor(descriptors) {
80
+ this.singletons = new Map();
81
+ this.descriptors = new Map(descriptors);
82
+ }
83
+ resolve(key) {
84
+ const descriptor = this.descriptors.get(key);
85
+ if (!descriptor && isConstructor(key)) {
86
+ const implicitDescriptor = {
87
+ key,
88
+ lifetime: ServiceLifetime.Transient,
89
+ factory: (scope) => instantiate(key, scope),
90
+ };
91
+ this.descriptors.set(key, implicitDescriptor);
92
+ return this.resolve(key);
93
+ }
94
+ if (!descriptor) {
95
+ throw new Error(`No service registered for key '${typeof key === 'symbol' ? key.toString() : String(key)}'.`);
96
+ }
97
+ switch (descriptor.lifetime) {
98
+ case ServiceLifetime.Singleton: {
99
+ if (!this.singletons.has(descriptor.key)) {
100
+ const value = descriptor.factory(this);
101
+ this.singletons.set(descriptor.key, value);
102
+ }
103
+ return this.singletons.get(descriptor.key);
104
+ }
105
+ case ServiceLifetime.Scoped:
106
+ return descriptor.factory(this);
107
+ case ServiceLifetime.Transient:
108
+ default:
109
+ return descriptor.factory(this);
110
+ }
111
+ }
112
+ createScope() {
113
+ return new ScopedServiceProvider(this.descriptors, this.singletons, this);
114
+ }
115
+ }
116
+ exports.ServiceProvider = ServiceProvider;
117
+ class ScopedServiceProvider {
118
+ constructor(descriptors, rootSingletons, rootProvider) {
119
+ this.scopedInstances = new Map();
120
+ this.descriptors = descriptors;
121
+ this.rootSingletons = rootSingletons;
122
+ this.rootProvider = rootProvider;
123
+ }
124
+ resolve(key) {
125
+ const descriptor = this.descriptors.get(key);
126
+ if (!descriptor && isConstructor(key)) {
127
+ const implicitDescriptor = {
128
+ key,
129
+ lifetime: ServiceLifetime.Transient,
130
+ factory: (scope) => instantiate(key, scope),
131
+ };
132
+ this.descriptors.set(key, implicitDescriptor);
133
+ return this.resolve(key);
134
+ }
135
+ if (!descriptor) {
136
+ throw new Error(`No service registered for key '${typeof key === 'symbol' ? key.toString() : String(key)}'.`);
137
+ }
138
+ switch (descriptor.lifetime) {
139
+ case ServiceLifetime.Singleton: {
140
+ if (!this.rootSingletons.has(descriptor.key)) {
141
+ const value = descriptor.factory(this.rootProvider);
142
+ this.rootSingletons.set(descriptor.key, value);
143
+ }
144
+ return this.rootSingletons.get(descriptor.key);
145
+ }
146
+ case ServiceLifetime.Scoped: {
147
+ if (!this.scopedInstances.has(descriptor.key)) {
148
+ const value = descriptor.factory(this);
149
+ this.scopedInstances.set(descriptor.key, value);
150
+ }
151
+ return this.scopedInstances.get(descriptor.key);
152
+ }
153
+ case ServiceLifetime.Transient:
154
+ default:
155
+ return descriptor.factory(this);
156
+ }
157
+ }
158
+ setInstance(key, value) {
159
+ this.scopedInstances.set(key, value);
160
+ }
161
+ }
162
+ exports.LOGGER_TOKEN = Symbol('beamable:logger');
163
+ exports.ENVIRONMENT_CONFIG_TOKEN = Symbol('beamable:environment');
164
+ exports.REQUEST_CONTEXT_TOKEN = Symbol('beamable:requestContext');
165
+ exports.BEAMABLE_SERVICES_TOKEN = Symbol('beamable:services');
@@ -0,0 +1,56 @@
1
+ import 'reflect-metadata';
2
+ export type Constructor<T> = new (...args: any[]) => T;
3
+ export type DependencyKey<T = unknown> = Constructor<T> | symbol | string;
4
+ export declare enum ServiceLifetime {
5
+ Singleton = "singleton",
6
+ Scoped = "scoped",
7
+ Transient = "transient"
8
+ }
9
+ export interface DependencyScope {
10
+ resolve<T>(key: DependencyKey<T>): T;
11
+ }
12
+ export interface MutableDependencyScope extends DependencyScope {
13
+ setInstance<T>(key: DependencyKey<T>, value: T): void;
14
+ }
15
+ type ServiceFactory<T> = (scope: DependencyScope) => T;
16
+ interface ServiceDescriptor<T = unknown> {
17
+ key: DependencyKey<T>;
18
+ lifetime: ServiceLifetime;
19
+ factory: ServiceFactory<T>;
20
+ }
21
+ export declare class DependencyBuilder {
22
+ private readonly descriptors;
23
+ addSingleton<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this;
24
+ addSingletonClass<T>(ctor: Constructor<T>): this;
25
+ addSingletonInstance<T>(key: DependencyKey<T>, instance: T): this;
26
+ addScoped<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this;
27
+ addScopedClass<T>(ctor: Constructor<T>): this;
28
+ addTransient<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this;
29
+ addTransientClass<T>(ctor: Constructor<T>): this;
30
+ tryAddSingleton<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this;
31
+ tryAddSingletonInstance<T>(key: DependencyKey<T>, instance: T): this;
32
+ build(): ServiceProvider;
33
+ private addDescriptor;
34
+ }
35
+ export declare class ServiceProvider implements DependencyScope {
36
+ private readonly descriptors;
37
+ private readonly singletons;
38
+ constructor(descriptors: Map<DependencyKey, ServiceDescriptor<unknown>>);
39
+ resolve<T>(key: DependencyKey<T>): T;
40
+ createScope(): ScopedServiceProvider;
41
+ }
42
+ declare class ScopedServiceProvider implements MutableDependencyScope {
43
+ private readonly descriptors;
44
+ private readonly rootSingletons;
45
+ private readonly scopedInstances;
46
+ private readonly rootProvider;
47
+ constructor(descriptors: Map<DependencyKey, ServiceDescriptor<unknown>>, rootSingletons: Map<DependencyKey, unknown>, rootProvider: ServiceProvider);
48
+ resolve<T>(key: DependencyKey<T>): T;
49
+ setInstance<T>(key: DependencyKey<T>, value: T): void;
50
+ }
51
+ export declare const LOGGER_TOKEN: unique symbol;
52
+ export declare const ENVIRONMENT_CONFIG_TOKEN: unique symbol;
53
+ export declare const REQUEST_CONTEXT_TOKEN: unique symbol;
54
+ export declare const BEAMABLE_SERVICES_TOKEN: unique symbol;
55
+ export {};
56
+ //# sourceMappingURL=dependency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.d.ts","sourceRoot":"","sources":["../src/dependency.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AACvD,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,MAAM,CAAC;AAE1E,oBAAY,eAAe;IACzB,SAAS,cAAc;IACvB,MAAM,WAAW;IACjB,SAAS,cAAc;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;CACtC;AAED,MAAM,WAAW,sBAAuB,SAAQ,eAAe;IAC7D,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,CAAC;CACvD;AAED,KAAK,cAAc,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,KAAK,CAAC,CAAC;AAEvD,UAAU,iBAAiB,CAAC,CAAC,GAAG,OAAO;IACrC,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;CAC5B;AAuBD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwD;IAEpF,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAIxE,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAIhD,oBAAoB,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAIjE,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAIrE,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAI7C,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAIxE,iBAAiB,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAIhD,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAO3E,uBAAuB,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI;IAOpE,KAAK,IAAI,eAAe;IAIxB,OAAO,CAAC,aAAa;CAOtB;AAED,qBAAa,eAAgB,YAAW,eAAe;IACrD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAC7E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAqC;gBAEpD,WAAW,EAAE,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAIvE,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;IA+BpC,WAAW,IAAI,qBAAqB;CAGrC;AAED,cAAM,qBAAsB,YAAW,sBAAsB;IAC3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAiD;IAC7E,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAqC;IACrE,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkB;gBAG7C,WAAW,EAAE,GAAG,CAAC,aAAa,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC,EAC3D,cAAc,EAAE,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,EAC3C,YAAY,EAAE,eAAe;IAO/B,OAAO,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC;IAoCpC,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI;CAGtD;AAED,eAAO,MAAM,YAAY,eAA4B,CAAC;AACtD,eAAO,MAAM,wBAAwB,eAAiC,CAAC;AACvE,eAAO,MAAM,qBAAqB,eAAoC,CAAC;AACvE,eAAO,MAAM,uBAAuB,eAA8B,CAAC"}
@@ -0,0 +1,162 @@
1
+ import 'reflect-metadata';
2
+ export var ServiceLifetime;
3
+ (function (ServiceLifetime) {
4
+ ServiceLifetime["Singleton"] = "singleton";
5
+ ServiceLifetime["Scoped"] = "scoped";
6
+ ServiceLifetime["Transient"] = "transient";
7
+ })(ServiceLifetime || (ServiceLifetime = {}));
8
+ function isConstructor(key) {
9
+ return typeof key === 'function';
10
+ }
11
+ function instantiate(ctor, scope) {
12
+ const paramTypes = Reflect.getMetadata('design:paramtypes', ctor) ?? [];
13
+ if (paramTypes.length === 0) {
14
+ return new ctor();
15
+ }
16
+ const dependencies = paramTypes.map((param) => {
17
+ if (param === Object || param === Array || param === Promise) {
18
+ throw new Error(`Cannot resolve dependency '${param && param.name ? param.name : String(param)}' for ${ctor.name}. ` +
19
+ 'Use ConfigureServices to register a factory explicitly.');
20
+ }
21
+ return scope.resolve(param);
22
+ });
23
+ return new ctor(...dependencies);
24
+ }
25
+ export class DependencyBuilder {
26
+ descriptors = new Map();
27
+ addSingleton(key, factory) {
28
+ return this.addDescriptor(key, ServiceLifetime.Singleton, factory);
29
+ }
30
+ addSingletonClass(ctor) {
31
+ return this.addSingleton(ctor, (scope) => instantiate(ctor, scope));
32
+ }
33
+ addSingletonInstance(key, instance) {
34
+ return this.addSingleton(key, () => instance);
35
+ }
36
+ addScoped(key, factory) {
37
+ return this.addDescriptor(key, ServiceLifetime.Scoped, factory);
38
+ }
39
+ addScopedClass(ctor) {
40
+ return this.addScoped(ctor, (scope) => instantiate(ctor, scope));
41
+ }
42
+ addTransient(key, factory) {
43
+ return this.addDescriptor(key, ServiceLifetime.Transient, factory);
44
+ }
45
+ addTransientClass(ctor) {
46
+ return this.addTransient(ctor, (scope) => instantiate(ctor, scope));
47
+ }
48
+ tryAddSingleton(key, factory) {
49
+ if (!this.descriptors.has(key)) {
50
+ this.addSingleton(key, factory);
51
+ }
52
+ return this;
53
+ }
54
+ tryAddSingletonInstance(key, instance) {
55
+ if (!this.descriptors.has(key)) {
56
+ this.addSingletonInstance(key, instance);
57
+ }
58
+ return this;
59
+ }
60
+ build() {
61
+ return new ServiceProvider(this.descriptors);
62
+ }
63
+ addDescriptor(key, lifetime, factory) {
64
+ if (!key) {
65
+ throw new Error('Dependency registration requires a non-empty key.');
66
+ }
67
+ this.descriptors.set(key, { key, lifetime, factory });
68
+ return this;
69
+ }
70
+ }
71
+ export class ServiceProvider {
72
+ descriptors;
73
+ singletons = new Map();
74
+ constructor(descriptors) {
75
+ this.descriptors = new Map(descriptors);
76
+ }
77
+ resolve(key) {
78
+ const descriptor = this.descriptors.get(key);
79
+ if (!descriptor && isConstructor(key)) {
80
+ const implicitDescriptor = {
81
+ key,
82
+ lifetime: ServiceLifetime.Transient,
83
+ factory: (scope) => instantiate(key, scope),
84
+ };
85
+ this.descriptors.set(key, implicitDescriptor);
86
+ return this.resolve(key);
87
+ }
88
+ if (!descriptor) {
89
+ throw new Error(`No service registered for key '${typeof key === 'symbol' ? key.toString() : String(key)}'.`);
90
+ }
91
+ switch (descriptor.lifetime) {
92
+ case ServiceLifetime.Singleton: {
93
+ if (!this.singletons.has(descriptor.key)) {
94
+ const value = descriptor.factory(this);
95
+ this.singletons.set(descriptor.key, value);
96
+ }
97
+ return this.singletons.get(descriptor.key);
98
+ }
99
+ case ServiceLifetime.Scoped:
100
+ return descriptor.factory(this);
101
+ case ServiceLifetime.Transient:
102
+ default:
103
+ return descriptor.factory(this);
104
+ }
105
+ }
106
+ createScope() {
107
+ return new ScopedServiceProvider(this.descriptors, this.singletons, this);
108
+ }
109
+ }
110
+ class ScopedServiceProvider {
111
+ descriptors;
112
+ rootSingletons;
113
+ scopedInstances = new Map();
114
+ rootProvider;
115
+ constructor(descriptors, rootSingletons, rootProvider) {
116
+ this.descriptors = descriptors;
117
+ this.rootSingletons = rootSingletons;
118
+ this.rootProvider = rootProvider;
119
+ }
120
+ resolve(key) {
121
+ const descriptor = this.descriptors.get(key);
122
+ if (!descriptor && isConstructor(key)) {
123
+ const implicitDescriptor = {
124
+ key,
125
+ lifetime: ServiceLifetime.Transient,
126
+ factory: (scope) => instantiate(key, scope),
127
+ };
128
+ this.descriptors.set(key, implicitDescriptor);
129
+ return this.resolve(key);
130
+ }
131
+ if (!descriptor) {
132
+ throw new Error(`No service registered for key '${typeof key === 'symbol' ? key.toString() : String(key)}'.`);
133
+ }
134
+ switch (descriptor.lifetime) {
135
+ case ServiceLifetime.Singleton: {
136
+ if (!this.rootSingletons.has(descriptor.key)) {
137
+ const value = descriptor.factory(this.rootProvider);
138
+ this.rootSingletons.set(descriptor.key, value);
139
+ }
140
+ return this.rootSingletons.get(descriptor.key);
141
+ }
142
+ case ServiceLifetime.Scoped: {
143
+ if (!this.scopedInstances.has(descriptor.key)) {
144
+ const value = descriptor.factory(this);
145
+ this.scopedInstances.set(descriptor.key, value);
146
+ }
147
+ return this.scopedInstances.get(descriptor.key);
148
+ }
149
+ case ServiceLifetime.Transient:
150
+ default:
151
+ return descriptor.factory(this);
152
+ }
153
+ }
154
+ setInstance(key, value) {
155
+ this.scopedInstances.set(key, value);
156
+ }
157
+ }
158
+ export const LOGGER_TOKEN = Symbol('beamable:logger');
159
+ export const ENVIRONMENT_CONFIG_TOKEN = Symbol('beamable:environment');
160
+ export const REQUEST_CONTEXT_TOKEN = Symbol('beamable:requestContext');
161
+ export const BEAMABLE_SERVICES_TOKEN = Symbol('beamable:services');
162
+ //# sourceMappingURL=dependency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dependency.js","sourceRoot":"","sources":["../src/dependency.ts"],"names":[],"mappings":"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","sourcesContent":["import 'reflect-metadata';\r\n\r\nexport type Constructor<T> = new (...args: any[]) => T;\r\nexport type DependencyKey<T = unknown> = Constructor<T> | symbol | string;\r\n\r\nexport enum ServiceLifetime {\r\n Singleton = 'singleton',\r\n Scoped = 'scoped',\r\n Transient = 'transient',\r\n}\r\n\r\nexport interface DependencyScope {\r\n resolve<T>(key: DependencyKey<T>): T;\r\n}\r\n\r\nexport interface MutableDependencyScope extends DependencyScope {\r\n setInstance<T>(key: DependencyKey<T>, value: T): void;\r\n}\r\n\r\ntype ServiceFactory<T> = (scope: DependencyScope) => T;\r\n\r\ninterface ServiceDescriptor<T = unknown> {\r\n key: DependencyKey<T>;\r\n lifetime: ServiceLifetime;\r\n factory: ServiceFactory<T>;\r\n}\r\n\r\nfunction isConstructor<T>(key: DependencyKey<T>): key is Constructor<T> {\r\n return typeof key === 'function';\r\n}\r\n\r\nfunction instantiate<T>(ctor: Constructor<T>, scope: DependencyScope): T {\r\n const paramTypes: Array<Constructor<unknown>> = Reflect.getMetadata('design:paramtypes', ctor) ?? [];\r\n if (paramTypes.length === 0) {\r\n return new ctor();\r\n }\r\n const dependencies = paramTypes.map((param) => {\r\n if (param === Object || param === Array || param === Promise) {\r\n throw new Error(\r\n `Cannot resolve dependency '${param && param.name ? param.name : String(param)}' for ${ctor.name}. ` +\r\n 'Use ConfigureServices to register a factory explicitly.',\r\n );\r\n }\r\n return scope.resolve(param as Constructor<unknown>);\r\n });\r\n return new ctor(...dependencies);\r\n}\r\n\r\nexport class DependencyBuilder {\r\n private readonly descriptors = new Map<DependencyKey, ServiceDescriptor<unknown>>();\r\n\r\n addSingleton<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this {\r\n return this.addDescriptor(key, ServiceLifetime.Singleton, factory);\r\n }\r\n\r\n addSingletonClass<T>(ctor: Constructor<T>): this {\r\n return this.addSingleton(ctor, (scope) => instantiate(ctor, scope));\r\n }\r\n\r\n addSingletonInstance<T>(key: DependencyKey<T>, instance: T): this {\r\n return this.addSingleton(key, () => instance);\r\n }\r\n\r\n addScoped<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this {\r\n return this.addDescriptor(key, ServiceLifetime.Scoped, factory);\r\n }\r\n\r\n addScopedClass<T>(ctor: Constructor<T>): this {\r\n return this.addScoped(ctor, (scope) => instantiate(ctor, scope));\r\n }\r\n\r\n addTransient<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this {\r\n return this.addDescriptor(key, ServiceLifetime.Transient, factory);\r\n }\r\n\r\n addTransientClass<T>(ctor: Constructor<T>): this {\r\n return this.addTransient(ctor, (scope) => instantiate(ctor, scope));\r\n }\r\n\r\n tryAddSingleton<T>(key: DependencyKey<T>, factory: ServiceFactory<T>): this {\r\n if (!this.descriptors.has(key)) {\r\n this.addSingleton(key, factory);\r\n }\r\n return this;\r\n }\r\n\r\n tryAddSingletonInstance<T>(key: DependencyKey<T>, instance: T): this {\r\n if (!this.descriptors.has(key)) {\r\n this.addSingletonInstance(key, instance);\r\n }\r\n return this;\r\n }\r\n\r\n build(): ServiceProvider {\r\n return new ServiceProvider(this.descriptors);\r\n }\r\n\r\n private addDescriptor<T>(key: DependencyKey<T>, lifetime: ServiceLifetime, factory: ServiceFactory<T>): this {\r\n if (!key) {\r\n throw new Error('Dependency registration requires a non-empty key.');\r\n }\r\n this.descriptors.set(key, { key, lifetime, factory } as ServiceDescriptor<unknown>);\r\n return this;\r\n }\r\n}\r\n\r\nexport class ServiceProvider implements DependencyScope {\r\n private readonly descriptors: Map<DependencyKey, ServiceDescriptor<unknown>>;\r\n private readonly singletons = new Map<DependencyKey, unknown>();\r\n\r\n constructor(descriptors: Map<DependencyKey, ServiceDescriptor<unknown>>) {\r\n this.descriptors = new Map(descriptors);\r\n }\r\n\r\n resolve<T>(key: DependencyKey<T>): T {\r\n const descriptor = this.descriptors.get(key) as ServiceDescriptor<T> | undefined;\r\n if (!descriptor && isConstructor(key)) {\r\n const implicitDescriptor: ServiceDescriptor<T> = {\r\n key,\r\n lifetime: ServiceLifetime.Transient,\r\n factory: (scope) => instantiate(key, scope),\r\n };\r\n this.descriptors.set(key, implicitDescriptor as ServiceDescriptor<unknown>);\r\n return this.resolve(key);\r\n }\r\n if (!descriptor) {\r\n throw new Error(`No service registered for key '${typeof key === 'symbol' ? key.toString() : String(key)}'.`);\r\n }\r\n\r\n switch (descriptor.lifetime) {\r\n case ServiceLifetime.Singleton: {\r\n if (!this.singletons.has(descriptor.key)) {\r\n const value = descriptor.factory(this);\r\n this.singletons.set(descriptor.key, value);\r\n }\r\n return this.singletons.get(descriptor.key) as T;\r\n }\r\n case ServiceLifetime.Scoped:\r\n return descriptor.factory(this);\r\n case ServiceLifetime.Transient:\r\n default:\r\n return descriptor.factory(this);\r\n }\r\n }\r\n\r\n createScope(): ScopedServiceProvider {\r\n return new ScopedServiceProvider(this.descriptors, this.singletons, this);\r\n }\r\n}\r\n\r\nclass ScopedServiceProvider implements MutableDependencyScope {\r\n private readonly descriptors: Map<DependencyKey, ServiceDescriptor<unknown>>;\r\n private readonly rootSingletons: Map<DependencyKey, unknown>;\r\n private readonly scopedInstances = new Map<DependencyKey, unknown>();\r\n private readonly rootProvider: ServiceProvider;\r\n\r\n constructor(\r\n descriptors: Map<DependencyKey, ServiceDescriptor<unknown>>,\r\n rootSingletons: Map<DependencyKey, unknown>,\r\n rootProvider: ServiceProvider,\r\n ) {\r\n this.descriptors = descriptors;\r\n this.rootSingletons = rootSingletons;\r\n this.rootProvider = rootProvider;\r\n }\r\n\r\n resolve<T>(key: DependencyKey<T>): T {\r\n const descriptor = this.descriptors.get(key) as ServiceDescriptor<T> | undefined;\r\n if (!descriptor && isConstructor(key)) {\r\n const implicitDescriptor: ServiceDescriptor<T> = {\r\n key,\r\n lifetime: ServiceLifetime.Transient,\r\n factory: (scope) => instantiate(key, scope),\r\n };\r\n this.descriptors.set(key, implicitDescriptor as ServiceDescriptor<unknown>);\r\n return this.resolve(key);\r\n }\r\n if (!descriptor) {\r\n throw new Error(`No service registered for key '${typeof key === 'symbol' ? key.toString() : String(key)}'.`);\r\n }\r\n\r\n switch (descriptor.lifetime) {\r\n case ServiceLifetime.Singleton: {\r\n if (!this.rootSingletons.has(descriptor.key)) {\r\n const value = descriptor.factory(this.rootProvider);\r\n this.rootSingletons.set(descriptor.key, value);\r\n }\r\n return this.rootSingletons.get(descriptor.key) as T;\r\n }\r\n case ServiceLifetime.Scoped: {\r\n if (!this.scopedInstances.has(descriptor.key)) {\r\n const value = descriptor.factory(this);\r\n this.scopedInstances.set(descriptor.key, value);\r\n }\r\n return this.scopedInstances.get(descriptor.key) as T;\r\n }\r\n case ServiceLifetime.Transient:\r\n default:\r\n return descriptor.factory(this);\r\n }\r\n }\r\n\r\n setInstance<T>(key: DependencyKey<T>, value: T): void {\r\n this.scopedInstances.set(key, value);\r\n }\r\n}\r\n\r\nexport const LOGGER_TOKEN = Symbol('beamable:logger');\r\nexport const ENVIRONMENT_CONFIG_TOKEN = Symbol('beamable:environment');\r\nexport const REQUEST_CONTEXT_TOKEN = Symbol('beamable:requestContext');\r\nexport const BEAMABLE_SERVICES_TOKEN = Symbol('beamable:services');\r\n"]}
package/dist/dev.cjs ADDED
@@ -0,0 +1,34 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ExampleService = void 0;
13
+ require("dotenv/config");
14
+ const decorators_js_1 = require("./decorators.js");
15
+ const runtime_js_1 = require("./runtime.js");
16
+ let ExampleService = class ExampleService {
17
+ async echo(ctx, message) {
18
+ return {
19
+ message,
20
+ playerId: ctx.userId,
21
+ };
22
+ }
23
+ };
24
+ exports.ExampleService = ExampleService;
25
+ __decorate([
26
+ (0, decorators_js_1.Callable)(),
27
+ __metadata("design:type", Function),
28
+ __metadata("design:paramtypes", [Object, String]),
29
+ __metadata("design:returntype", Promise)
30
+ ], ExampleService.prototype, "echo", null);
31
+ exports.ExampleService = ExampleService = __decorate([
32
+ (0, decorators_js_1.Microservice)('ExampleNodeService')
33
+ ], ExampleService);
34
+ void (0, runtime_js_1.runMicroservice)();
package/dist/dev.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import 'dotenv/config';
2
+ import type { RequestContext } from './types.js';
3
+ export declare class ExampleService {
4
+ echo(ctx: RequestContext, message: string): Promise<{
5
+ message: string;
6
+ playerId: number;
7
+ }>;
8
+ }
9
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC;AAGvB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,qBACa,cAAc;IAEnB,IAAI,CAAC,GAAG,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAMjG"}
package/dist/dev.js ADDED
@@ -0,0 +1,32 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import 'dotenv/config';
11
+ import { Microservice, Callable } from './decorators.js';
12
+ import { runMicroservice } from './runtime.js';
13
+ let ExampleService = class ExampleService {
14
+ async echo(ctx, message) {
15
+ return {
16
+ message,
17
+ playerId: ctx.userId,
18
+ };
19
+ }
20
+ };
21
+ __decorate([
22
+ Callable(),
23
+ __metadata("design:type", Function),
24
+ __metadata("design:paramtypes", [Object, String]),
25
+ __metadata("design:returntype", Promise)
26
+ ], ExampleService.prototype, "echo", null);
27
+ ExampleService = __decorate([
28
+ Microservice('ExampleNodeService')
29
+ ], ExampleService);
30
+ export { ExampleService };
31
+ void runMicroservice();
32
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../src/dev.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,eAAe,CAAC;AACvB,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAIxC,IAAM,cAAc,GAApB,MAAM,cAAc;IAEnB,AAAN,KAAK,CAAC,IAAI,CAAC,GAAmB,EAAE,OAAe;QAC7C,OAAO;YACL,OAAO;YACP,QAAQ,EAAE,GAAG,CAAC,MAAM;SACrB,CAAC;IACJ,CAAC;CACF,CAAA;AANO;IADL,QAAQ,EAAE;;;;0CAMV;AAPU,cAAc;IAD1B,YAAY,CAAC,oBAAoB,CAAC;GACtB,cAAc,CAQ1B;;AAED,KAAK,eAAe,EAAE,CAAC","sourcesContent":["import 'dotenv/config';\r\nimport { Microservice, Callable } from './decorators.js';\r\nimport { runMicroservice } from './runtime.js';\r\nimport type { RequestContext } from './types.js';\r\n\r\n@Microservice('ExampleNodeService')\r\nexport class ExampleService {\r\n @Callable()\r\n async echo(ctx: RequestContext, message: string): Promise<{ message: string; playerId: number }> {\r\n return {\r\n message,\r\n playerId: ctx.userId,\r\n };\r\n }\r\n}\r\n\r\nvoid runMicroservice();\r\n"]}
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.DiscoveryBroadcaster = void 0;
7
+ const node_dgram_1 = __importDefault(require("node:dgram"));
8
+ const DISCOVERY_PORT = 8624;
9
+ const BROADCAST_PERIOD_MS = 10;
10
+ class DiscoveryBroadcaster {
11
+ constructor(options) {
12
+ var _a;
13
+ this.options = options;
14
+ this.socket = node_dgram_1.default.createSocket('udp4');
15
+ this.disposed = false;
16
+ const message = {
17
+ processId: process.pid,
18
+ cid: options.env.cid,
19
+ pid: options.env.pid,
20
+ prefix: options.routingKey,
21
+ serviceName: options.serviceName,
22
+ healthPort: options.env.healthPort,
23
+ serviceType: 'service',
24
+ startedByAccountId: (_a = options.env.accountId) !== null && _a !== void 0 ? _a : 0,
25
+ isContainer: false,
26
+ dataPort: 0,
27
+ containerId: '',
28
+ };
29
+ this.payload = Buffer.from(JSON.stringify(message), 'utf8');
30
+ this.socket.on('error', (err) => {
31
+ options.logger.warn({ err }, 'Discovery broadcaster socket error.');
32
+ });
33
+ }
34
+ async start() {
35
+ if (this.disposed) {
36
+ return;
37
+ }
38
+ await new Promise((resolve, reject) => {
39
+ const onError = (error) => {
40
+ this.socket.off('error', onError);
41
+ reject(error);
42
+ };
43
+ this.socket.once('error', onError);
44
+ this.socket.bind(0, undefined, () => {
45
+ try {
46
+ this.socket.setBroadcast(true);
47
+ this.socket.off('error', onError);
48
+ resolve();
49
+ }
50
+ catch (error) {
51
+ this.socket.off('error', onError);
52
+ reject(error);
53
+ }
54
+ });
55
+ });
56
+ this.interval = setInterval(() => {
57
+ this.socket.send(this.payload, DISCOVERY_PORT, '255.255.255.255', (error) => {
58
+ if (error) {
59
+ this.options.logger.debug({ err: error }, 'Discovery broadcast send failed.');
60
+ }
61
+ });
62
+ }, BROADCAST_PERIOD_MS);
63
+ this.interval.unref();
64
+ }
65
+ stop() {
66
+ this.disposed = true;
67
+ if (this.interval) {
68
+ clearInterval(this.interval);
69
+ this.interval = undefined;
70
+ }
71
+ try {
72
+ this.socket.close();
73
+ }
74
+ catch (error) {
75
+ this.options.logger.debug({ err: error }, 'Error closing discovery broadcaster socket.');
76
+ }
77
+ }
78
+ }
79
+ exports.DiscoveryBroadcaster = DiscoveryBroadcaster;
@@ -0,0 +1,20 @@
1
+ import type { Logger } from 'pino';
2
+ import type { EnvironmentConfig } from './types.js';
3
+ interface DiscoveryOptions {
4
+ env: EnvironmentConfig;
5
+ serviceName: string;
6
+ routingKey: string | undefined;
7
+ logger: Logger;
8
+ }
9
+ export declare class DiscoveryBroadcaster {
10
+ private readonly options;
11
+ private readonly socket;
12
+ private readonly payload;
13
+ private interval?;
14
+ private disposed;
15
+ constructor(options: DiscoveryOptions);
16
+ start(): Promise<void>;
17
+ stop(): void;
18
+ }
19
+ export {};
20
+ //# sourceMappingURL=discovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.d.ts","sourceRoot":"","sources":["../src/discovery.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AACnC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAKpD,UAAU,gBAAgB;IACxB,GAAG,EAAE,iBAAiB,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,oBAAoB;IAMnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IALpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8B;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,CAAiB;IAClC,OAAO,CAAC,QAAQ,CAAS;gBAEI,OAAO,EAAE,gBAAgB;IAsBhD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiC5B,IAAI,IAAI,IAAI;CAYb"}