1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 | import {
|
7 | Binding,
|
8 | BindingSpec,
|
9 | BindingTagFilter,
|
10 | Constructor,
|
11 | filterByTag,
|
12 | injectable,
|
13 | ValueOrPromise,
|
14 | } from '@loopback/context';
|
15 | import {CoreTags} from './keys';
|
16 |
|
17 |
|
18 |
|
19 |
|
20 | export interface LifeCycleObserver {
|
21 | |
22 |
|
23 |
|
24 |
|
25 | init?(...injectedArgs: unknown[]): ValueOrPromise<void>;
|
26 | |
27 |
|
28 |
|
29 | start?(...injectedArgs: unknown[]): ValueOrPromise<void>;
|
30 | |
31 |
|
32 |
|
33 | stop?(...injectedArgs: unknown[]): ValueOrPromise<void>;
|
34 | }
|
35 |
|
36 | const lifeCycleMethods: (keyof LifeCycleObserver)[] = ['init', 'start', 'stop'];
|
37 |
|
38 |
|
39 |
|
40 |
|
41 |
|
42 | export function isLifeCycleObserver(obj: object): obj is LifeCycleObserver {
|
43 | const candidate = obj as Partial<LifeCycleObserver>;
|
44 | return lifeCycleMethods.some(m => typeof candidate[m] === 'function');
|
45 | }
|
46 |
|
47 |
|
48 |
|
49 |
|
50 |
|
51 | export function isLifeCycleObserverClass(
|
52 | ctor: Constructor<unknown>,
|
53 | ): ctor is Constructor<LifeCycleObserver> {
|
54 | return ctor.prototype && isLifeCycleObserver(ctor.prototype);
|
55 | }
|
56 |
|
57 |
|
58 |
|
59 |
|
60 |
|
61 |
|
62 |
|
63 | export function asLifeCycleObserver<T = unknown>(binding: Binding<T>) {
|
64 | return binding.tag(CoreTags.LIFE_CYCLE_OBSERVER);
|
65 | }
|
66 |
|
67 |
|
68 |
|
69 |
|
70 |
|
71 | export const lifeCycleObserverFilter: BindingTagFilter = filterByTag(
|
72 | CoreTags.LIFE_CYCLE_OBSERVER,
|
73 | );
|
74 |
|
75 |
|
76 |
|
77 |
|
78 |
|
79 |
|
80 | export function lifeCycleObserver(group = '', ...specs: BindingSpec[]) {
|
81 | return injectable(
|
82 | asLifeCycleObserver,
|
83 | {
|
84 | tags: {
|
85 | [CoreTags.LIFE_CYCLE_OBSERVER_GROUP]: group,
|
86 | },
|
87 | },
|
88 | ...specs,
|
89 | );
|
90 | }
|