@loopback/context 4.0.0-alpha.7 → 4.0.1
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.
- package/LICENSE +25 -0
- package/README.md +116 -0
- package/dist/binding-config.d.ts +40 -0
- package/dist/binding-config.js +33 -0
- package/dist/binding-config.js.map +1 -0
- package/dist/binding-decorator.d.ts +45 -0
- package/dist/binding-decorator.js +118 -0
- package/dist/binding-decorator.js.map +1 -0
- package/dist/binding-filter.d.ts +108 -0
- package/dist/binding-filter.js +162 -0
- package/dist/binding-filter.js.map +1 -0
- package/dist/binding-inspector.d.ts +150 -0
- package/dist/binding-inspector.js +249 -0
- package/dist/binding-inspector.js.map +1 -0
- package/dist/binding-key.d.ts +66 -0
- package/dist/binding-key.js +121 -0
- package/dist/binding-key.js.map +1 -0
- package/dist/binding-sorter.d.ts +71 -0
- package/dist/binding-sorter.js +89 -0
- package/dist/binding-sorter.js.map +1 -0
- package/dist/binding.d.ts +577 -0
- package/dist/binding.js +788 -0
- package/dist/binding.js.map +1 -0
- package/dist/context-event.d.ts +23 -0
- package/dist/context-event.js +7 -0
- package/dist/context-event.js.map +1 -0
- package/dist/context-observer.d.ts +36 -0
- package/dist/context-observer.js +7 -0
- package/dist/context-observer.js.map +1 -0
- package/dist/context-subscription.d.ts +147 -0
- package/dist/context-subscription.js +317 -0
- package/dist/context-subscription.js.map +1 -0
- package/dist/context-tag-indexer.d.ts +42 -0
- package/dist/context-tag-indexer.js +135 -0
- package/dist/context-tag-indexer.js.map +1 -0
- package/dist/context-view.d.ts +209 -0
- package/dist/context-view.js +240 -0
- package/dist/context-view.js.map +1 -0
- package/dist/context.d.ts +513 -0
- package/dist/context.js +717 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.js +60 -0
- package/dist/index.js.map +1 -0
- package/dist/inject-config.d.ts +67 -0
- package/dist/inject-config.js +181 -0
- package/dist/inject-config.js.map +1 -0
- package/dist/inject.d.ts +250 -0
- package/dist/inject.js +535 -0
- package/dist/inject.js.map +1 -0
- package/dist/interception-proxy.d.ts +76 -0
- package/dist/interception-proxy.js +67 -0
- package/dist/interception-proxy.js.map +1 -0
- package/dist/interceptor-chain.d.ts +121 -0
- package/dist/interceptor-chain.js +148 -0
- package/dist/interceptor-chain.js.map +1 -0
- package/dist/interceptor.d.ts +138 -0
- package/dist/interceptor.js +299 -0
- package/dist/interceptor.js.map +1 -0
- package/dist/invocation.d.ts +101 -0
- package/dist/invocation.js +163 -0
- package/dist/invocation.js.map +1 -0
- package/dist/json-types.d.ts +28 -0
- package/dist/json-types.js +7 -0
- package/dist/json-types.js.map +1 -0
- package/dist/keys.d.ts +65 -0
- package/dist/keys.js +74 -0
- package/dist/keys.js.map +1 -0
- package/dist/provider.d.ts +31 -0
- package/dist/provider.js +7 -0
- package/dist/provider.js.map +1 -0
- package/dist/resolution-session.d.ts +180 -0
- package/dist/resolution-session.js +274 -0
- package/dist/resolution-session.js.map +1 -0
- package/dist/resolver.d.ts +46 -0
- package/dist/resolver.js +203 -0
- package/dist/resolver.js.map +1 -0
- package/dist/unique-id.d.ts +14 -0
- package/dist/unique-id.js +26 -0
- package/dist/unique-id.js.map +1 -0
- package/dist/value-promise.d.ts +134 -0
- package/dist/value-promise.js +277 -0
- package/dist/value-promise.js.map +1 -0
- package/package.json +49 -35
- package/src/binding-config.ts +73 -0
- package/src/binding-decorator.ts +136 -0
- package/src/binding-filter.ts +250 -0
- package/src/binding-inspector.ts +371 -0
- package/src/binding-key.ts +136 -0
- package/src/binding-sorter.ts +124 -0
- package/src/binding.ts +1107 -0
- package/src/context-event.ts +30 -0
- package/src/context-observer.ts +50 -0
- package/src/context-subscription.ts +402 -0
- package/src/context-tag-indexer.ts +147 -0
- package/src/context-view.ts +440 -0
- package/src/context.ts +1079 -0
- package/src/index.ts +58 -0
- package/src/inject-config.ts +239 -0
- package/src/inject.ts +796 -0
- package/src/interception-proxy.ts +127 -0
- package/src/interceptor-chain.ts +268 -0
- package/src/interceptor.ts +430 -0
- package/src/invocation.ts +269 -0
- package/src/json-types.ts +35 -0
- package/src/keys.ts +85 -0
- package/src/provider.ts +37 -0
- package/src/resolution-session.ts +414 -0
- package/src/resolver.ts +282 -0
- package/src/unique-id.ts +24 -0
- package/src/value-promise.ts +318 -0
- package/index.d.ts +0 -6
- package/index.js +0 -9
- package/lib/binding.d.ts +0 -75
- package/lib/binding.js +0 -102
- package/lib/context.d.ts +0 -14
- package/lib/context.js +0 -96
- package/lib/index.d.ts +0 -5
- package/lib/index.js +0 -13
- package/lib/inject.d.ts +0 -47
- package/lib/inject.js +0 -73
- package/lib/isPromise.d.ts +0 -1
- package/lib/isPromise.js +0 -14
- package/lib/resolver.d.ts +0 -30
- package/lib/resolver.js +0 -128
- package/lib6/binding.d.ts +0 -75
- package/lib6/binding.js +0 -102
- package/lib6/context.d.ts +0 -14
- package/lib6/context.js +0 -96
- package/lib6/index.d.ts +0 -5
- package/lib6/index.js +0 -13
- package/lib6/inject.d.ts +0 -47
- package/lib6/inject.js +0 -73
- package/lib6/isPromise.d.ts +0 -1
- package/lib6/isPromise.js +0 -14
- package/lib6/resolver.d.ts +0 -30
- package/lib6/resolver.js +0 -128
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright IBM Corp. 2019,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
|
+
exports.registerInterceptor = exports.invokeMethodWithInterceptors = exports.intercept = exports.INTERCEPT_CLASS_KEY = exports.mergeInterceptors = exports.INTERCEPT_METHOD_KEY = exports.globalInterceptor = exports.asGlobalInterceptor = exports.InterceptedInvocationContext = void 0;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
9
|
+
const metadata_1 = require("@loopback/metadata");
|
|
10
|
+
const assert_1 = (0, tslib_1.__importDefault)(require("assert"));
|
|
11
|
+
const debug_1 = (0, tslib_1.__importDefault)(require("debug"));
|
|
12
|
+
const binding_decorator_1 = require("./binding-decorator");
|
|
13
|
+
const binding_inspector_1 = require("./binding-inspector");
|
|
14
|
+
const binding_key_1 = require("./binding-key");
|
|
15
|
+
const binding_sorter_1 = require("./binding-sorter");
|
|
16
|
+
const interceptor_chain_1 = require("./interceptor-chain");
|
|
17
|
+
const invocation_1 = require("./invocation");
|
|
18
|
+
const keys_1 = require("./keys");
|
|
19
|
+
const value_promise_1 = require("./value-promise");
|
|
20
|
+
const debug = (0, debug_1.default)('loopback:context:interceptor');
|
|
21
|
+
/**
|
|
22
|
+
* A specialized InvocationContext for interceptors
|
|
23
|
+
*/
|
|
24
|
+
class InterceptedInvocationContext extends invocation_1.InvocationContext {
|
|
25
|
+
/**
|
|
26
|
+
* Discover all binding keys for global interceptors (tagged by
|
|
27
|
+
* ContextTags.GLOBAL_INTERCEPTOR)
|
|
28
|
+
*/
|
|
29
|
+
getGlobalInterceptorBindingKeys() {
|
|
30
|
+
let bindings = this.findByTag(keys_1.ContextTags.GLOBAL_INTERCEPTOR);
|
|
31
|
+
bindings = bindings.filter(binding =>
|
|
32
|
+
// Only include interceptors that match the source type of the invocation
|
|
33
|
+
this.applicableTo(binding));
|
|
34
|
+
this.sortGlobalInterceptorBindings(bindings);
|
|
35
|
+
const keys = bindings.map(b => b.key);
|
|
36
|
+
debug('Global interceptor binding keys:', keys);
|
|
37
|
+
return keys;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Check if the binding for a global interceptor matches the source type
|
|
41
|
+
* of the invocation
|
|
42
|
+
* @param binding - Binding
|
|
43
|
+
*/
|
|
44
|
+
applicableTo(binding) {
|
|
45
|
+
var _a;
|
|
46
|
+
const sourceType = (_a = this.source) === null || _a === void 0 ? void 0 : _a.type;
|
|
47
|
+
// Unknown source type, always apply
|
|
48
|
+
if (sourceType == null)
|
|
49
|
+
return true;
|
|
50
|
+
const allowedSource = binding.tagMap[keys_1.ContextTags.GLOBAL_INTERCEPTOR_SOURCE];
|
|
51
|
+
return (
|
|
52
|
+
// No tag, always apply
|
|
53
|
+
allowedSource == null ||
|
|
54
|
+
// source matched
|
|
55
|
+
allowedSource === sourceType ||
|
|
56
|
+
// source included in the string[]
|
|
57
|
+
(Array.isArray(allowedSource) && allowedSource.includes(sourceType)));
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Sort global interceptor bindings by `globalInterceptorGroup` tags
|
|
61
|
+
* @param bindings - An array of global interceptor bindings
|
|
62
|
+
*/
|
|
63
|
+
sortGlobalInterceptorBindings(bindings) {
|
|
64
|
+
var _a;
|
|
65
|
+
// Get predefined ordered groups for global interceptors
|
|
66
|
+
const orderedGroups = (_a = this.getSync(keys_1.ContextBindings.GLOBAL_INTERCEPTOR_ORDERED_GROUPS, {
|
|
67
|
+
optional: true,
|
|
68
|
+
})) !== null && _a !== void 0 ? _a : [];
|
|
69
|
+
return (0, binding_sorter_1.sortBindingsByPhase)(bindings, keys_1.ContextTags.GLOBAL_INTERCEPTOR_GROUP, orderedGroups);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Load all interceptors for the given invocation context. It adds
|
|
73
|
+
* interceptors from possibly three sources:
|
|
74
|
+
* 1. method level `@intercept`
|
|
75
|
+
* 2. class level `@intercept`
|
|
76
|
+
* 3. global interceptors discovered in the context
|
|
77
|
+
*/
|
|
78
|
+
loadInterceptors() {
|
|
79
|
+
var _a, _b;
|
|
80
|
+
let interceptors = (_a = metadata_1.MetadataInspector.getMethodMetadata(exports.INTERCEPT_METHOD_KEY, this.target, this.methodName)) !== null && _a !== void 0 ? _a : [];
|
|
81
|
+
const targetClass = typeof this.target === 'function' ? this.target : this.target.constructor;
|
|
82
|
+
const classInterceptors = (_b = metadata_1.MetadataInspector.getClassMetadata(exports.INTERCEPT_CLASS_KEY, targetClass)) !== null && _b !== void 0 ? _b : [];
|
|
83
|
+
// Inserting class level interceptors before method level ones
|
|
84
|
+
interceptors = mergeInterceptors(classInterceptors, interceptors);
|
|
85
|
+
const globalInterceptors = this.getGlobalInterceptorBindingKeys();
|
|
86
|
+
// Inserting global interceptors
|
|
87
|
+
interceptors = mergeInterceptors(globalInterceptors, interceptors);
|
|
88
|
+
debug('Interceptors for %s', this.targetName, interceptors);
|
|
89
|
+
return interceptors;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
exports.InterceptedInvocationContext = InterceptedInvocationContext;
|
|
93
|
+
/**
|
|
94
|
+
* The `BindingTemplate` function to configure a binding as a global interceptor
|
|
95
|
+
* by tagging it with `ContextTags.INTERCEPTOR`
|
|
96
|
+
* @param group - Group for ordering the interceptor
|
|
97
|
+
*/
|
|
98
|
+
function asGlobalInterceptor(group) {
|
|
99
|
+
return binding => {
|
|
100
|
+
binding
|
|
101
|
+
// Tagging with `GLOBAL_INTERCEPTOR` is required.
|
|
102
|
+
.tag(keys_1.ContextTags.GLOBAL_INTERCEPTOR)
|
|
103
|
+
// `GLOBAL_INTERCEPTOR_NAMESPACE` is to make the binding key more readable.
|
|
104
|
+
.tag({ [keys_1.ContextTags.NAMESPACE]: keys_1.GLOBAL_INTERCEPTOR_NAMESPACE });
|
|
105
|
+
if (group)
|
|
106
|
+
binding.tag({ [keys_1.ContextTags.GLOBAL_INTERCEPTOR_GROUP]: group });
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
exports.asGlobalInterceptor = asGlobalInterceptor;
|
|
110
|
+
/**
|
|
111
|
+
* `@globalInterceptor` decorator to mark the class as a global interceptor
|
|
112
|
+
* @param group - Group for ordering the interceptor
|
|
113
|
+
* @param specs - Extra binding specs
|
|
114
|
+
*/
|
|
115
|
+
function globalInterceptor(group, ...specs) {
|
|
116
|
+
return (0, binding_decorator_1.injectable)(asGlobalInterceptor(group), ...specs);
|
|
117
|
+
}
|
|
118
|
+
exports.globalInterceptor = globalInterceptor;
|
|
119
|
+
/**
|
|
120
|
+
* Metadata key for method-level interceptors
|
|
121
|
+
*/
|
|
122
|
+
exports.INTERCEPT_METHOD_KEY = metadata_1.MetadataAccessor.create('intercept:method');
|
|
123
|
+
/**
|
|
124
|
+
* Adding interceptors from the spec to the front of existing ones. Duplicate
|
|
125
|
+
* entries are eliminated from the spec side.
|
|
126
|
+
*
|
|
127
|
+
* For example:
|
|
128
|
+
*
|
|
129
|
+
* - [log] + [cache, log] => [cache, log]
|
|
130
|
+
* - [log] + [log, cache] => [log, cache]
|
|
131
|
+
* - [] + [cache, log] => [cache, log]
|
|
132
|
+
* - [cache, log] + [] => [cache, log]
|
|
133
|
+
* - [log] + [cache] => [log, cache]
|
|
134
|
+
*
|
|
135
|
+
* @param interceptorsFromSpec - Interceptors from `@intercept`
|
|
136
|
+
* @param existingInterceptors - Interceptors already applied for the method
|
|
137
|
+
*/
|
|
138
|
+
function mergeInterceptors(interceptorsFromSpec, existingInterceptors) {
|
|
139
|
+
const interceptorsToApply = new Set(interceptorsFromSpec);
|
|
140
|
+
const appliedInterceptors = new Set(existingInterceptors);
|
|
141
|
+
// Remove interceptors that already exist
|
|
142
|
+
for (const i of interceptorsToApply) {
|
|
143
|
+
if (appliedInterceptors.has(i)) {
|
|
144
|
+
interceptorsToApply.delete(i);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Add existing interceptors after ones from the spec
|
|
148
|
+
for (const i of appliedInterceptors) {
|
|
149
|
+
interceptorsToApply.add(i);
|
|
150
|
+
}
|
|
151
|
+
return Array.from(interceptorsToApply);
|
|
152
|
+
}
|
|
153
|
+
exports.mergeInterceptors = mergeInterceptors;
|
|
154
|
+
/**
|
|
155
|
+
* Metadata key for method-level interceptors
|
|
156
|
+
*/
|
|
157
|
+
exports.INTERCEPT_CLASS_KEY = metadata_1.MetadataAccessor.create('intercept:class');
|
|
158
|
+
/**
|
|
159
|
+
* A factory to define `@intercept` for classes. It allows `@intercept` to be
|
|
160
|
+
* used multiple times on the same class.
|
|
161
|
+
*/
|
|
162
|
+
class InterceptClassDecoratorFactory extends metadata_1.ClassDecoratorFactory {
|
|
163
|
+
mergeWithOwn(ownMetadata, target) {
|
|
164
|
+
ownMetadata = ownMetadata || [];
|
|
165
|
+
return mergeInterceptors(this.spec, ownMetadata);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* A factory to define `@intercept` for methods. It allows `@intercept` to be
|
|
170
|
+
* used multiple times on the same method.
|
|
171
|
+
*/
|
|
172
|
+
class InterceptMethodDecoratorFactory extends metadata_1.MethodDecoratorFactory {
|
|
173
|
+
mergeWithOwn(ownMetadata, target, methodName, methodDescriptor) {
|
|
174
|
+
ownMetadata = ownMetadata || {};
|
|
175
|
+
const interceptors = ownMetadata[methodName] || [];
|
|
176
|
+
// Adding interceptors to the list
|
|
177
|
+
ownMetadata[methodName] = mergeInterceptors(this.spec, interceptors);
|
|
178
|
+
return ownMetadata;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Decorator function `@intercept` for classes/methods to apply interceptors. It
|
|
183
|
+
* can be applied on a class and its public methods. Multiple occurrences of
|
|
184
|
+
* `@intercept` are allowed on the same target class or method. The decorator
|
|
185
|
+
* takes a list of `interceptor` functions or binding keys.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```ts
|
|
189
|
+
* @intercept(log, metrics)
|
|
190
|
+
* class MyController {
|
|
191
|
+
* @intercept('caching-interceptor')
|
|
192
|
+
* @intercept('name-validation-interceptor')
|
|
193
|
+
* greet(name: string) {
|
|
194
|
+
* return `Hello, ${name}`;
|
|
195
|
+
* }
|
|
196
|
+
* }
|
|
197
|
+
* ```
|
|
198
|
+
*
|
|
199
|
+
* @param interceptorOrKeys - One or more interceptors or binding keys that are
|
|
200
|
+
* resolved to be interceptors
|
|
201
|
+
*/
|
|
202
|
+
function intercept(...interceptorOrKeys) {
|
|
203
|
+
return function interceptDecoratorForClassOrMethod(
|
|
204
|
+
// Class or a prototype
|
|
205
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
206
|
+
target, method,
|
|
207
|
+
// Use `any` to for `TypedPropertyDescriptor`
|
|
208
|
+
// See https://github.com/loopbackio/loopback-next/pull/2704
|
|
209
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
210
|
+
methodDescriptor) {
|
|
211
|
+
if (method && methodDescriptor) {
|
|
212
|
+
// Method
|
|
213
|
+
return InterceptMethodDecoratorFactory.createDecorator(exports.INTERCEPT_METHOD_KEY, interceptorOrKeys, { decoratorName: '@intercept' })(target, method, methodDescriptor);
|
|
214
|
+
}
|
|
215
|
+
if (typeof target === 'function' && !method && !methodDescriptor) {
|
|
216
|
+
// Class
|
|
217
|
+
return InterceptClassDecoratorFactory.createDecorator(exports.INTERCEPT_CLASS_KEY, interceptorOrKeys, { decoratorName: '@intercept' })(target);
|
|
218
|
+
}
|
|
219
|
+
// Not on a class or method
|
|
220
|
+
throw new Error('@intercept cannot be used on a property: ' +
|
|
221
|
+
metadata_1.DecoratorFactory.getTargetName(target, method, methodDescriptor));
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
exports.intercept = intercept;
|
|
225
|
+
/**
|
|
226
|
+
* Invoke a method with the given context
|
|
227
|
+
* @param context - Context object
|
|
228
|
+
* @param target - Target class (for static methods) or object (for instance methods)
|
|
229
|
+
* @param methodName - Method name
|
|
230
|
+
* @param args - An array of argument values
|
|
231
|
+
* @param options - Options for the invocation
|
|
232
|
+
*/
|
|
233
|
+
function invokeMethodWithInterceptors(context, target, methodName, args, options = {}) {
|
|
234
|
+
// Do not allow `skipInterceptors` as it's against the function name
|
|
235
|
+
// `invokeMethodWithInterceptors`
|
|
236
|
+
(0, assert_1.default)(!options.skipInterceptors, 'skipInterceptors is not allowed');
|
|
237
|
+
const invocationCtx = new InterceptedInvocationContext(context, target, methodName, args, options.source);
|
|
238
|
+
invocationCtx.assertMethodExists();
|
|
239
|
+
return (0, value_promise_1.tryWithFinally)(() => {
|
|
240
|
+
const interceptors = invocationCtx.loadInterceptors();
|
|
241
|
+
const targetMethodInvoker = () => invocationCtx.invokeTargetMethod(options);
|
|
242
|
+
interceptors.push(targetMethodInvoker);
|
|
243
|
+
return (0, interceptor_chain_1.invokeInterceptors)(invocationCtx, interceptors);
|
|
244
|
+
}, () => invocationCtx.close());
|
|
245
|
+
}
|
|
246
|
+
exports.invokeMethodWithInterceptors = invokeMethodWithInterceptors;
|
|
247
|
+
/**
|
|
248
|
+
* Register an interceptor function or provider class to the given context
|
|
249
|
+
* @param ctx - Context object
|
|
250
|
+
* @param interceptor - An interceptor function or provider class
|
|
251
|
+
* @param options - Options for the interceptor binding
|
|
252
|
+
*/
|
|
253
|
+
function registerInterceptor(ctx, interceptor, options = {}) {
|
|
254
|
+
var _a, _b, _c;
|
|
255
|
+
let { global } = options;
|
|
256
|
+
const { group, source } = options;
|
|
257
|
+
if (group != null || source != null) {
|
|
258
|
+
// If group or source is set, assuming global
|
|
259
|
+
global = global !== false;
|
|
260
|
+
}
|
|
261
|
+
const namespace = ((_b = (_a = options.namespace) !== null && _a !== void 0 ? _a : options.defaultNamespace) !== null && _b !== void 0 ? _b : global)
|
|
262
|
+
? keys_1.GLOBAL_INTERCEPTOR_NAMESPACE
|
|
263
|
+
: keys_1.LOCAL_INTERCEPTOR_NAMESPACE;
|
|
264
|
+
let binding;
|
|
265
|
+
if ((0, binding_inspector_1.isProviderClass)(interceptor)) {
|
|
266
|
+
binding = (0, binding_inspector_1.createBindingFromClass)(interceptor, {
|
|
267
|
+
defaultNamespace: namespace,
|
|
268
|
+
...options,
|
|
269
|
+
});
|
|
270
|
+
if (binding.tagMap[keys_1.ContextTags.GLOBAL_INTERCEPTOR]) {
|
|
271
|
+
global = true;
|
|
272
|
+
}
|
|
273
|
+
ctx.add(binding);
|
|
274
|
+
}
|
|
275
|
+
else {
|
|
276
|
+
let key = options.key;
|
|
277
|
+
if (!key) {
|
|
278
|
+
const name = (_c = options.name) !== null && _c !== void 0 ? _c : interceptor.name;
|
|
279
|
+
if (!name) {
|
|
280
|
+
key = binding_key_1.BindingKey.generate(namespace).key;
|
|
281
|
+
}
|
|
282
|
+
else {
|
|
283
|
+
key = `${namespace}.${name}`;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
binding = ctx
|
|
287
|
+
.bind(key)
|
|
288
|
+
.to(interceptor);
|
|
289
|
+
}
|
|
290
|
+
if (global) {
|
|
291
|
+
binding.apply(asGlobalInterceptor(group));
|
|
292
|
+
if (source) {
|
|
293
|
+
binding.tag({ [keys_1.ContextTags.GLOBAL_INTERCEPTOR_SOURCE]: source });
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return binding;
|
|
297
|
+
}
|
|
298
|
+
exports.registerInterceptor = registerInterceptor;
|
|
299
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../src/interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { Context } from './context';
|
|
2
|
+
import { ResolutionSession } from './resolution-session';
|
|
3
|
+
import { ValueOrPromise } from './value-promise';
|
|
4
|
+
/**
|
|
5
|
+
* Return value for a method invocation
|
|
6
|
+
*/
|
|
7
|
+
export declare type InvocationResult = any;
|
|
8
|
+
/**
|
|
9
|
+
* Array of arguments for a method invocation
|
|
10
|
+
*/
|
|
11
|
+
export declare type InvocationArgs = any[];
|
|
12
|
+
/**
|
|
13
|
+
* An interface to represent the caller of the invocation
|
|
14
|
+
*/
|
|
15
|
+
export interface InvocationSource<T = unknown> {
|
|
16
|
+
/**
|
|
17
|
+
* Type of the invoker, such as `proxy` and `route`
|
|
18
|
+
*/
|
|
19
|
+
readonly type: string;
|
|
20
|
+
/**
|
|
21
|
+
* Metadata for the source, such as `ResolutionSession`
|
|
22
|
+
*/
|
|
23
|
+
readonly value: T;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* InvocationContext represents the context to invoke interceptors for a method.
|
|
27
|
+
* The context can be used to access metadata about the invocation as well as
|
|
28
|
+
* other dependencies.
|
|
29
|
+
*/
|
|
30
|
+
export declare class InvocationContext extends Context {
|
|
31
|
+
readonly target: object;
|
|
32
|
+
readonly methodName: string;
|
|
33
|
+
readonly args: InvocationArgs;
|
|
34
|
+
readonly source?: InvocationSource<unknown> | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Construct a new instance of `InvocationContext`
|
|
37
|
+
* @param parent - Parent context, such as the RequestContext
|
|
38
|
+
* @param target - Target class (for static methods) or prototype/object
|
|
39
|
+
* (for instance methods)
|
|
40
|
+
* @param methodName - Method name
|
|
41
|
+
* @param args - An array of arguments
|
|
42
|
+
*/
|
|
43
|
+
constructor(parent: Context, target: object, methodName: string, args: InvocationArgs, source?: InvocationSource<unknown> | undefined);
|
|
44
|
+
/**
|
|
45
|
+
* The target class, such as `OrderController`
|
|
46
|
+
*/
|
|
47
|
+
get targetClass(): Function;
|
|
48
|
+
/**
|
|
49
|
+
* The target name, such as `OrderController.prototype.cancelOrder`
|
|
50
|
+
*/
|
|
51
|
+
get targetName(): string;
|
|
52
|
+
/**
|
|
53
|
+
* Description of the invocation
|
|
54
|
+
*/
|
|
55
|
+
get description(): string;
|
|
56
|
+
toString(): string;
|
|
57
|
+
/**
|
|
58
|
+
* Assert the method exists on the target. An error will be thrown if otherwise.
|
|
59
|
+
* @param context - Invocation context
|
|
60
|
+
*/
|
|
61
|
+
assertMethodExists(): Record<string, Function>;
|
|
62
|
+
/**
|
|
63
|
+
* Invoke the target method with the given context
|
|
64
|
+
* @param context - Invocation context
|
|
65
|
+
* @param options - Options for the invocation
|
|
66
|
+
*/
|
|
67
|
+
invokeTargetMethod(options?: InvocationOptions): any;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Options to control invocations
|
|
71
|
+
*/
|
|
72
|
+
export declare type InvocationOptions = {
|
|
73
|
+
/**
|
|
74
|
+
* Skip dependency injection on method parameters
|
|
75
|
+
*/
|
|
76
|
+
skipParameterInjection?: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Skip invocation of interceptors
|
|
79
|
+
*/
|
|
80
|
+
skipInterceptors?: boolean;
|
|
81
|
+
/**
|
|
82
|
+
* Information about the source object that makes the invocation. For REST,
|
|
83
|
+
* it's a `Route`. For injected proxies, it's a `Binding`.
|
|
84
|
+
*/
|
|
85
|
+
source?: InvocationSource;
|
|
86
|
+
/**
|
|
87
|
+
* Resolution session
|
|
88
|
+
*/
|
|
89
|
+
session?: ResolutionSession;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Invoke a method using dependency injection. Interceptors are invoked as part
|
|
93
|
+
* of the invocation.
|
|
94
|
+
* @param target - Target of the method, it will be the class for a static
|
|
95
|
+
* method, and instance or class prototype for a prototype method
|
|
96
|
+
* @param method - Name of the method
|
|
97
|
+
* @param ctx - Context object
|
|
98
|
+
* @param nonInjectedArgs - Optional array of args for non-injected parameters
|
|
99
|
+
* @param options - Options for the invocation
|
|
100
|
+
*/
|
|
101
|
+
export declare function invokeMethod(target: object, method: string, ctx: Context, nonInjectedArgs?: InvocationArgs, options?: InvocationOptions): ValueOrPromise<InvocationResult>;
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Copyright IBM Corp. 2019,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
|
+
exports.invokeMethod = exports.InvocationContext = void 0;
|
|
8
|
+
const tslib_1 = require("tslib");
|
|
9
|
+
const metadata_1 = require("@loopback/metadata");
|
|
10
|
+
const assert_1 = (0, tslib_1.__importDefault)(require("assert"));
|
|
11
|
+
const debug_1 = (0, tslib_1.__importDefault)(require("debug"));
|
|
12
|
+
const context_1 = require("./context");
|
|
13
|
+
const interceptor_1 = require("./interceptor");
|
|
14
|
+
const resolver_1 = require("./resolver");
|
|
15
|
+
const value_promise_1 = require("./value-promise");
|
|
16
|
+
const debug = (0, debug_1.default)('loopback:context:invocation');
|
|
17
|
+
const getTargetName = metadata_1.DecoratorFactory.getTargetName;
|
|
18
|
+
/**
|
|
19
|
+
* InvocationContext represents the context to invoke interceptors for a method.
|
|
20
|
+
* The context can be used to access metadata about the invocation as well as
|
|
21
|
+
* other dependencies.
|
|
22
|
+
*/
|
|
23
|
+
class InvocationContext extends context_1.Context {
|
|
24
|
+
/**
|
|
25
|
+
* Construct a new instance of `InvocationContext`
|
|
26
|
+
* @param parent - Parent context, such as the RequestContext
|
|
27
|
+
* @param target - Target class (for static methods) or prototype/object
|
|
28
|
+
* (for instance methods)
|
|
29
|
+
* @param methodName - Method name
|
|
30
|
+
* @param args - An array of arguments
|
|
31
|
+
*/
|
|
32
|
+
constructor(parent, target, methodName, args, source) {
|
|
33
|
+
super(parent);
|
|
34
|
+
this.target = target;
|
|
35
|
+
this.methodName = methodName;
|
|
36
|
+
this.args = args;
|
|
37
|
+
this.source = source;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* The target class, such as `OrderController`
|
|
41
|
+
*/
|
|
42
|
+
get targetClass() {
|
|
43
|
+
return typeof this.target === 'function'
|
|
44
|
+
? this.target
|
|
45
|
+
: this.target.constructor;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* The target name, such as `OrderController.prototype.cancelOrder`
|
|
49
|
+
*/
|
|
50
|
+
get targetName() {
|
|
51
|
+
return getTargetName(this.target, this.methodName);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Description of the invocation
|
|
55
|
+
*/
|
|
56
|
+
get description() {
|
|
57
|
+
const source = this.source == null ? '' : `${this.source} => `;
|
|
58
|
+
return `InvocationContext(${this.name}): ${source}${this.targetName}`;
|
|
59
|
+
}
|
|
60
|
+
toString() {
|
|
61
|
+
return this.description;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Assert the method exists on the target. An error will be thrown if otherwise.
|
|
65
|
+
* @param context - Invocation context
|
|
66
|
+
*/
|
|
67
|
+
assertMethodExists() {
|
|
68
|
+
const targetWithMethods = this.target;
|
|
69
|
+
if (typeof targetWithMethods[this.methodName] !== 'function') {
|
|
70
|
+
const targetName = getTargetName(this.target, this.methodName);
|
|
71
|
+
(0, assert_1.default)(false, `Method ${targetName} not found`);
|
|
72
|
+
}
|
|
73
|
+
return targetWithMethods;
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Invoke the target method with the given context
|
|
77
|
+
* @param context - Invocation context
|
|
78
|
+
* @param options - Options for the invocation
|
|
79
|
+
*/
|
|
80
|
+
invokeTargetMethod(options = { skipParameterInjection: true }) {
|
|
81
|
+
const targetWithMethods = this.assertMethodExists();
|
|
82
|
+
if (!options.skipParameterInjection) {
|
|
83
|
+
return invokeTargetMethodWithInjection(this, targetWithMethods, this.methodName, this.args, options.session);
|
|
84
|
+
}
|
|
85
|
+
return invokeTargetMethod(this, targetWithMethods, this.methodName, this.args);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
exports.InvocationContext = InvocationContext;
|
|
89
|
+
/**
|
|
90
|
+
* Invoke a method using dependency injection. Interceptors are invoked as part
|
|
91
|
+
* of the invocation.
|
|
92
|
+
* @param target - Target of the method, it will be the class for a static
|
|
93
|
+
* method, and instance or class prototype for a prototype method
|
|
94
|
+
* @param method - Name of the method
|
|
95
|
+
* @param ctx - Context object
|
|
96
|
+
* @param nonInjectedArgs - Optional array of args for non-injected parameters
|
|
97
|
+
* @param options - Options for the invocation
|
|
98
|
+
*/
|
|
99
|
+
function invokeMethod(target, method, ctx, nonInjectedArgs = [], options = {}) {
|
|
100
|
+
if (options.skipInterceptors) {
|
|
101
|
+
if (options.skipParameterInjection) {
|
|
102
|
+
// Invoke the target method directly without injection or interception
|
|
103
|
+
return invokeTargetMethod(ctx, target, method, nonInjectedArgs);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
return invokeTargetMethodWithInjection(ctx, target, method, nonInjectedArgs, options.session);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
// Invoke the target method with interception but no injection
|
|
110
|
+
return (0, interceptor_1.invokeMethodWithInterceptors)(ctx, target, method, nonInjectedArgs, options);
|
|
111
|
+
}
|
|
112
|
+
exports.invokeMethod = invokeMethod;
|
|
113
|
+
/**
|
|
114
|
+
* Invoke a method. Method parameter dependency injection is honored.
|
|
115
|
+
* @param target - Target of the method, it will be the class for a static
|
|
116
|
+
* method, and instance or class prototype for a prototype method
|
|
117
|
+
* @param method - Name of the method
|
|
118
|
+
* @param ctx - Context
|
|
119
|
+
* @param nonInjectedArgs - Optional array of args for non-injected parameters
|
|
120
|
+
*/
|
|
121
|
+
function invokeTargetMethodWithInjection(ctx, target, method, nonInjectedArgs, session) {
|
|
122
|
+
const methodName = getTargetName(target, method);
|
|
123
|
+
/* istanbul ignore if */
|
|
124
|
+
if (debug.enabled) {
|
|
125
|
+
debug('Invoking method %s', methodName);
|
|
126
|
+
if (nonInjectedArgs === null || nonInjectedArgs === void 0 ? void 0 : nonInjectedArgs.length) {
|
|
127
|
+
debug('Non-injected arguments:', nonInjectedArgs);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
const argsOrPromise = (0, resolver_1.resolveInjectedArguments)(target, method, ctx, session, nonInjectedArgs);
|
|
131
|
+
const targetWithMethods = target;
|
|
132
|
+
(0, assert_1.default)(typeof targetWithMethods[method] === 'function', `Method ${method} not found`);
|
|
133
|
+
return (0, value_promise_1.transformValueOrPromise)(argsOrPromise, args => {
|
|
134
|
+
/* istanbul ignore if */
|
|
135
|
+
if (debug.enabled) {
|
|
136
|
+
debug('Injected arguments for %s:', methodName, args);
|
|
137
|
+
}
|
|
138
|
+
return invokeTargetMethod(ctx, targetWithMethods, method, args);
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* Invoke the target method
|
|
143
|
+
* @param ctx - Context object
|
|
144
|
+
* @param target - Target class or object
|
|
145
|
+
* @param methodName - Target method name
|
|
146
|
+
* @param args - Arguments
|
|
147
|
+
*/
|
|
148
|
+
function invokeTargetMethod(ctx, // Not used
|
|
149
|
+
target, methodName, args) {
|
|
150
|
+
const targetWithMethods = target;
|
|
151
|
+
/* istanbul ignore if */
|
|
152
|
+
if (debug.enabled) {
|
|
153
|
+
debug('Invoking method %s', getTargetName(target, methodName), args);
|
|
154
|
+
}
|
|
155
|
+
// Invoke the target method
|
|
156
|
+
const result = targetWithMethods[methodName](...args);
|
|
157
|
+
/* istanbul ignore if */
|
|
158
|
+
if (debug.enabled) {
|
|
159
|
+
debug('Method invoked: %s', getTargetName(target, methodName), result);
|
|
160
|
+
}
|
|
161
|
+
return result;
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../src/invocation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definition for JSON types
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* JSON primitive types:
|
|
6
|
+
* - string
|
|
7
|
+
* - number
|
|
8
|
+
* - boolean
|
|
9
|
+
* - null
|
|
10
|
+
*/
|
|
11
|
+
export declare type JSONPrimitive = string | number | boolean | null;
|
|
12
|
+
/**
|
|
13
|
+
* JSON values
|
|
14
|
+
* - primitive
|
|
15
|
+
* - object
|
|
16
|
+
* - array
|
|
17
|
+
*/
|
|
18
|
+
export declare type JSONValue = JSONPrimitive | JSONObject | JSONArray;
|
|
19
|
+
/**
|
|
20
|
+
* JSON object
|
|
21
|
+
*/
|
|
22
|
+
export interface JSONObject extends Record<string, JSONValue> {
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* JSON array
|
|
26
|
+
*/
|
|
27
|
+
export interface JSONArray extends Array<JSONValue> {
|
|
28
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
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
|
+
//# sourceMappingURL=json-types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-types.js","sourceRoot":"","sources":["../src/json-types.ts"],"names":[],"mappings":";AAAA,iDAAiD;AACjD,iCAAiC;AACjC,+CAA+C;AAC/C,gEAAgE"}
|