@bsb/base 9.0.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 (182) hide show
  1. package/LICENSE +665 -0
  2. package/LICENSE.commercial +32 -0
  3. package/README.md +263 -0
  4. package/bsb-plugin.json +62 -0
  5. package/lib/base/BSBConfig.d.ts +130 -0
  6. package/lib/base/BSBConfig.js +95 -0
  7. package/lib/base/BSBConfig.js.map +1 -0
  8. package/lib/base/BSBEvents.d.ts +207 -0
  9. package/lib/base/BSBEvents.js +101 -0
  10. package/lib/base/BSBEvents.js.map +1 -0
  11. package/lib/base/BSBObservable.d.ts +178 -0
  12. package/lib/base/BSBObservable.js +91 -0
  13. package/lib/base/BSBObservable.js.map +1 -0
  14. package/lib/base/BSBService.d.ts +277 -0
  15. package/lib/base/BSBService.js +366 -0
  16. package/lib/base/BSBService.js.map +1 -0
  17. package/lib/base/BSBServiceClient.d.ts +135 -0
  18. package/lib/base/BSBServiceClient.js +130 -0
  19. package/lib/base/BSBServiceClient.js.map +1 -0
  20. package/lib/base/EventValidator.d.ts +137 -0
  21. package/lib/base/EventValidator.js +210 -0
  22. package/lib/base/EventValidator.js.map +1 -0
  23. package/lib/base/ObservableBackend.d.ts +281 -0
  24. package/lib/base/ObservableBackend.js +515 -0
  25. package/lib/base/ObservableBackend.js.map +1 -0
  26. package/lib/base/PluginConfig.d.ts +196 -0
  27. package/lib/base/PluginConfig.js +96 -0
  28. package/lib/base/PluginConfig.js.map +1 -0
  29. package/lib/base/PluginEvents.d.ts +140 -0
  30. package/lib/base/PluginEvents.js +268 -0
  31. package/lib/base/PluginEvents.js.map +1 -0
  32. package/lib/base/PluginObservable.d.ts +196 -0
  33. package/lib/base/PluginObservable.js +250 -0
  34. package/lib/base/PluginObservable.js.map +1 -0
  35. package/lib/base/ResourceContext.d.ts +70 -0
  36. package/lib/base/ResourceContext.js +54 -0
  37. package/lib/base/ResourceContext.js.map +1 -0
  38. package/lib/base/base.d.ts +264 -0
  39. package/lib/base/base.js +182 -0
  40. package/lib/base/base.js.map +1 -0
  41. package/lib/base/errorMessages.d.ts +56 -0
  42. package/lib/base/errorMessages.js +70 -0
  43. package/lib/base/errorMessages.js.map +1 -0
  44. package/lib/base/factory.d.ts +58 -0
  45. package/lib/base/factory.js +167 -0
  46. package/lib/base/factory.js.map +1 -0
  47. package/lib/base/functions.d.ts +117 -0
  48. package/lib/base/functions.js +152 -0
  49. package/lib/base/functions.js.map +1 -0
  50. package/lib/base/index.d.ts +44 -0
  51. package/lib/base/index.js +64 -0
  52. package/lib/base/index.js.map +1 -0
  53. package/lib/base/logFormatter.d.ts +50 -0
  54. package/lib/base/logFormatter.js +105 -0
  55. package/lib/base/logFormatter.js.map +1 -0
  56. package/lib/base/tools.d.ts +316 -0
  57. package/lib/base/tools.js +666 -0
  58. package/lib/base/tools.js.map +1 -0
  59. package/lib/cli.d.ts +28 -0
  60. package/lib/cli.js +254 -0
  61. package/lib/cli.js.map +1 -0
  62. package/lib/dev.d.ts +27 -0
  63. package/lib/dev.js +200 -0
  64. package/lib/dev.js.map +1 -0
  65. package/lib/index.d.ts +32 -0
  66. package/lib/index.js +49 -0
  67. package/lib/index.js.map +1 -0
  68. package/lib/interfaces/events.d.ts +67 -0
  69. package/lib/interfaces/events.js +44 -0
  70. package/lib/interfaces/events.js.map +1 -0
  71. package/lib/interfaces/index.d.ts +38 -0
  72. package/lib/interfaces/index.js +59 -0
  73. package/lib/interfaces/index.js.map +1 -0
  74. package/lib/interfaces/logging.d.ts +106 -0
  75. package/lib/interfaces/logging.js +39 -0
  76. package/lib/interfaces/logging.js.map +1 -0
  77. package/lib/interfaces/metrics.d.ts +365 -0
  78. package/lib/interfaces/metrics.js +46 -0
  79. package/lib/interfaces/metrics.js.map +1 -0
  80. package/lib/interfaces/observable-types.d.ts +63 -0
  81. package/lib/interfaces/observable-types.js +49 -0
  82. package/lib/interfaces/observable-types.js.map +1 -0
  83. package/lib/interfaces/observable.d.ts +297 -0
  84. package/lib/interfaces/observable.js +29 -0
  85. package/lib/interfaces/observable.js.map +1 -0
  86. package/lib/interfaces/options.d.ts +164 -0
  87. package/lib/interfaces/options.js +56 -0
  88. package/lib/interfaces/options.js.map +1 -0
  89. package/lib/interfaces/plugins.d.ts +143 -0
  90. package/lib/interfaces/plugins.js +45 -0
  91. package/lib/interfaces/plugins.js.map +1 -0
  92. package/lib/interfaces/result.d.ts +129 -0
  93. package/lib/interfaces/result.js +162 -0
  94. package/lib/interfaces/result.js.map +1 -0
  95. package/lib/interfaces/schema-events.d.ts +378 -0
  96. package/lib/interfaces/schema-events.js +247 -0
  97. package/lib/interfaces/schema-events.js.map +1 -0
  98. package/lib/interfaces/schema-types.d.ts +407 -0
  99. package/lib/interfaces/schema-types.js +581 -0
  100. package/lib/interfaces/schema-types.js.map +1 -0
  101. package/lib/interfaces/service.d.ts +48 -0
  102. package/lib/interfaces/service.js +29 -0
  103. package/lib/interfaces/service.js.map +1 -0
  104. package/lib/interfaces/tools.d.ts +65 -0
  105. package/lib/interfaces/tools.js +50 -0
  106. package/lib/interfaces/tools.js.map +1 -0
  107. package/lib/plugins/config-default/index.d.ts +59 -0
  108. package/lib/plugins/config-default/index.js +197 -0
  109. package/lib/plugins/config-default/index.js.map +1 -0
  110. package/lib/plugins/config-default/interfaces.d.ts +92 -0
  111. package/lib/plugins/config-default/interfaces.js +36 -0
  112. package/lib/plugins/config-default/interfaces.js.map +1 -0
  113. package/lib/plugins/events-default/events/broadcast.d.ts +36 -0
  114. package/lib/plugins/events-default/events/broadcast.js +85 -0
  115. package/lib/plugins/events-default/events/broadcast.js.map +1 -0
  116. package/lib/plugins/events-default/events/emit.d.ts +38 -0
  117. package/lib/plugins/events-default/events/emit.js +104 -0
  118. package/lib/plugins/events-default/events/emit.js.map +1 -0
  119. package/lib/plugins/events-default/events/emitAndReturn.d.ts +36 -0
  120. package/lib/plugins/events-default/events/emitAndReturn.js +100 -0
  121. package/lib/plugins/events-default/events/emitAndReturn.js.map +1 -0
  122. package/lib/plugins/events-default/events/emitStreamAndReceiveStream.d.ts +38 -0
  123. package/lib/plugins/events-default/events/emitStreamAndReceiveStream.js +134 -0
  124. package/lib/plugins/events-default/events/emitStreamAndReceiveStream.js.map +1 -0
  125. package/lib/plugins/events-default/events/index.d.ts +30 -0
  126. package/lib/plugins/events-default/events/index.js +38 -0
  127. package/lib/plugins/events-default/events/index.js.map +1 -0
  128. package/lib/plugins/events-default/index.d.ts +57 -0
  129. package/lib/plugins/events-default/index.js +86 -0
  130. package/lib/plugins/events-default/index.js.map +1 -0
  131. package/lib/plugins/observable-default/index.d.ts +43 -0
  132. package/lib/plugins/observable-default/index.js +151 -0
  133. package/lib/plugins/observable-default/index.js.map +1 -0
  134. package/lib/schemas/config-default.json +34 -0
  135. package/lib/schemas/config-default.plugin.json +36 -0
  136. package/lib/schemas/events-default.json +18 -0
  137. package/lib/schemas/events-default.plugin.json +17 -0
  138. package/lib/schemas/observable-default.json +33 -0
  139. package/lib/schemas/observable-default.plugin.json +24 -0
  140. package/lib/scripts/bsb-client-cli.d.ts +21 -0
  141. package/lib/scripts/bsb-client-cli.js +701 -0
  142. package/lib/scripts/bsb-client-cli.js.map +1 -0
  143. package/lib/scripts/bsb-plugin-cli.d.ts +15 -0
  144. package/lib/scripts/bsb-plugin-cli.js +547 -0
  145. package/lib/scripts/bsb-plugin-cli.js.map +1 -0
  146. package/lib/scripts/export-schemas.d.ts +17 -0
  147. package/lib/scripts/export-schemas.js +205 -0
  148. package/lib/scripts/export-schemas.js.map +1 -0
  149. package/lib/scripts/extract-schemas-from-source.d.ts +23 -0
  150. package/lib/scripts/extract-schemas-from-source.js +604 -0
  151. package/lib/scripts/extract-schemas-from-source.js.map +1 -0
  152. package/lib/scripts/generate-client-types.d.ts +22 -0
  153. package/lib/scripts/generate-client-types.js +537 -0
  154. package/lib/scripts/generate-client-types.js.map +1 -0
  155. package/lib/scripts/generate-plugin-json.d.ts +17 -0
  156. package/lib/scripts/generate-plugin-json.js +219 -0
  157. package/lib/scripts/generate-plugin-json.js.map +1 -0
  158. package/lib/serviceBase/config.d.ts +83 -0
  159. package/lib/serviceBase/config.js +236 -0
  160. package/lib/serviceBase/config.js.map +1 -0
  161. package/lib/serviceBase/events.d.ts +91 -0
  162. package/lib/serviceBase/events.js +519 -0
  163. package/lib/serviceBase/events.js.map +1 -0
  164. package/lib/serviceBase/index.d.ts +33 -0
  165. package/lib/serviceBase/index.js +50 -0
  166. package/lib/serviceBase/index.js.map +1 -0
  167. package/lib/serviceBase/observable.d.ts +249 -0
  168. package/lib/serviceBase/observable.js +551 -0
  169. package/lib/serviceBase/observable.js.map +1 -0
  170. package/lib/serviceBase/plugins.d.ts +48 -0
  171. package/lib/serviceBase/plugins.js +184 -0
  172. package/lib/serviceBase/plugins.js.map +1 -0
  173. package/lib/serviceBase/serviceBase.d.ts +228 -0
  174. package/lib/serviceBase/serviceBase.js +420 -0
  175. package/lib/serviceBase/serviceBase.js.map +1 -0
  176. package/lib/serviceBase/services.d.ts +63 -0
  177. package/lib/serviceBase/services.js +346 -0
  178. package/lib/serviceBase/services.js.map +1 -0
  179. package/lib/tests.d.ts +27 -0
  180. package/lib/tests.js +44 -0
  181. package/lib/tests.js.map +1 -0
  182. package/package.json +91 -0
@@ -0,0 +1,551 @@
1
+ "use strict";
2
+ /**
3
+ * BSB (Better-Service-Base) is an event-bus based microservice framework.
4
+ * Copyright (C) 2016 - 2025 BetterCorp (PTY) Ltd
5
+ *
6
+ * This program is free software: you can redistribute it and/or modify
7
+ * it under the terms of the GNU Affero General Public License as published
8
+ * by the Free Software Foundation, either version 3 of the License, or
9
+ * (at your option) any later version.
10
+ *
11
+ * Alternatively, you may obtain a commercial license for this program.
12
+ * The commercial license allows you to use the Program in a closed-source manner,
13
+ * including the right to create derivative works that are not subject to the terms
14
+ * of the AGPL.
15
+ *
16
+ * To obtain a commercial license, please contact the copyright holders at
17
+ * https://www.bettercorp.dev. The terms and conditions of the commercial license
18
+ * will be provided upon request.
19
+ *
20
+ * This program is distributed in the hope that it will be useful,
21
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
22
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23
+ * GNU Affero General Public License for more details.
24
+ *
25
+ * You should have received a copy of the GNU Affero General Public License
26
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.SBObservable = void 0;
30
+ const node_events_1 = require("node:events");
31
+ const base_1 = require("../base");
32
+ const metrics_1 = require("../interfaces/metrics");
33
+ const index_1 = require("../plugins/observable-default/index");
34
+ /**
35
+ * @hidden
36
+ */
37
+ function internalTrace(span) {
38
+ return (0, metrics_1.createFakeDTrace)("serviceBase/SBObservable", span);
39
+ }
40
+ /**
41
+ * BSB Observable Controller - Unified logging, metrics, and tracing
42
+ *
43
+ * This class is responsible for managing all observability in the BSB framework.
44
+ * It coordinates observable plugins (like OpenTelemetry, Prometheus, etc.) and
45
+ * routes events from the Observable API to the configured backends.
46
+ *
47
+ * If you have a specific way of managing observability, you can extend this class
48
+ * and use your own class when creating the ServiceBase instance.
49
+ *
50
+ * @group Observable
51
+ * @category Core
52
+ * @see {@link https://bsbcode.dev/languages/nodejs/types/classes/SBObservable.html | API: SBObservable}
53
+ *
54
+ * @example
55
+ * ```typescript
56
+ * // Custom observable controller
57
+ * class MyObservable extends SBObservable {
58
+ * // Override methods as needed
59
+ * }
60
+ *
61
+ * // Use custom controller
62
+ * const serviceBase = new ServiceBase(appId, {
63
+ * observableClass: MyObservable
64
+ * });
65
+ * ```
66
+ */
67
+ class SBObservable {
68
+ observablePlugins = [];
69
+ observableBus = new node_events_1.EventEmitter();
70
+ mode = "development";
71
+ appId;
72
+ cwd;
73
+ sbPlugins;
74
+ observableBackend;
75
+ _ready = false;
76
+ /**
77
+ * Check if observable plugins are ready
78
+ * @returns true if all plugins have been initialized
79
+ */
80
+ get isReady() {
81
+ return this._ready;
82
+ }
83
+ /**
84
+ * Create an SBObservable instance
85
+ * @param appId - Application ID
86
+ * @param mode - Debug mode (development, production, production-debug)
87
+ * @param cwd - Current working directory
88
+ * @param sbPlugins - Plugin manager instance
89
+ */
90
+ constructor(appId, mode, cwd, sbPlugins) {
91
+ this.appId = appId;
92
+ this.mode = mode;
93
+ this.cwd = cwd;
94
+ this.sbPlugins = sbPlugins;
95
+ const observablePluginName = "core-observable";
96
+ this.observableBackend = new base_1.ObservableBackend(this.mode, appId, observablePluginName, this);
97
+ // Setup logging events
98
+ if (this.mode !== "production") {
99
+ this.observableBus.on("debug", (plugin, trace, message, meta) => {
100
+ this.triggerEvent("debug", plugin, trace, message, meta);
101
+ });
102
+ }
103
+ this.observableBus.on("info", (plugin, trace, message, meta) => {
104
+ this.triggerEvent("info", plugin, trace, message, meta);
105
+ });
106
+ this.observableBus.on("warn", (plugin, trace, message, meta) => {
107
+ this.triggerEvent("warn", plugin, trace, message, meta);
108
+ });
109
+ this.observableBus.on("error", (plugin, trace, message, meta) => {
110
+ this.triggerEvent("error", plugin, trace, message, meta);
111
+ });
112
+ // Setup metrics events
113
+ this.setupCounterEvents();
114
+ this.setupGaugeEvents();
115
+ this.setupHistogramEvents();
116
+ this.setupSpanEvents();
117
+ }
118
+ setupCounterEvents() {
119
+ this.observableBus.on("createCounter", async (timestamp, pluginName, name, description, help, labels) => {
120
+ this.triggerMetricEvent("counter", async (plugin) => {
121
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.createCounter?.bind(plugin), timestamp, pluginName, name, description, help, labels);
122
+ });
123
+ });
124
+ this.observableBus.on("incrementCounter", async (timestamp, pluginName, name, value, labels) => {
125
+ this.triggerMetricEvent("counter", async (plugin) => {
126
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.incrementCounter?.bind(plugin), timestamp, pluginName, name, value, labels);
127
+ });
128
+ });
129
+ }
130
+ setupGaugeEvents() {
131
+ this.observableBus.on("createGauge", async (timestamp, pluginName, name, description, help, labels) => {
132
+ this.triggerMetricEvent("gauge", async (plugin) => {
133
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.createGauge?.bind(plugin), timestamp, pluginName, name, description, help, labels);
134
+ });
135
+ });
136
+ this.observableBus.on("setGauge", async (timestamp, pluginName, name, value, labels) => {
137
+ this.triggerMetricEvent("gauge", async (plugin) => {
138
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.setGauge?.bind(plugin), timestamp, pluginName, name, value, labels);
139
+ });
140
+ });
141
+ }
142
+ setupHistogramEvents() {
143
+ this.observableBus.on("createHistogram", async (timestamp, pluginName, name, description, help, boundaries, labels) => {
144
+ this.triggerMetricEvent("histogram", async (plugin) => {
145
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.createHistogram?.bind(plugin), timestamp, pluginName, name, description, help, boundaries, labels);
146
+ });
147
+ });
148
+ this.observableBus.on("observeHistogram", async (timestamp, pluginName, name, value, labels) => {
149
+ this.triggerMetricEvent("histogram", async (plugin) => {
150
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.observeHistogram?.bind(plugin), timestamp, pluginName, name, value, labels);
151
+ });
152
+ });
153
+ }
154
+ setupSpanEvents() {
155
+ this.observableBus.on("spanStart", async (trace, pluginName, spanName, parentSpanId, attributes) => {
156
+ this.triggerSpanEvent("spanStart", async (plugin) => {
157
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.spanStart?.bind(plugin), trace, pluginName, spanName, parentSpanId, attributes);
158
+ });
159
+ });
160
+ this.observableBus.on("spanEnd", async (trace, pluginName, attributes) => {
161
+ this.triggerSpanEvent("spanEnd", async (plugin) => {
162
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.spanEnd?.bind(plugin), trace, pluginName, attributes);
163
+ });
164
+ });
165
+ this.observableBus.on("spanError", async (trace, pluginName, error, attributes) => {
166
+ this.triggerSpanEvent("spanError", async (plugin) => {
167
+ await (0, base_1.SmartFunctionCallAsync)(plugin, plugin.spanError?.bind(plugin), trace, pluginName, error, attributes);
168
+ });
169
+ });
170
+ }
171
+ triggerEvent(eventType, pluginName, trace, message, meta) {
172
+ for (const observablePlugin of this.observablePlugins) {
173
+ if (!this.shouldTriggerForPlugin(eventType, pluginName, observablePlugin)) {
174
+ continue;
175
+ }
176
+ const method = observablePlugin.plugin[eventType];
177
+ if (method) {
178
+ (0, base_1.SmartFunctionCallAsync)(observablePlugin.plugin, method.bind(observablePlugin.plugin), trace, pluginName, message, meta);
179
+ }
180
+ }
181
+ }
182
+ async triggerMetricEvent(eventType, executor) {
183
+ for (const observablePlugin of this.observablePlugins) {
184
+ if (!this.shouldTriggerForPlugin(eventType, "", observablePlugin)) {
185
+ continue;
186
+ }
187
+ await executor(observablePlugin.plugin);
188
+ }
189
+ }
190
+ async triggerSpanEvent(eventType, executor) {
191
+ for (const observablePlugin of this.observablePlugins) {
192
+ if (!this.shouldTriggerForPlugin(eventType, "", observablePlugin)) {
193
+ continue;
194
+ }
195
+ await executor(observablePlugin.plugin);
196
+ }
197
+ }
198
+ shouldTriggerForPlugin(eventType, pluginName, observablePlugin) {
199
+ if (observablePlugin.onTypeof === "all") {
200
+ return true;
201
+ }
202
+ if (observablePlugin.on === undefined) {
203
+ return true;
204
+ }
205
+ // Handle array filter (events)
206
+ if (Array.isArray(observablePlugin.on)) {
207
+ return observablePlugin.on.includes(eventType);
208
+ }
209
+ // Handle object filters
210
+ const filterValue = observablePlugin.on[eventType];
211
+ if (filterValue === undefined) {
212
+ return false;
213
+ }
214
+ // eventsState: Record<EventType, boolean>
215
+ if (typeof filterValue === "boolean") {
216
+ return filterValue;
217
+ }
218
+ // eventsPlugins: Record<EventType, Array<string>>
219
+ if (Array.isArray(filterValue)) {
220
+ return filterValue.includes(pluginName);
221
+ }
222
+ // eventsDetailed: Record<EventType, { plugins: Array<string>; enabled: boolean }>
223
+ if (typeof filterValue === "object" && "enabled" in filterValue) {
224
+ const detailed = filterValue;
225
+ if (!detailed.enabled) {
226
+ return false;
227
+ }
228
+ if (detailed.plugins.length === 0) {
229
+ return true;
230
+ }
231
+ return detailed.plugins.includes(pluginName);
232
+ }
233
+ return false;
234
+ }
235
+ determineFilterType(filter) {
236
+ if (!filter) {
237
+ return "all";
238
+ }
239
+ if (Array.isArray(filter)) {
240
+ return "events";
241
+ }
242
+ const keys = Object.keys(filter);
243
+ if (keys.length === 0) {
244
+ return "all";
245
+ }
246
+ const firstValue = filter[keys[0]];
247
+ if (typeof firstValue === "boolean") {
248
+ return "eventsState";
249
+ }
250
+ if (Array.isArray(firstValue)) {
251
+ return "eventsPlugins";
252
+ }
253
+ if (typeof firstValue === "object" && "enabled" in firstValue) {
254
+ return "eventsDetailed";
255
+ }
256
+ return "all";
257
+ }
258
+ /**
259
+ * Setup and load observable plugins from configuration
260
+ *
261
+ * Loads configured observable plugins and initializes their filters.
262
+ * This is called during ServiceBase initialization.
263
+ *
264
+ * @param sbConfig - Configuration manager instance
265
+ */
266
+ async setupObservablePlugins(sbConfig) {
267
+ const trace = internalTrace("setupObservablePlugins");
268
+ this.observableBackend.info(trace, "Setting up observable plugins");
269
+ const observablePluginsFromConfig = await sbConfig.getObservablePlugins(trace);
270
+ for (const pluginKey of Object.keys(observablePluginsFromConfig)) {
271
+ const pluginDef = observablePluginsFromConfig[pluginKey];
272
+ if (!pluginDef.enabled) {
273
+ this.observableBackend.info(trace, "Observable plugin {plugin} is disabled", { plugin: pluginKey });
274
+ continue;
275
+ }
276
+ try {
277
+ const loadResult = await this.sbPlugins.loadPlugin(this.observableBackend, pluginDef.package ?? null, pluginDef.plugin, pluginKey);
278
+ if (!loadResult || !loadResult.success) {
279
+ this.observableBackend.error(trace, "Failed to load observable plugin {plugin}", { plugin: pluginKey });
280
+ continue;
281
+ }
282
+ const loadedPlugin = loadResult.data;
283
+ this.observableBackend.info(trace, "Loaded observable plugin {plugin} from {package}", {
284
+ plugin: pluginKey,
285
+ package: loadedPlugin.packageCwd,
286
+ });
287
+ const config = await sbConfig.getPluginConfig(trace, "observable", pluginKey);
288
+ const observablePlugin = new loadedPlugin.plugin({
289
+ appId: this.appId,
290
+ mode: this.mode,
291
+ pluginName: pluginKey,
292
+ cwd: this.cwd,
293
+ packageCwd: loadedPlugin.packageCwd,
294
+ pluginCwd: loadedPlugin.pluginCwd,
295
+ pluginVersion: loadedPlugin.version,
296
+ config,
297
+ });
298
+ this.observablePlugins.push({
299
+ plugin: observablePlugin,
300
+ on: pluginDef.filter,
301
+ onTypeof: this.determineFilterType(pluginDef.filter),
302
+ });
303
+ this.observableBackend.info(trace, "Initialized observable plugin {plugin}", { plugin: pluginKey });
304
+ }
305
+ catch (error) {
306
+ this.observableBackend.error(trace, "Failed to load observable plugin {plugin}: {error}", {
307
+ plugin: pluginKey,
308
+ error: error.message,
309
+ });
310
+ throw error;
311
+ }
312
+ }
313
+ if (this.observablePlugins.length === 0) {
314
+ this.observableBackend.info(trace, "No observable plugins configured, enabling default console logger");
315
+ this.observablePlugins.push({
316
+ plugin: new index_1.Plugin({
317
+ appId: this.appId,
318
+ mode: this.mode,
319
+ pluginName: "observable-default",
320
+ cwd: this.cwd,
321
+ packageCwd: this.cwd,
322
+ pluginCwd: this.cwd,
323
+ pluginVersion: "0.0.0",
324
+ config: undefined,
325
+ }),
326
+ on: undefined,
327
+ onTypeof: "all",
328
+ });
329
+ }
330
+ this._ready = true;
331
+ this.observableBackend.info(trace, "Observable plugins setup complete");
332
+ }
333
+ /**
334
+ * Initialize all observable plugins
335
+ *
336
+ * Calls the init lifecycle method on all loaded observable plugins.
337
+ * This is called during ServiceBase initialization.
338
+ *
339
+ * @param trace - DTrace for tracking initialization
340
+ * @param sbConfig - Configuration manager instance
341
+ */
342
+ async init(trace, sbConfig) {
343
+ this.observableBackend.info(trace, "Setting up observable plugins");
344
+ await this.setupObservablePlugins(sbConfig);
345
+ this.observableBackend.info(trace, "Initializing observable plugins");
346
+ for (const observablePlugin of this.observablePlugins) {
347
+ if (observablePlugin.plugin.init) {
348
+ await observablePlugin.plugin.init.call(observablePlugin.plugin);
349
+ }
350
+ }
351
+ this.observableBackend.info(trace, "Observable plugins initialized");
352
+ }
353
+ /**
354
+ * Run all observable plugins
355
+ *
356
+ * Calls the run lifecycle method on all loaded observable plugins.
357
+ * This is called during ServiceBase startup.
358
+ *
359
+ * @param trace - DTrace for tracking the run phase
360
+ */
361
+ async run(trace) {
362
+ this.observableBackend.info(trace, "Running observable plugins");
363
+ // If any non-default plugin handles all events, remove the default to avoid duplicate output
364
+ if (this.observablePlugins.length > 1) {
365
+ const nonDefault = this.observablePlugins.filter((x) => x.plugin.pluginName !== "observable-default");
366
+ const hasAllHandler = nonDefault.some((x) => x.onTypeof === "all");
367
+ if (hasAllHandler) {
368
+ const defaultPlugin = this.observablePlugins.find((x) => x.plugin.pluginName === "observable-default");
369
+ if (defaultPlugin) {
370
+ if (defaultPlugin.plugin.dispose) {
371
+ await (0, base_1.SmartFunctionCallAsync)(defaultPlugin.plugin, defaultPlugin.plugin.dispose);
372
+ }
373
+ this.observablePlugins = this.observablePlugins.filter((x) => x.plugin.pluginName !== "observable-default");
374
+ }
375
+ }
376
+ }
377
+ for (const observablePlugin of this.observablePlugins) {
378
+ if (observablePlugin.plugin.run) {
379
+ await observablePlugin.plugin.run.call(observablePlugin.plugin);
380
+ }
381
+ }
382
+ this.observableBackend.info(trace, "Observable plugins running");
383
+ }
384
+ /**
385
+ * Dispose all observable plugins
386
+ *
387
+ * Calls the dispose lifecycle method on all loaded observable plugins
388
+ * and clears the plugin list. This is called during ServiceBase shutdown.
389
+ */
390
+ async dispose() {
391
+ for (const observablePlugin of this.observablePlugins) {
392
+ if (observablePlugin.plugin.dispose) {
393
+ await (0, base_1.SmartFunctionCallAsync)(observablePlugin.plugin, observablePlugin.plugin.dispose);
394
+ }
395
+ }
396
+ this.observablePlugins = [];
397
+ }
398
+ // Logging API (for PluginLogging to use)
399
+ /**
400
+ * Emit a debug log event
401
+ * @param plugin - Plugin name
402
+ * @param trace - DTrace object
403
+ * @param message - Log message
404
+ * @param meta - Log metadata
405
+ */
406
+ debug(plugin, trace, message, meta) {
407
+ this.observableBus.emit("debug", plugin, trace, message, meta);
408
+ }
409
+ /**
410
+ * Emit an info log event
411
+ * @param plugin - Plugin name
412
+ * @param trace - DTrace object
413
+ * @param message - Log message
414
+ * @param meta - Log metadata
415
+ */
416
+ info(plugin, trace, message, meta) {
417
+ this.observableBus.emit("info", plugin, trace, message, meta);
418
+ }
419
+ /**
420
+ * Emit a warn log event
421
+ * @param plugin - Plugin name
422
+ * @param trace - DTrace object
423
+ * @param message - Log message
424
+ * @param meta - Log metadata
425
+ */
426
+ warn(plugin, trace, message, meta) {
427
+ this.observableBus.emit("warn", plugin, trace, message, meta);
428
+ }
429
+ /**
430
+ * Emit an error log event
431
+ * @param plugin - Plugin name
432
+ * @param trace - DTrace object
433
+ * @param message - Log message or BSBError
434
+ * @param meta - Log metadata (optional)
435
+ */
436
+ error(plugin, trace, message, meta) {
437
+ this.observableBus.emit("error", plugin, trace, message, meta);
438
+ }
439
+ // Metrics API (for PluginMetrics to use)
440
+ /**
441
+ * Emit counter creation event
442
+ * @param timestamp - Event timestamp
443
+ * @param pluginName - Plugin name
444
+ * @param name - Metric name
445
+ * @param description - Short description
446
+ * @param help - Detailed help text
447
+ * @param labels - Optional label names
448
+ */
449
+ createCounter(timestamp, pluginName, name, description, help, labels) {
450
+ this.observableBus.emit("createCounter", timestamp, pluginName, name, description, help, labels);
451
+ }
452
+ /**
453
+ * Emit counter increment event
454
+ * @param timestamp - Event timestamp
455
+ * @param pluginName - Plugin name
456
+ * @param name - Metric name
457
+ * @param value - Increment value
458
+ * @param labels - Optional label values
459
+ */
460
+ incrementCounter(timestamp, pluginName, name, value, labels) {
461
+ this.observableBus.emit("incrementCounter", timestamp, pluginName, name, value, labels);
462
+ }
463
+ /**
464
+ * Emit gauge creation event
465
+ * @param timestamp - Event timestamp
466
+ * @param pluginName - Plugin name
467
+ * @param name - Metric name
468
+ * @param description - Short description
469
+ * @param help - Detailed help text
470
+ * @param labels - Optional label names
471
+ */
472
+ createGauge(timestamp, pluginName, name, description, help, labels) {
473
+ this.observableBus.emit("createGauge", timestamp, pluginName, name, description, help, labels);
474
+ }
475
+ /**
476
+ * Emit gauge set event
477
+ * @param timestamp - Event timestamp
478
+ * @param pluginName - Plugin name
479
+ * @param name - Metric name
480
+ * @param value - New gauge value
481
+ * @param labels - Optional label values
482
+ */
483
+ setGauge(timestamp, pluginName, name, value, labels) {
484
+ this.observableBus.emit("setGauge", timestamp, pluginName, name, value, labels);
485
+ }
486
+ /**
487
+ * Emit histogram creation event
488
+ * @param timestamp - Event timestamp
489
+ * @param pluginName - Plugin name
490
+ * @param name - Metric name
491
+ * @param description - Short description
492
+ * @param help - Detailed help text
493
+ * @param boundaries - Optional histogram boundaries
494
+ * @param labels - Optional label names
495
+ */
496
+ createHistogram(timestamp, pluginName, name, description, help, boundaries, labels) {
497
+ this.observableBus.emit("createHistogram", timestamp, pluginName, name, description, help, boundaries, labels);
498
+ }
499
+ /**
500
+ * Emit histogram observation event
501
+ * @param timestamp - Event timestamp
502
+ * @param pluginName - Plugin name
503
+ * @param name - Metric name
504
+ * @param value - Observed value
505
+ * @param labels - Optional label values
506
+ */
507
+ observeHistogram(timestamp, pluginName, name, value, labels) {
508
+ this.observableBus.emit("observeHistogram", timestamp, pluginName, name, value, labels);
509
+ }
510
+ /**
511
+ * Emit span start event
512
+ * @param timestamp - Event timestamp
513
+ * @param appId - Application ID
514
+ * @param pluginName - Plugin name
515
+ * @param traceId - Trace ID
516
+ * @param parentSpanId - Parent span ID (null for root spans)
517
+ * @param spanId - This span's ID
518
+ * @param name - Span name
519
+ * @param attributes - Optional span attributes
520
+ */
521
+ startSpan(timestamp, appId, pluginName, traceId, parentSpanId, spanId, name, attributes) {
522
+ this.observableBus.emit("spanStart", { t: traceId, s: spanId }, pluginName, name, parentSpanId, attributes);
523
+ }
524
+ /**
525
+ * Emit span end event
526
+ * @param timestamp - Event timestamp
527
+ * @param appId - Application ID
528
+ * @param pluginName - Plugin name
529
+ * @param traceId - Trace ID
530
+ * @param spanId - Span ID
531
+ * @param attributes - Optional final attributes
532
+ */
533
+ endSpan(timestamp, appId, pluginName, traceId, spanId, attributes) {
534
+ this.observableBus.emit("spanEnd", { t: traceId, s: spanId }, pluginName, attributes);
535
+ }
536
+ /**
537
+ * Emit span error event
538
+ * @param timestamp - Event timestamp
539
+ * @param appId - Application ID
540
+ * @param pluginName - Plugin name
541
+ * @param traceId - Trace ID
542
+ * @param spanId - Span ID
543
+ * @param error - Error to record
544
+ * @param attributes - Optional error attributes
545
+ */
546
+ errorSpan(timestamp, appId, pluginName, traceId, spanId, error, attributes) {
547
+ this.observableBus.emit("spanError", { t: traceId, s: spanId }, pluginName, error, attributes);
548
+ }
549
+ }
550
+ exports.SBObservable = SBObservable;
551
+ //# sourceMappingURL=observable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observable.js","sourceRoot":"","sources":["../../src/serviceBase/observable.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAEH,6CAA2C;AAC3C,kCAA6F;AAS7F,mDAAiE;AAGjE,+DAAkF;AAElF;;GAEG;AACH,SAAS,aAAa,CAAC,IAAY;IACjC,OAAO,IAAA,0BAAgB,EAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAa,YAAY;IACf,iBAAiB,GAIpB,EAAE,CAAC;IACD,aAAa,GAAiB,IAAI,0BAAY,EAAE,CAAC;IAChD,IAAI,GAAe,aAAa,CAAC;IACjC,KAAK,CAAS;IACd,GAAG,CAAS;IACZ,SAAS,CAAY;IACrB,iBAAiB,CAAoB;IACrC,MAAM,GAAG,KAAK,CAAC;IAEvB;;;OAGG;IACH,IAAW,OAAO;QAChB,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED;;;;;;OAMG;IACH,YACE,KAAa,EACb,IAAgB,EAChB,GAAW,EACX,SAAoB;QAEpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,MAAM,oBAAoB,GAAG,iBAAiB,CAAC;QAC/C,IAAI,CAAC,iBAAiB,GAAG,IAAI,wBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;QAE7F,uBAAuB;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;YAC/B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe,EAAE,IAAkB,EAAE,EAAE;gBACpG,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe,EAAE,IAAkB,EAAE,EAAE;YACnG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe,EAAE,IAAkB,EAAE,EAAE;YACnG,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,MAAc,EAAE,KAAa,EAAE,OAA+B,EAAE,IAAmB,EAAE,EAAE;YACrH,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;QAEH,uBAAuB;QACvB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACxB,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAC5B,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAEO,kBAAkB;QACxB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,eAAe,EAAE,KAAK,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,WAAmB,EAAE,IAAY,EAAE,MAAiB,EAAE,EAAE;YACzJ,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAClD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,EAClC,SAAS,EACT,UAAU,EACV,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,MAA+B,EAAE,EAAE;YACtJ,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAClD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,EACrC,SAAS,EACT,UAAU,EACV,IAAI,EACJ,KAAK,EACL,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,KAAK,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,WAAmB,EAAE,IAAY,EAAE,MAAiB,EAAE,EAAE;YACvJ,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,EAChC,SAAS,EACT,UAAU,EACV,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,MAA+B,EAAE,EAAE;YAC9I,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,EAC7B,SAAS,EACT,UAAU,EACV,IAAI,EACJ,KAAK,EACL,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,iBAAiB,EAAE,KAAK,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,WAAmB,EAAE,IAAY,EAAE,UAAqB,EAAE,MAAiB,EAAE,EAAE;YAClL,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACpD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,eAAe,EAAE,IAAI,CAAC,MAAM,CAAC,EACpC,SAAS,EACT,UAAU,EACV,IAAI,EACJ,WAAW,EACX,IAAI,EACJ,UAAU,EACV,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,kBAAkB,EAAE,KAAK,EAAE,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,MAA+B,EAAE,EAAE;YACtJ,IAAI,CAAC,kBAAkB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBACpD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC,EACrC,SAAS,EACT,UAAU,EACV,IAAI,EACJ,KAAK,EACL,MAAM,CACP,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,eAAe;QACrB,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAa,EAAE,UAAkB,EAAE,QAAgB,EAAE,YAA2B,EAAE,UAAsD,EAAE,EAAE;YACpL,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAClD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,QAAQ,EACR,YAAY,EACZ,UAAU,CACX,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,KAAa,EAAE,UAAkB,EAAE,UAAsD,EAAE,EAAE;YACnI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAChD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAC5B,KAAK,EACL,UAAU,EACV,UAAU,CACX,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,KAAK,EAAE,KAAa,EAAE,UAAkB,EAAE,KAAY,EAAE,UAAsD,EAAE,EAAE;YACnJ,IAAI,CAAC,gBAAgB,CAAC,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;gBAClD,MAAM,IAAA,6BAAsB,EAC1B,MAAM,EACN,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,KAAK,EACL,UAAU,CACX,CAAC;YACJ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,YAAY,CAClB,SAA8C,EAC9C,UAAkB,EAClB,KAAa,EACb,OAA+B,EAC/B,IAAmB;QAEnB,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAC1E,SAAS;YACX,CAAC;YAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAClD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAA,6BAAsB,EACpB,gBAAgB,CAAC,MAAM,EACvB,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EACpC,KAAK,EACL,UAAU,EACV,OAAO,EACP,IAAI,CACL,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,SAA4C,EAC5C,QAAuD;QAEvD,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAClE,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAC5B,SAAgD,EAChD,QAAuD;QAEvD,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,SAAS,EAAE,EAAE,EAAE,gBAAgB,CAAC,EAAE,CAAC;gBAClE,SAAS;YACX,CAAC;YAED,MAAM,QAAQ,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAEO,sBAAsB,CAC5B,SAA+B,EAC/B,UAAkB,EAClB,gBAA+F;QAE/F,IAAI,gBAAgB,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,gBAAgB,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,+BAA+B;QAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC,EAAE,CAAC;YACvC,OAAO,gBAAgB,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACjD,CAAC;QAED,wBAAwB;QACxB,MAAM,WAAW,GAAG,gBAAgB,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;QAEnD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0CAA0C;QAC1C,IAAI,OAAO,WAAW,KAAK,SAAS,EAAE,CAAC;YACrC,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,kDAAkD;QAClD,IAAI,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,OAAO,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1C,CAAC;QAED,kFAAkF;QAClF,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,SAAS,IAAI,WAAW,EAAE,CAAC;YAChE,MAAM,QAAQ,GAAG,WAA2D,CAAC;YAC7E,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACtB,OAAO,KAAK,CAAC;YACf,CAAC;YACD,IAAI,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,mBAAmB,CAAC,MAAyB;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAyB,CAAC,CAAC;QAE3D,IAAI,OAAO,UAAU,KAAK,SAAS,EAAE,CAAC;YACpC,OAAO,aAAa,CAAC;QACvB,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,OAAO,eAAe,CAAC;QACzB,CAAC;QAED,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,SAAS,IAAI,UAAU,EAAE,CAAC;YAC9D,OAAO,gBAAgB,CAAC;QAC1B,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,sBAAsB,CAAC,QAAkB;QACpD,MAAM,KAAK,GAAG,aAAa,CAAC,wBAAwB,CAAC,CAAC;QAEtD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;QACpE,MAAM,2BAA2B,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAE/E,KAAK,MAAM,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACjE,MAAM,SAAS,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;gBACvB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,wCAAwC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;gBACpG,SAAS;YACX,CAAC;YAED,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAChD,IAAI,CAAC,iBAAiB,EACtB,SAAS,CAAC,OAAO,IAAI,IAAI,EACzB,SAAS,CAAC,MAAM,EAChB,SAAS,CACV,CAAC;gBAEF,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,2CAA2C,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;oBACxG,SAAS;gBACX,CAAC;gBAED,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC;gBAErC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,kDAAkD,EAAE;oBACrF,MAAM,EAAE,SAAS;oBACjB,OAAO,EAAE,YAAY,CAAC,UAAU;iBACjC,CAAC,CAAC;gBAEH,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC;gBAE9E,MAAM,gBAAgB,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC;oBAC/C,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,SAAS;oBACrB,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,UAAU,EAAE,YAAY,CAAC,UAAU;oBACnC,SAAS,EAAE,YAAY,CAAC,SAAS;oBACjC,aAAa,EAAE,YAAY,CAAC,OAAO;oBACnC,MAAM;iBACP,CAAC,CAAC;gBAEH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,gBAAgB;oBACxB,EAAE,EAAE,SAAS,CAAC,MAAM;oBACpB,QAAQ,EAAE,IAAI,CAAC,mBAAmB,CAAC,SAAS,CAAC,MAAM,CAAC;iBACrD,CAAC,CAAC;gBAEH,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,wCAAwC,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;YACtG,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,EAAE,oDAAoD,EAAE;oBACxF,MAAM,EAAE,SAAS;oBACjB,KAAK,EAAE,KAAK,CAAC,OAAO;iBACrB,CAAC,CAAC;gBACH,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,mEAAmE,CAAC,CAAC;YACxG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;gBAC1B,MAAM,EAAE,IAAI,cAAiB,CAAC;oBAC5B,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,UAAU,EAAE,oBAAoB;oBAChC,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,UAAU,EAAE,IAAI,CAAC,GAAG;oBACpB,SAAS,EAAE,IAAI,CAAC,GAAG;oBACnB,aAAa,EAAE,OAAO;oBACtB,MAAM,EAAE,SAAS;iBAClB,CAAC;gBACF,EAAE,EAAE,SAAS;gBACb,QAAQ,EAAE,KAAK;aAChB,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,mCAAmC,CAAC,CAAC;IAC1E,CAAC;IAED;;;;;;;;OAQG;IACI,KAAK,CAAC,IAAI,CAAC,KAAa,EAAE,QAAkB;QACjD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;QACpE,MAAM,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAC;QAE5C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC;QACtE,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjC,MAAO,gBAAgB,CAAC,MAAM,CAAC,IAAY,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC5E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,gCAAgC,CAAC,CAAC;IACvE,CAAC;IAED;;;;;;;OAOG;IACI,KAAK,CAAC,GAAG,CAAC,KAAa;QAC5B,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QAEjE,6FAA6F;QAC7F,IAAI,IAAI,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,oBAAoB,CAAC,CAAC;YACtG,MAAM,aAAa,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC;YACnE,IAAI,aAAa,EAAE,CAAC;gBAClB,MAAM,aAAa,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,oBAAoB,CAAC,CAAC;gBACvG,IAAI,aAAa,EAAE,CAAC;oBAClB,IAAI,aAAa,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjC,MAAM,IAAA,6BAAsB,EAAC,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACnF,CAAC;oBACD,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,KAAK,oBAAoB,CAAC,CAAC;gBAC9G,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;gBAChC,MAAO,gBAAgB,CAAC,MAAM,CAAC,GAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;IACnE,CAAC;IAED;;;;;OAKG;IACI,KAAK,CAAC,OAAO;QAClB,KAAK,MAAM,gBAAgB,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACtD,IAAI,gBAAgB,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,IAAA,6BAAsB,EAAC,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACzF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,EAAE,CAAC;IAC9B,CAAC;IAED,yCAAyC;IACzC;;;;;;OAMG;IACI,KAAK,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe,EAAE,IAAkB;QAC7E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAED;;;;;;OAMG;IACI,IAAI,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe,EAAE,IAAkB;QAC5E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;OAMG;IACI,IAAI,CAAC,MAAc,EAAE,KAAa,EAAE,OAAe,EAAE,IAAkB;QAC5E,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IAChE,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,MAAc,EAAE,KAAa,EAAE,OAA+B,EAAE,IAAmB;QAC9F,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACjE,CAAC;IAED,yCAAyC;IACzC;;;;;;;;OAQG;IACI,aAAa,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,WAAmB,EAAE,IAAY,EAAE,MAAiB;QAC5H,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACnG,CAAC;IAED;;;;;;;OAOG;IACI,gBAAgB,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,MAA+B;QACzH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1F,CAAC;IAED;;;;;;;;OAQG;IACI,WAAW,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,WAAmB,EAAE,IAAY,EAAE,MAAiB;QAC1H,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACjG,CAAC;IAED;;;;;;;OAOG;IACI,QAAQ,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,MAA+B;QACjH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAClF,CAAC;IAED;;;;;;;;;OASG;IACI,eAAe,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,WAAmB,EAAE,IAAY,EAAE,UAAqB,EAAE,MAAiB;QACrJ,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;IACjH,CAAC;IAED;;;;;;;OAOG;IACI,gBAAgB,CAAC,SAAiB,EAAE,UAAkB,EAAE,IAAY,EAAE,KAAa,EAAE,MAA+B;QACzH,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,kBAAkB,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;IAC1F,CAAC;IAED;;;;;;;;;;OAUG;IACI,SAAS,CAAC,SAAiB,EAAE,KAAa,EAAE,UAAkB,EAAE,OAAe,EAAE,YAA2B,EAAE,MAAc,EAAE,IAAY,EAAE,UAAsD;QACvM,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;IAC9G,CAAC;IAED;;;;;;;;OAQG;IACI,OAAO,CAAC,SAAiB,EAAE,KAAa,EAAE,UAAkB,EAAE,OAAe,EAAE,MAAc,EAAE,UAAsD;QAC1J,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;IACxF,CAAC;IAED;;;;;;;;;OASG;IACI,SAAS,CAAC,SAAiB,EAAE,KAAa,EAAE,UAAkB,EAAE,OAAe,EAAE,MAAc,EAAE,KAAY,EAAE,UAAsD;QAC1K,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC;IACjG,CAAC;CACF;AAnpBD,oCAmpBC"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * BSB (Better-Service-Base) is an event-bus based microservice framework.
3
+ * Copyright (C) 2016 - 2025 BetterCorp (PTY) Ltd
4
+ *
5
+ * This program is free software: you can redistribute it and/or modify
6
+ * it under the terms of the GNU Affero General Public License as published
7
+ * by the Free Software Foundation, either version 3 of the License, or
8
+ * (at your option) any later version.
9
+ *
10
+ * Alternatively, you may obtain a commercial license for this program.
11
+ * The commercial license allows you to use the Program in a closed-source manner,
12
+ * including the right to create derivative works that are not subject to the terms
13
+ * of the AGPL.
14
+ *
15
+ * To obtain a commercial license, please contact the copyright holders at
16
+ * https://www.bettercorp.dev. The terms and conditions of the commercial license
17
+ * will be provided upon request.
18
+ *
19
+ * This program is distributed in the hope that it will be useful,
20
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
21
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22
+ * GNU Affero General Public License for more details.
23
+ *
24
+ * You should have received a copy of the GNU Affero General Public License
25
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
26
+ */
27
+ import { IPluginLogging, LoadedPlugin, PluginType, PluginTypeDefinitionRef, Result } from "../interfaces";
28
+ /**
29
+ * BSB Plugins Controller
30
+ *
31
+ * This class is responsible for loading the plugins in the BSB framework.
32
+ * If you have a specific way of loading plugins, you can extend this class and then use your own class when creating the ServiceBase instance.
33
+ *
34
+ * @group Plugins
35
+ * @category Core
36
+ */
37
+ export declare class SBPlugins {
38
+ /**
39
+ * @see {@link https://bsbcode.dev/languages/nodejs/types/classes/SBPlugins.html | API: SBPlugins}
40
+ */
41
+ protected cwd: string;
42
+ protected nodeModulesPluginDir: string;
43
+ protected referencedPluginDir: string | null;
44
+ protected devMode: boolean;
45
+ constructor(cwd: string, devMode: boolean);
46
+ loadPlugin<NamedType extends PluginType, ClassType extends PluginTypeDefinitionRef<NamedType> = PluginTypeDefinitionRef<NamedType>>(log: IPluginLogging, npmPackage: string | null, plugin: string, name: string): Promise<Result<LoadedPlugin<NamedType, ClassType>, Error>>;
47
+ loadPluginFile<NamedType extends PluginType, ClassType extends PluginTypeDefinitionRef<NamedType>>(pluginPath: string, pluginName: string, packageCwd: string, version: string): Promise<LoadedPlugin<NamedType, ClassType>>;
48
+ }