@loopback/context 1.25.1 → 2.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 (45) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/dist/binding-filter.d.ts +19 -1
  3. package/dist/binding-filter.js +40 -7
  4. package/dist/binding-filter.js.map +1 -1
  5. package/dist/binding.d.ts +33 -1
  6. package/dist/binding.js +14 -1
  7. package/dist/binding.js.map +1 -1
  8. package/dist/context-event.d.ts +23 -0
  9. package/dist/context-event.js +7 -0
  10. package/dist/context-event.js.map +1 -0
  11. package/dist/context-observer.d.ts +1 -36
  12. package/dist/context-subscription.d.ts +147 -0
  13. package/dist/context-subscription.js +336 -0
  14. package/dist/context-subscription.js.map +1 -0
  15. package/dist/context-tag-indexer.d.ts +42 -0
  16. package/dist/context-tag-indexer.js +134 -0
  17. package/dist/context-tag-indexer.js.map +1 -0
  18. package/dist/context-view.d.ts +2 -1
  19. package/dist/context-view.js.map +1 -1
  20. package/dist/context.d.ts +29 -65
  21. package/dist/context.js +50 -245
  22. package/dist/context.js.map +1 -1
  23. package/dist/index.d.ts +2 -0
  24. package/dist/index.js +1 -0
  25. package/dist/index.js.map +1 -1
  26. package/dist/inject.d.ts +1 -1
  27. package/dist/interceptor.js +4 -4
  28. package/dist/interceptor.js.map +1 -1
  29. package/dist/invocation.d.ts +0 -1
  30. package/dist/invocation.js +1 -5
  31. package/dist/invocation.js.map +1 -1
  32. package/dist/value-promise.d.ts +1 -3
  33. package/package.json +7 -7
  34. package/src/binding-filter.ts +61 -9
  35. package/src/binding.ts +43 -1
  36. package/src/context-event.ts +30 -0
  37. package/src/context-observer.ts +1 -38
  38. package/src/context-subscription.ts +403 -0
  39. package/src/context-tag-indexer.ts +149 -0
  40. package/src/context-view.ts +2 -5
  41. package/src/context.ts +71 -286
  42. package/src/index.ts +2 -0
  43. package/src/interceptor.ts +7 -6
  44. package/src/invocation.ts +1 -3
  45. package/src/value-promise.ts +1 -1
@@ -0,0 +1,336 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2020. All Rights Reserved.
3
+ // Node module: @loopback/context
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ var __asyncValues = (this && this.__asyncValues) || function (o) {
7
+ if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
8
+ var m = o[Symbol.asyncIterator], i;
9
+ return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i);
10
+ function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }
11
+ function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }
12
+ };
13
+ var __importDefault = (this && this.__importDefault) || function (mod) {
14
+ return (mod && mod.__esModule) ? mod : { "default": mod };
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ const debug_1 = __importDefault(require("debug"));
18
+ const events_1 = require("events");
19
+ const debug = debug_1.default('loopback:context:subscription');
20
+ /**
21
+ * Polyfill Symbol.asyncIterator as required by TypeScript for Node 8.x.
22
+ * See https://www.typescriptlang.org/docs/handbook/release-notes/typescript-2-3.html
23
+ */
24
+ if (!Symbol.asyncIterator) {
25
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ Symbol.asyncIterator = Symbol.for('Symbol.asyncIterator');
27
+ }
28
+ /**
29
+ * WARNING: This following import must happen after the polyfill. The
30
+ * `auto-import` by an IDE such as VSCode may move the import before the
31
+ * polyfill. It must be then fixed manually.
32
+ */
33
+ const p_event_1 = require("p-event");
34
+ /**
35
+ * An implementation of `Subscription` interface for context events
36
+ */
37
+ class ContextSubscription {
38
+ constructor(context, observer) {
39
+ this.context = context;
40
+ this.observer = observer;
41
+ this._closed = false;
42
+ }
43
+ unsubscribe() {
44
+ this.context.unsubscribe(this.observer);
45
+ this._closed = true;
46
+ }
47
+ get closed() {
48
+ return this._closed;
49
+ }
50
+ }
51
+ /**
52
+ * Manager for context observer subscriptions
53
+ */
54
+ class ContextSubscriptionManager extends events_1.EventEmitter {
55
+ constructor(context) {
56
+ super();
57
+ this.context = context;
58
+ /**
59
+ * Internal counter for pending notification events which are yet to be
60
+ * processed by observers.
61
+ */
62
+ this.pendingNotifications = 0;
63
+ this.setMaxListeners(Infinity);
64
+ }
65
+ /**
66
+ * @internal
67
+ */
68
+ get parentContextEventListener() {
69
+ return this._parentContextEventListener;
70
+ }
71
+ /**
72
+ * @internal
73
+ */
74
+ get observers() {
75
+ return this._observers;
76
+ }
77
+ /**
78
+ * Wrap the debug statement so that it always print out the context name
79
+ * as the prefix
80
+ * @param args - Arguments for the debug
81
+ */
82
+ _debug(...args) {
83
+ /* istanbul ignore if */
84
+ if (!debug.enabled)
85
+ return;
86
+ const formatter = args.shift();
87
+ if (typeof formatter === 'string') {
88
+ debug(`[%s] ${formatter}`, this.context.name, ...args);
89
+ }
90
+ else {
91
+ debug('[%s] ', this.context.name, formatter, ...args);
92
+ }
93
+ }
94
+ /**
95
+ * Set up an internal listener to notify registered observers asynchronously
96
+ * upon `bind` and `unbind` events. This method will be called lazily when
97
+ * the first observer is added.
98
+ */
99
+ setupEventHandlersIfNeeded() {
100
+ if (this.notificationQueue != null)
101
+ return;
102
+ if (this.context.parent != null) {
103
+ /**
104
+ * Add an event listener to its parent context so that this context will
105
+ * be notified of parent events, such as `bind` or `unbind`.
106
+ */
107
+ this._parentContextEventListener = event => {
108
+ this.handleParentEvent(event);
109
+ };
110
+ // Listen on the parent context events
111
+ this.context.parent.on('bind', this._parentContextEventListener);
112
+ this.context.parent.on('unbind', this._parentContextEventListener);
113
+ }
114
+ // The following are two async functions. Returned promises are ignored as
115
+ // they are long-running background tasks.
116
+ this.startNotificationTask().catch(err => {
117
+ this.handleNotificationError(err);
118
+ });
119
+ let ctx = this.context.parent;
120
+ while (ctx) {
121
+ ctx.subscriptionManager.setupEventHandlersIfNeeded();
122
+ ctx = ctx.parent;
123
+ }
124
+ }
125
+ handleParentEvent(event) {
126
+ const { binding, context, type } = event;
127
+ // Propagate the event to this context only if the binding key does not
128
+ // exist in this context. The parent binding is shadowed if there is a
129
+ // binding with the same key in this one.
130
+ if (this.context.contains(binding.key)) {
131
+ this._debug('Event %s %s is not re-emitted from %s to %s', type, binding.key, context.name, this.context.name);
132
+ return;
133
+ }
134
+ this._debug('Re-emitting %s %s from %s to %s', type, binding.key, context.name, this.context.name);
135
+ this.context.emitEvent(type, event);
136
+ }
137
+ /**
138
+ * A strongly-typed method to emit context events
139
+ * @param type Event type
140
+ * @param event Context event
141
+ */
142
+ emitEvent(type, event) {
143
+ this.emit(type, event);
144
+ }
145
+ /**
146
+ * Emit an `error` event
147
+ * @param err Error
148
+ */
149
+ emitError(err) {
150
+ this.emit('error', err);
151
+ }
152
+ /**
153
+ * Start a background task to listen on context events and notify observers
154
+ */
155
+ startNotificationTask() {
156
+ // Set up listeners on `bind` and `unbind` for notifications
157
+ this.setupNotification('bind', 'unbind');
158
+ // Create an async iterator for the `notification` event as a queue
159
+ this.notificationQueue = p_event_1.iterator(this, 'notification');
160
+ return this.processNotifications();
161
+ }
162
+ /**
163
+ * Publish an event to the registered observers. Please note the
164
+ * notification is queued and performed asynchronously so that we allow fluent
165
+ * APIs such as `ctx.bind('key').to(...).tag(...);` and give observers the
166
+ * fully populated binding.
167
+ *
168
+ * @param event - Context event
169
+ * @param observers - Current set of context observers
170
+ */
171
+ async notifyObservers(event, observers = this._observers) {
172
+ if (!observers || observers.size === 0)
173
+ return;
174
+ const { type, binding, context } = event;
175
+ for (const observer of observers) {
176
+ if (typeof observer === 'function') {
177
+ await observer(type, binding, context);
178
+ }
179
+ else if (!observer.filter || observer.filter(binding)) {
180
+ await observer.observe(type, binding, context);
181
+ }
182
+ }
183
+ }
184
+ /**
185
+ * Process notification events as they arrive on the queue
186
+ */
187
+ async processNotifications() {
188
+ var e_1, _a;
189
+ const events = this.notificationQueue;
190
+ if (events == null)
191
+ return;
192
+ try {
193
+ for (var events_2 = __asyncValues(events), events_2_1; events_2_1 = await events_2.next(), !events_2_1.done;) {
194
+ const { type, binding, context, observers } = events_2_1.value;
195
+ // The loop will happen asynchronously upon events
196
+ try {
197
+ // The execution of observers happen in the Promise micro-task queue
198
+ await this.notifyObservers({ type, binding, context }, observers);
199
+ this.pendingNotifications--;
200
+ this._debug('Observers notified for %s of binding %s', type, binding.key);
201
+ this.emitEvent('observersNotified', { type, binding, context });
202
+ }
203
+ catch (err) {
204
+ this.pendingNotifications--;
205
+ this._debug('Error caught from observers', err);
206
+ // Errors caught from observers. Emit it to the current context.
207
+ // If no error listeners are registered, crash the process.
208
+ this.emitError(err);
209
+ }
210
+ }
211
+ }
212
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
213
+ finally {
214
+ try {
215
+ if (events_2_1 && !events_2_1.done && (_a = events_2.return)) await _a.call(events_2);
216
+ }
217
+ finally { if (e_1) throw e_1.error; }
218
+ }
219
+ }
220
+ /**
221
+ * Listen on given event types and emit `notification` event. This method
222
+ * merge multiple event types into one for notification.
223
+ * @param eventTypes - Context event types
224
+ */
225
+ setupNotification(...eventTypes) {
226
+ for (const type of eventTypes) {
227
+ this.context.on(type, ({ binding, context }) => {
228
+ // No need to schedule notifications if no observers are present
229
+ if (!this._observers || this._observers.size === 0)
230
+ return;
231
+ // Track pending events
232
+ this.pendingNotifications++;
233
+ // Take a snapshot of current observers to ensure notifications of this
234
+ // event will only be sent to current ones. Emit a new event to notify
235
+ // current context observers.
236
+ this.emitEvent('notification', {
237
+ type,
238
+ binding,
239
+ context,
240
+ observers: new Set(this._observers),
241
+ });
242
+ });
243
+ }
244
+ }
245
+ /**
246
+ * Wait until observers are notified for all of currently pending notification
247
+ * events.
248
+ *
249
+ * This method is for test only to perform assertions after observers are
250
+ * notified for relevant events.
251
+ */
252
+ async waitUntilPendingNotificationsDone(timeout) {
253
+ const count = this.pendingNotifications;
254
+ if (count === 0)
255
+ return;
256
+ await p_event_1.multiple(this, 'observersNotified', { count, timeout });
257
+ }
258
+ /**
259
+ * Add a context event observer to the context
260
+ * @param observer - Context observer instance or function
261
+ */
262
+ subscribe(observer) {
263
+ var _a;
264
+ this._observers = (_a = this._observers, (_a !== null && _a !== void 0 ? _a : new Set()));
265
+ this.setupEventHandlersIfNeeded();
266
+ this._observers.add(observer);
267
+ return new ContextSubscription(this.context, observer);
268
+ }
269
+ /**
270
+ * Remove the context event observer from the context
271
+ * @param observer - Context event observer
272
+ */
273
+ unsubscribe(observer) {
274
+ if (!this._observers)
275
+ return false;
276
+ return this._observers.delete(observer);
277
+ }
278
+ /**
279
+ * Check if an observer is subscribed to this context
280
+ * @param observer - Context observer
281
+ */
282
+ isSubscribed(observer) {
283
+ if (!this._observers)
284
+ return false;
285
+ return this._observers.has(observer);
286
+ }
287
+ /**
288
+ * Handle errors caught during the notification of observers
289
+ * @param err - Error
290
+ */
291
+ handleNotificationError(err) {
292
+ // Bubbling up the error event over the context chain
293
+ // until we find an error listener
294
+ let ctx = this.context;
295
+ while (ctx) {
296
+ if (ctx.listenerCount('error') === 0) {
297
+ // No error listener found, try its parent
298
+ ctx = ctx.parent;
299
+ continue;
300
+ }
301
+ this._debug('Emitting error to context %s', ctx.name, err);
302
+ ctx.emitError(err);
303
+ return;
304
+ }
305
+ // No context with error listeners found
306
+ this._debug('No error handler is configured for the context chain', err);
307
+ // Let it crash now by emitting an error event
308
+ this.context.emitError(err);
309
+ }
310
+ /**
311
+ * Close the context: clear observers, stop notifications, and remove event
312
+ * listeners from its parent context.
313
+ *
314
+ * @remarks
315
+ * This method MUST be called to avoid memory leaks once a context object is
316
+ * no longer needed and should be recycled. An example is the `RequestContext`,
317
+ * which is created per request.
318
+ */
319
+ close() {
320
+ this._observers = undefined;
321
+ if (this.notificationQueue != null) {
322
+ // Cancel the notification iterator
323
+ this.notificationQueue.return(undefined).catch(err => {
324
+ this.handleNotificationError(err);
325
+ });
326
+ this.notificationQueue = undefined;
327
+ }
328
+ if (this.context.parent && this._parentContextEventListener) {
329
+ this.context.parent.removeListener('bind', this._parentContextEventListener);
330
+ this.context.parent.removeListener('unbind', this._parentContextEventListener);
331
+ this._parentContextEventListener = undefined;
332
+ }
333
+ }
334
+ }
335
+ exports.ContextSubscriptionManager = ContextSubscriptionManager;
336
+ //# sourceMappingURL=context-subscription.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-subscription.js","sourceRoot":"","sources":["../src/context-subscription.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Binding, BindingTag } from './binding';
2
+ import { Context } from './context';
3
+ import { BoundValue } from './value-promise';
4
+ /**
5
+ * Indexer for context bindings by tag
6
+ */
7
+ export declare class ContextTagIndexer {
8
+ protected readonly context: Context;
9
+ /**
10
+ * Index for bindings by tag names
11
+ */
12
+ readonly bindingsIndexedByTag: Map<string, Set<Readonly<Binding<unknown>>>>;
13
+ /**
14
+ * A listener for binding events
15
+ */
16
+ private bindingEventListener;
17
+ /**
18
+ * A listener to maintain tag index for bindings
19
+ */
20
+ private tagIndexListener;
21
+ constructor(context: Context);
22
+ /**
23
+ * Set up context/binding listeners and refresh index for bindings by tag
24
+ */
25
+ private setupTagIndexForBindings;
26
+ /**
27
+ * Remove tag index for the given binding
28
+ * @param binding - Binding object
29
+ */
30
+ private removeTagIndexForBinding;
31
+ /**
32
+ * Update tag index for the given binding
33
+ * @param binding - Binding object
34
+ */
35
+ private updateTagIndexForBinding;
36
+ /**
37
+ * Find bindings by tag leveraging indexes
38
+ * @param tag - Tag name pattern or name/value pairs
39
+ */
40
+ findByTagIndex<ValueType = BoundValue>(tag: BindingTag | RegExp): Readonly<Binding<ValueType>>[];
41
+ close(): void;
42
+ }
@@ -0,0 +1,134 @@
1
+ "use strict";
2
+ // Copyright IBM Corp. 2020. All Rights Reserved.
3
+ // Node module: @loopback/context
4
+ // This file is licensed under the MIT License.
5
+ // License text available at https://opensource.org/licenses/MIT
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ const binding_filter_1 = require("./binding-filter");
8
+ /**
9
+ * Indexer for context bindings by tag
10
+ */
11
+ class ContextTagIndexer {
12
+ constructor(context) {
13
+ this.context = context;
14
+ /**
15
+ * Index for bindings by tag names
16
+ */
17
+ this.bindingsIndexedByTag = new Map();
18
+ this.setupTagIndexForBindings();
19
+ }
20
+ /**
21
+ * Set up context/binding listeners and refresh index for bindings by tag
22
+ */
23
+ setupTagIndexForBindings() {
24
+ this.bindingEventListener = ({ binding, operation }) => {
25
+ if (operation === 'tag') {
26
+ this.updateTagIndexForBinding(binding);
27
+ }
28
+ };
29
+ this.tagIndexListener = event => {
30
+ const { binding, type } = event;
31
+ if (event.context !== this.context)
32
+ return;
33
+ if (type === 'bind') {
34
+ this.updateTagIndexForBinding(binding);
35
+ binding.on('changed', this.bindingEventListener);
36
+ }
37
+ else if (type === 'unbind') {
38
+ this.removeTagIndexForBinding(binding);
39
+ binding.removeListener('changed', this.bindingEventListener);
40
+ }
41
+ };
42
+ this.context.on('bind', this.tagIndexListener);
43
+ this.context.on('unbind', this.tagIndexListener);
44
+ }
45
+ /**
46
+ * Remove tag index for the given binding
47
+ * @param binding - Binding object
48
+ */
49
+ removeTagIndexForBinding(binding) {
50
+ for (const [, bindings] of this.bindingsIndexedByTag) {
51
+ bindings.delete(binding);
52
+ }
53
+ }
54
+ /**
55
+ * Update tag index for the given binding
56
+ * @param binding - Binding object
57
+ */
58
+ updateTagIndexForBinding(binding) {
59
+ this.removeTagIndexForBinding(binding);
60
+ for (const tag of binding.tagNames) {
61
+ let bindings = this.bindingsIndexedByTag.get(tag);
62
+ if (bindings == null) {
63
+ bindings = new Set();
64
+ this.bindingsIndexedByTag.set(tag, bindings);
65
+ }
66
+ bindings.add(binding);
67
+ }
68
+ }
69
+ /**
70
+ * Find bindings by tag leveraging indexes
71
+ * @param tag - Tag name pattern or name/value pairs
72
+ */
73
+ findByTagIndex(tag) {
74
+ let tagNames;
75
+ // A flag to control if a union of matched bindings should be created
76
+ let union = false;
77
+ if (tag instanceof RegExp) {
78
+ // For wildcard/regexp, a union of matched bindings is desired
79
+ union = true;
80
+ // Find all matching tag names
81
+ tagNames = [];
82
+ for (const t of this.bindingsIndexedByTag.keys()) {
83
+ if (tag.test(t)) {
84
+ tagNames.push(t);
85
+ }
86
+ }
87
+ }
88
+ else if (typeof tag === 'string') {
89
+ tagNames = [tag];
90
+ }
91
+ else {
92
+ tagNames = Object.keys(tag);
93
+ }
94
+ let filter;
95
+ let bindings;
96
+ for (const t of tagNames) {
97
+ const bindingsByTag = this.bindingsIndexedByTag.get(t);
98
+ if (bindingsByTag == null)
99
+ break; // One of the tags is not found
100
+ filter = (filter !== null && filter !== void 0 ? filter : binding_filter_1.filterByTag(tag));
101
+ const matched = new Set(Array.from(bindingsByTag).filter(filter));
102
+ if (!union && matched.size === 0)
103
+ break; // One of the tag name/value is not found
104
+ if (bindings == null) {
105
+ // First set of bindings matching the tag
106
+ bindings = matched;
107
+ }
108
+ else {
109
+ if (union) {
110
+ matched.forEach(b => { var _a; return (_a = bindings) === null || _a === void 0 ? void 0 : _a.add(b); });
111
+ }
112
+ else {
113
+ // Now need to find intersected bindings against visited tags
114
+ const intersection = new Set();
115
+ bindings.forEach(b => {
116
+ if (matched.has(b)) {
117
+ intersection.add(b);
118
+ }
119
+ });
120
+ bindings = intersection;
121
+ }
122
+ if (!union && bindings.size === 0)
123
+ break;
124
+ }
125
+ }
126
+ return bindings == null ? [] : Array.from(bindings);
127
+ }
128
+ close() {
129
+ this.context.removeListener('bind', this.tagIndexListener);
130
+ this.context.removeListener('unbind', this.tagIndexListener);
131
+ }
132
+ }
133
+ exports.ContextTagIndexer = ContextTagIndexer;
134
+ //# sourceMappingURL=context-tag-indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-tag-indexer.js","sourceRoot":"","sources":["../src/context-tag-indexer.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@ import { Binding } from './binding';
4
4
  import { BindingFilter } from './binding-filter';
5
5
  import { BindingComparator } from './binding-sorter';
6
6
  import { Context } from './context';
7
- import { ContextEventType, ContextObserver, Subscription } from './context-observer';
7
+ import { ContextEventType, ContextObserver } from './context-observer';
8
+ import { Subscription } from './context-subscription';
8
9
  import { Getter } from './inject';
9
10
  import { ResolutionSession } from './resolution-session';
10
11
  import { ValueOrPromise } from './value-promise';
@@ -1 +1 @@
1
- {"version":3,"file":"context-view.js","sourceRoot":"","sources":["../src/context-view.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"context-view.js","sourceRoot":"","sources":["../src/context-view.ts"],"names":[],"mappings":"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"}