@adminide-stack/core 7.0.3-alpha.25 → 7.0.3-alpha.27
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/lib/constants/types.js +13 -13
- package/lib/constants/types.js.map +1 -1
- package/lib/constants/urls.js +3 -3
- package/lib/constants/urls.js.map +1 -1
- package/lib/core/configurations/configuration.js +546 -444
- package/lib/core/configurations/configuration.js.map +1 -1
- package/lib/core/configurations/events/ConfigurationChangeEvent.js +52 -49
- package/lib/core/configurations/events/ConfigurationChangeEvent.js.map +1 -1
- package/lib/core/configurations/helpers/configuration.js +138 -149
- package/lib/core/configurations/helpers/configuration.js.map +1 -1
- package/lib/core/configurations/models/ConfigurationModel.js +186 -190
- package/lib/core/configurations/models/ConfigurationModel.js.map +1 -1
- package/lib/core/disposable.js +66 -67
- package/lib/core/disposable.js.map +1 -1
- package/lib/core/event.js +239 -235
- package/lib/core/event.js.map +1 -1
- package/lib/core/organization/configuration.js +15 -15
- package/lib/core/organization/configuration.js.map +1 -1
- package/lib/core/organization/helpers/organization-helpers.js +7 -14
- package/lib/core/organization/helpers/organization-helpers.js.map +1 -1
- package/lib/core/organization/organization.js +132 -113
- package/lib/core/organization/organization.js.map +1 -1
- package/lib/core/path.js +154 -158
- package/lib/core/path.js.map +1 -1
- package/lib/enums/connection-status.js +4 -4
- package/lib/enums/connection-status.js.map +1 -1
- package/lib/enums/integration-configuration-status.js +3 -3
- package/lib/enums/integration-configuration-status.js.map +1 -1
- package/lib/enums/integrations-configuration-steps.js +6 -6
- package/lib/enums/integrations-configuration-steps.js.map +1 -1
- package/lib/enums/integrations-connection-names.js +10 -10
- package/lib/enums/integrations-connection-names.js.map +1 -1
- package/lib/enums/integrations.js +8 -8
- package/lib/enums/integrations.js.map +1 -1
- package/lib/enums/permissions.js +5 -5
- package/lib/enums/permissions.js.map +1 -1
- package/lib/enums/team-member-status.js +2 -2
- package/lib/enums/team-member-status.js.map +1 -1
- package/lib/errors/auth-error-messages.js +22 -22
- package/lib/errors/auth-error-messages.js.map +1 -1
- package/lib/errors/auth-error.js +9 -5
- package/lib/errors/auth-error.js.map +1 -1
- package/lib/interfaces/configuration/configuration.js +30 -30
- package/lib/interfaces/configuration/configuration.js.map +1 -1
- package/lib/interfaces/generated/generated-models.js +15741 -919
- package/lib/interfaces/generated/generated-models.js.map +1 -1
- package/lib/interfaces/organization/organization-context.js +12 -17
- package/lib/interfaces/organization/organization-context.js.map +1 -1
- package/lib/modules/account-api/enums/index.js +64 -64
- package/lib/modules/account-api/enums/index.js.map +1 -1
- package/lib/modules/billing-api/enums/index.js +18 -18
- package/lib/modules/billing-api/enums/index.js.map +1 -1
- package/lib/modules/inbox/enums/index.js +23 -23
- package/lib/modules/inbox/enums/index.js.map +1 -1
- package/lib/services/abstract-configuration.js +113 -116
- package/lib/services/abstract-configuration.js.map +1 -1
- package/lib/services/abstract-organization-context-service.js +97 -93
- package/lib/services/abstract-organization-context-service.js.map +1 -1
- package/lib/utils/configuration-utils.js +8 -8
- package/lib/utils/configuration-utils.js.map +1 -1
- package/lib/utils/date-utils.js +2 -2
- package/lib/utils/date-utils.js.map +1 -1
- package/lib/utils/flatten-utils.js +35 -39
- package/lib/utils/flatten-utils.js.map +1 -1
- package/lib/utils/generate-uri.js +25 -15
- package/lib/utils/generate-uri.js.map +1 -1
- package/lib/utils/generated-settings-id.js +4 -4
- package/lib/utils/generated-settings-id.js.map +1 -1
- package/lib/utils/omit-deep.js +7 -7
- package/lib/utils/omit-deep.js.map +1 -1
- package/lib/utils/roles-utils.js +6 -2
- package/lib/utils/roles-utils.js.map +1 -1
- package/lib/utils/uri.js +10 -12
- package/lib/utils/uri.js.map +1 -1
- package/lib/utils/utils.js +19 -14
- package/lib/utils/utils.js.map +1 -1
- package/lib/utils/validations.js +2 -2
- package/lib/utils/validations.js.map +1 -1
- package/package.json +2 -2
package/lib/core/disposable.js
CHANGED
@@ -1,76 +1,75 @@
|
|
1
1
|
import {Emitter}from'./event.js';/* tslint:disable */
|
2
2
|
var Disposable;
|
3
3
|
(function (Disposable) {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
5
|
+
function is(arg) {
|
6
|
+
return !!arg && typeof arg === 'object' && 'dispose' in arg && typeof arg['dispose'] === 'function';
|
7
|
+
}
|
8
|
+
Disposable.is = is;
|
9
|
+
function create(func) {
|
10
|
+
return {
|
11
|
+
dispose: func
|
12
|
+
};
|
13
|
+
}
|
14
|
+
Disposable.create = create;
|
15
|
+
Disposable.NULL = create(() => {});
|
16
16
|
})(Disposable || (Disposable = {}));
|
17
17
|
class DisposableCollection {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
}
|
35
|
-
}
|
36
|
-
get disposed() {
|
37
|
-
return this.disposables.length === 0;
|
38
|
-
}
|
39
|
-
disposingElements = false;
|
40
|
-
dispose() {
|
41
|
-
if (this.disposed || this.disposingElements) {
|
42
|
-
return;
|
43
|
-
}
|
44
|
-
this.disposingElements = true;
|
45
|
-
while (!this.disposed) {
|
46
|
-
try {
|
47
|
-
this.disposables.pop().dispose();
|
48
|
-
}
|
49
|
-
catch (e) {
|
50
|
-
console.error(e);
|
51
|
-
}
|
52
|
-
}
|
53
|
-
this.disposingElements = false;
|
54
|
-
this.checkDisposed();
|
18
|
+
disposables = [];
|
19
|
+
onDisposeEmitter = new Emitter();
|
20
|
+
constructor(...toDispose) {
|
21
|
+
toDispose.forEach(d => this.push(d));
|
22
|
+
}
|
23
|
+
/**
|
24
|
+
* This event is fired only once
|
25
|
+
* on first dispose of not empty collection.
|
26
|
+
*/
|
27
|
+
get onDispose() {
|
28
|
+
return this.onDisposeEmitter.event;
|
29
|
+
}
|
30
|
+
checkDisposed() {
|
31
|
+
if (this.disposed && !this.disposingElements) {
|
32
|
+
this.onDisposeEmitter.fire(undefined);
|
33
|
+
this.onDisposeEmitter.dispose();
|
55
34
|
}
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
}
|
65
|
-
this.checkDisposed();
|
66
|
-
});
|
67
|
-
disposable.dispose = () => {
|
68
|
-
toRemove.dispose();
|
69
|
-
originalDispose();
|
70
|
-
};
|
71
|
-
return toRemove;
|
35
|
+
}
|
36
|
+
get disposed() {
|
37
|
+
return this.disposables.length === 0;
|
38
|
+
}
|
39
|
+
disposingElements = false;
|
40
|
+
dispose() {
|
41
|
+
if (this.disposed || this.disposingElements) {
|
42
|
+
return;
|
72
43
|
}
|
73
|
-
|
74
|
-
|
44
|
+
this.disposingElements = true;
|
45
|
+
while (!this.disposed) {
|
46
|
+
try {
|
47
|
+
this.disposables.pop().dispose();
|
48
|
+
} catch (e) {
|
49
|
+
console.error(e);
|
50
|
+
}
|
75
51
|
}
|
52
|
+
this.disposingElements = false;
|
53
|
+
this.checkDisposed();
|
54
|
+
}
|
55
|
+
push(disposable) {
|
56
|
+
const disposables = this.disposables;
|
57
|
+
disposables.push(disposable);
|
58
|
+
const originalDispose = disposable.dispose.bind(disposable);
|
59
|
+
const toRemove = Disposable.create(() => {
|
60
|
+
const index = disposables.indexOf(disposable);
|
61
|
+
if (index !== -1) {
|
62
|
+
disposables.splice(index, 1);
|
63
|
+
}
|
64
|
+
this.checkDisposed();
|
65
|
+
});
|
66
|
+
disposable.dispose = () => {
|
67
|
+
toRemove.dispose();
|
68
|
+
originalDispose();
|
69
|
+
};
|
70
|
+
return toRemove;
|
71
|
+
}
|
72
|
+
pushAll(disposables) {
|
73
|
+
return disposables.map(disposable => this.push(disposable));
|
74
|
+
}
|
76
75
|
}export{Disposable,DisposableCollection};//# sourceMappingURL=disposable.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"disposable.js","sources":["../../src/core/disposable.ts"],"sourcesContent":[null],"names":[],"mappings":"iCAAA;AAUM,IAAW,WAWhB;AAXD,CAAA,UAAiB,UAAU,EAAA;;
|
1
|
+
{"version":3,"file":"disposable.js","sources":["../../src/core/disposable.ts"],"sourcesContent":[null],"names":[],"mappings":"iCAAA;AAUM,IAAW,WAWhB;AAXD,CAAA,UAAiB,UAAU,EAAA;;WAEP,EAAA,CAAA,GAAW,EAAA;WAChB,CAAA,CAAA,GAAC,IAAI,eAAc,YAAa,SAAI,IAAS,OAAO,WAAW,eAAc;;AADxE,EAAA,UAAA,CAAA,EAAA;WAGA,MAAA,CAAA,IAAuB,EAAA;WAC5B;AACH,MAAA,OAAA,EAAA,IAAO;;;AAFC,EAAA,UAAA,CAAA,MAAA;YAKC,CAAA,IAAA,GAAA,eAAkB,CAAA,CAAA;AACvC,CAAC,EAXgB,UAAU,KAAV,UAAU,GAW1B,EAAA,CAAA,CAAA,CAAA;MAEY,oBAAoB,CAAA;aAEC,GAAA,EAAiB;AAC5B,EAAA,gBAAA,GAAmB,IAAA,OAAW,EAAA,CAAA;AAEjD,EAAA,WAAA,CAAA,YAAsC,EAAA;AAClC,IAAA,SAAA,CAAA,OAAU,CAAA,CAAA,IAAS,IAAI,CAAI,IAAC,CAAI,CAAA,CAAA,CAAA,CAAC;;AAGrC;;;AAGG;AACH,EAAA,IAAA,SAAa,GAAA;AACT,IAAA,OAAA,IAAO,CAAI,gBAAiB,CAAA;;eAGT,GAAA;QACnB,IAAI,CAAA,QAAa,IAAA,CAAA,IAAK,CAAI;AACtB,MAAA,IAAA,CAAA,gBAAqB,CAAA,IAAA,CAAA,SAAM,CAAA,CAAA;AAC3B,MAAA,IAAA,CAAA,gBAAK,CAAA,OAAiB,EAAA,CAAA;AACzB,KAAA;;AAGL,EAAA,IAAA,QAAY,GAAA;AACR,IAAA,OAAA,IAAO,YAAK,CAAA,MAAkB,KAAA,CAAA,CAAA;;mBAGT,GAAA;SAClB,GAAA;AACH,IAAA,IAAA,IAAI,SAAK,IAAQ,IAAI,CAAI;aACd;AACV,KAAA;AACD,IAAA,IAAA,CAAA,iBAAK,GAAA,IAAoB,CAAA;AACzB,IAAA,OAAA,CAAA,IAAQ,CAAA,QAAK,EAAA;;sCAEkB,EAAC,CAAA;AAC3B,OAAA,CAAA,OAAA,CAAA,EAAA;AAAC,QAAA,OAAA,CAAA,KAAU,CAAA,CAAA,CAAA,CAAA;AACR,OAAA;AACH,KAAA;AACJ,IAAA,IAAA,CAAA,iBAAA,GAAA,KAAA,CAAA;AACD,IAAA,IAAA,CAAA,aAAK,EAAA,CAAA;;MAER,CAAA,UAAA,EAAA;AAED,IAAA,MAA2B,WAAA,GAAA,IAAA,CAAA,WAAA,CAAA;AACvB,IAAA,WAAiB,CAAA,IAAA,CAAA,UAAO,CAAA,CAAC;AACzB,IAAA,MAAA,eAAiB,GAAA,UAAY,CAAA,OAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAAA;UACvB,QAAA,GAAA,UAAkB,CAAA,MAAA,CAAA,MAAW;AACnC,MAAA,MAAA,mBAAiB,CAAA,OAAiB,CAAA,UAAM,CAAA,CAAA;eAC9B,KAAA,CAAA,CAAA;AACN,QAAA,WAAS,CAAA,MAAK,CAAC,KAAG,EAAA,CAAA,CAAA,CAAA;AACd,OAAA;AACH,MAAA,IAAA,CAAA,aAAA,EAAA,CAAA;;AAEL,IAAA,UAAG,CAAA,OAAA,GAAA,MAAA;AACH,MAAA,QAAA,CAAA,OAAW,EAAA,CAAA;qBACE,EAAO,CAAA;AAChB,KAAA,CAAA;AACJ,IAAA,OAAE,QAAA,CAAA;AACF,GAAA;SACH,CAAA,WAAA,EAAA;AAED,IAAA,OAAO,WAA0B,CAAA,GAAA,CAAA,UAAA,IAAA,IAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAAA,CAAA;AAC7B,GAAA;"}
|
package/lib/core/event.js
CHANGED
@@ -1,250 +1,254 @@
|
|
1
1
|
/* tslint:disable */
|
2
2
|
var Event;
|
3
3
|
(function (Event) {
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
const _disposable = {
|
5
|
+
dispose() {}
|
6
|
+
};
|
7
|
+
Event.None = Object.assign(function () {
|
8
|
+
return _disposable;
|
9
|
+
}, {
|
10
|
+
get maxListeners() {
|
11
|
+
return 0;
|
12
|
+
},
|
13
|
+
set maxListeners(maxListeners) {}
|
14
|
+
});
|
15
|
+
/**
|
16
|
+
* Given an event and a `map` function, returns another event which maps each element
|
17
|
+
* through the mapping function.
|
18
|
+
*/
|
19
|
+
function map(event, mapFunc) {
|
20
|
+
return Object.assign((listener, thisArgs, disposables) => event(i => listener.call(thisArgs, mapFunc(i)), undefined, disposables), {
|
21
|
+
maxListeners: 0
|
8
22
|
});
|
9
|
-
|
10
|
-
|
11
|
-
* through the mapping function.
|
12
|
-
*/
|
13
|
-
function map(event, mapFunc) {
|
14
|
-
return Object.assign((listener, thisArgs, disposables) => event(i => listener.call(thisArgs, mapFunc(i)), undefined, disposables), {
|
15
|
-
maxListeners: 0,
|
16
|
-
});
|
17
|
-
}
|
18
|
-
Event.map = map;
|
23
|
+
}
|
24
|
+
Event.map = map;
|
19
25
|
})(Event || (Event = {}));
|
20
26
|
class CallbackList {
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
}
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
27
|
+
_callbacks;
|
28
|
+
_contexts;
|
29
|
+
get length() {
|
30
|
+
return this._callbacks && this._callbacks.length || 0;
|
31
|
+
}
|
32
|
+
add(callback, context = undefined, bucket) {
|
33
|
+
if (!this._callbacks) {
|
34
|
+
this._callbacks = [];
|
35
|
+
this._contexts = [];
|
36
|
+
}
|
37
|
+
this._callbacks.push(callback);
|
38
|
+
this._contexts.push(context);
|
39
|
+
if (Array.isArray(bucket)) {
|
40
|
+
bucket.push({
|
41
|
+
dispose: () => this.remove(callback, context)
|
42
|
+
});
|
43
|
+
}
|
44
|
+
}
|
45
|
+
remove(callback, context = undefined) {
|
46
|
+
if (!this._callbacks) {
|
47
|
+
return;
|
48
|
+
}
|
49
|
+
let foundCallbackWithDifferentContext = false;
|
50
|
+
for (let i = 0; i < this._callbacks.length; i++) {
|
51
|
+
if (this._callbacks[i] === callback) {
|
52
|
+
if (this._contexts[i] === context) {
|
53
|
+
// callback & context match => remove it
|
54
|
+
this._callbacks.splice(i, 1);
|
55
|
+
this._contexts.splice(i, 1);
|
56
|
+
return;
|
57
|
+
} else {
|
58
|
+
foundCallbackWithDifferentContext = true;
|
59
|
+
}
|
60
|
+
}
|
61
|
+
}
|
62
|
+
if (foundCallbackWithDifferentContext) {
|
63
|
+
throw new Error('When adding a listener with a context, you should remove it with the same context');
|
64
|
+
}
|
65
|
+
}
|
66
|
+
// tslint:disable-next-line:typedef
|
67
|
+
[Symbol.iterator]() {
|
68
|
+
if (!this._callbacks) {
|
69
|
+
return [][Symbol.iterator]();
|
70
|
+
}
|
71
|
+
const callbacks = this._callbacks.slice(0);
|
72
|
+
const contexts = this._contexts.slice(0);
|
73
|
+
return callbacks.map((callback, i) => (...args) => callback.apply(contexts[i], args))[Symbol.iterator]();
|
74
|
+
}
|
75
|
+
invoke(...args) {
|
76
|
+
const ret = [];
|
77
|
+
for (const callback of this) {
|
78
|
+
try {
|
79
|
+
ret.push(callback(...args));
|
80
|
+
} catch (e) {
|
81
|
+
console.error(e);
|
82
|
+
}
|
83
|
+
}
|
84
|
+
return ret;
|
85
|
+
}
|
86
|
+
isEmpty() {
|
87
|
+
return !this._callbacks || this._callbacks.length === 0;
|
88
|
+
}
|
89
|
+
dispose() {
|
90
|
+
this._callbacks = undefined;
|
91
|
+
this._contexts = undefined;
|
92
|
+
}
|
87
93
|
}
|
88
94
|
class Emitter {
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
}
|
110
|
-
if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
|
111
|
-
this._options.onFirstListenerAdd(this);
|
112
|
-
}
|
113
|
-
this._callbacks.add(listener, thisArgs);
|
114
|
-
const removeMaxListenersCheck = this.checkMaxListeners(this._event.maxListeners);
|
115
|
-
const result = {
|
116
|
-
dispose: () => {
|
117
|
-
if (removeMaxListenersCheck) {
|
118
|
-
removeMaxListenersCheck();
|
119
|
-
}
|
120
|
-
result.dispose = Emitter._noop;
|
121
|
-
if (!this._disposed) {
|
122
|
-
this._callbacks.remove(listener, thisArgs);
|
123
|
-
result.dispose = Emitter._noop;
|
124
|
-
if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {
|
125
|
-
this._options.onLastListenerRemove(this);
|
126
|
-
}
|
127
|
-
}
|
128
|
-
}
|
129
|
-
};
|
130
|
-
if (Array.isArray(disposables)) {
|
131
|
-
disposables.push(result);
|
132
|
-
}
|
133
|
-
return result;
|
134
|
-
}, {
|
135
|
-
maxListeners: Emitter.LEAK_WARNING_THRESHHOLD
|
136
|
-
});
|
137
|
-
}
|
138
|
-
return this._event;
|
139
|
-
}
|
140
|
-
checkMaxListeners(maxListeners) {
|
141
|
-
if (maxListeners === 0 || !this._callbacks) {
|
142
|
-
return undefined;
|
143
|
-
}
|
144
|
-
const listenerCount = this._callbacks.length;
|
145
|
-
if (listenerCount <= maxListeners) {
|
146
|
-
return undefined;
|
147
|
-
}
|
148
|
-
const popStack = this.pushLeakingStack();
|
149
|
-
this._leakWarnCountdown -= 1;
|
150
|
-
if (this._leakWarnCountdown <= 0) {
|
151
|
-
// only warn on first exceed and then every time the limit
|
152
|
-
// is exceeded by 50% again
|
153
|
-
this._leakWarnCountdown = maxListeners * 0.5;
|
154
|
-
let topStack;
|
155
|
-
let topCount = 0;
|
156
|
-
this._leakingStacks.forEach((stackCount, stack) => {
|
157
|
-
if (!topStack || topCount < stackCount) {
|
158
|
-
topStack = stack;
|
159
|
-
topCount = stackCount;
|
160
|
-
}
|
161
|
-
});
|
162
|
-
// eslint-disable-next-line max-len
|
163
|
-
console.warn(`Possible Emitter memory leak detected. ${listenerCount} listeners added. Use event.maxListeners to increase the limit (${maxListeners}). MOST frequent listener (${topCount}):`);
|
164
|
-
console.warn(topStack);
|
165
|
-
}
|
166
|
-
return popStack;
|
167
|
-
}
|
168
|
-
pushLeakingStack() {
|
169
|
-
if (!this._leakingStacks) {
|
170
|
-
this._leakingStacks = new Map();
|
171
|
-
}
|
172
|
-
const stack = new Error().stack.split('\n').slice(3).join('\n');
|
173
|
-
const count = (this._leakingStacks.get(stack) || 0);
|
174
|
-
this._leakingStacks.set(stack, count + 1);
|
175
|
-
return () => this.popLeakingStack(stack);
|
176
|
-
}
|
177
|
-
popLeakingStack(stack) {
|
178
|
-
if (!this._leakingStacks) {
|
179
|
-
return;
|
95
|
+
_options;
|
96
|
+
static LEAK_WARNING_THRESHHOLD = 175;
|
97
|
+
static _noop = function () {};
|
98
|
+
_event;
|
99
|
+
_callbacks;
|
100
|
+
_disposed = false;
|
101
|
+
_leakingStacks;
|
102
|
+
_leakWarnCountdown = 0;
|
103
|
+
constructor(_options) {
|
104
|
+
this._options = _options;
|
105
|
+
}
|
106
|
+
/**
|
107
|
+
* For the public to allow to subscribe
|
108
|
+
* to events from this Emitter
|
109
|
+
*/
|
110
|
+
get event() {
|
111
|
+
if (!this._event) {
|
112
|
+
this._event = Object.assign((listener, thisArgs, disposables) => {
|
113
|
+
if (!this._callbacks) {
|
114
|
+
this._callbacks = new CallbackList();
|
180
115
|
}
|
181
|
-
|
182
|
-
|
183
|
-
}
|
184
|
-
/**
|
185
|
-
* To be kept private to fire an event to
|
186
|
-
* subscribers
|
187
|
-
*/
|
188
|
-
fire(event) {
|
189
|
-
if (this._callbacks) {
|
190
|
-
this._callbacks.invoke(event);
|
116
|
+
if (this._options && this._options.onFirstListenerAdd && this._callbacks.isEmpty()) {
|
117
|
+
this._options.onFirstListenerAdd(this);
|
191
118
|
}
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
if (this._callbacks) {
|
199
|
-
for (const listener of this._callbacks) {
|
200
|
-
if (!await processor(listener)) {
|
201
|
-
break;
|
202
|
-
}
|
119
|
+
this._callbacks.add(listener, thisArgs);
|
120
|
+
const removeMaxListenersCheck = this.checkMaxListeners(this._event.maxListeners);
|
121
|
+
const result = {
|
122
|
+
dispose: () => {
|
123
|
+
if (removeMaxListenersCheck) {
|
124
|
+
removeMaxListenersCheck();
|
203
125
|
}
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
126
|
+
result.dispose = Emitter._noop;
|
127
|
+
if (!this._disposed) {
|
128
|
+
this._callbacks.remove(listener, thisArgs);
|
129
|
+
result.dispose = Emitter._noop;
|
130
|
+
if (this._options && this._options.onLastListenerRemove && this._callbacks.isEmpty()) {
|
131
|
+
this._options.onLastListenerRemove(this);
|
132
|
+
}
|
133
|
+
}
|
134
|
+
}
|
135
|
+
};
|
136
|
+
if (Array.isArray(disposables)) {
|
137
|
+
disposables.push(result);
|
138
|
+
}
|
139
|
+
return result;
|
140
|
+
}, {
|
141
|
+
maxListeners: Emitter.LEAK_WARNING_THRESHHOLD
|
142
|
+
});
|
143
|
+
}
|
144
|
+
return this._event;
|
145
|
+
}
|
146
|
+
checkMaxListeners(maxListeners) {
|
147
|
+
if (maxListeners === 0 || !this._callbacks) {
|
148
|
+
return undefined;
|
149
|
+
}
|
150
|
+
const listenerCount = this._callbacks.length;
|
151
|
+
if (listenerCount <= maxListeners) {
|
152
|
+
return undefined;
|
153
|
+
}
|
154
|
+
const popStack = this.pushLeakingStack();
|
155
|
+
this._leakWarnCountdown -= 1;
|
156
|
+
if (this._leakWarnCountdown <= 0) {
|
157
|
+
// only warn on first exceed and then every time the limit
|
158
|
+
// is exceeded by 50% again
|
159
|
+
this._leakWarnCountdown = maxListeners * 0.5;
|
160
|
+
let topStack;
|
161
|
+
let topCount = 0;
|
162
|
+
this._leakingStacks.forEach((stackCount, stack) => {
|
163
|
+
if (!topStack || topCount < stackCount) {
|
164
|
+
topStack = stack;
|
165
|
+
topCount = stackCount;
|
166
|
+
}
|
167
|
+
});
|
168
|
+
// eslint-disable-next-line max-len
|
169
|
+
console.warn(`Possible Emitter memory leak detected. ${listenerCount} listeners added. Use event.maxListeners to increase the limit (${maxListeners}). MOST frequent listener (${topCount}):`);
|
170
|
+
console.warn(topStack);
|
171
|
+
}
|
172
|
+
return popStack;
|
173
|
+
}
|
174
|
+
pushLeakingStack() {
|
175
|
+
if (!this._leakingStacks) {
|
176
|
+
this._leakingStacks = new Map();
|
177
|
+
}
|
178
|
+
const stack = new Error().stack.split('\n').slice(3).join('\n');
|
179
|
+
const count = this._leakingStacks.get(stack) || 0;
|
180
|
+
this._leakingStacks.set(stack, count + 1);
|
181
|
+
return () => this.popLeakingStack(stack);
|
182
|
+
}
|
183
|
+
popLeakingStack(stack) {
|
184
|
+
if (!this._leakingStacks) {
|
185
|
+
return;
|
186
|
+
}
|
187
|
+
const count = this._leakingStacks.get(stack) || 0;
|
188
|
+
this._leakingStacks.set(stack, count - 1);
|
189
|
+
}
|
190
|
+
/**
|
191
|
+
* To be kept private to fire an event to
|
192
|
+
* subscribers
|
193
|
+
*/
|
194
|
+
fire(event) {
|
195
|
+
if (this._callbacks) {
|
196
|
+
this._callbacks.invoke(event);
|
197
|
+
}
|
198
|
+
}
|
199
|
+
/**
|
200
|
+
* Process each listener one by one.
|
201
|
+
* Return `false` to stop iterating over the listeners, `true` to continue.
|
202
|
+
*/
|
203
|
+
async sequence(processor) {
|
204
|
+
if (this._callbacks) {
|
205
|
+
for (const listener of this._callbacks) {
|
206
|
+
if (!(await processor(listener))) {
|
207
|
+
break;
|
208
|
+
}
|
209
|
+
}
|
210
|
+
}
|
211
|
+
}
|
212
|
+
dispose() {
|
213
|
+
if (this._leakingStacks) {
|
214
|
+
this._leakingStacks.clear();
|
215
|
+
this._leakingStacks = undefined;
|
216
|
+
}
|
217
|
+
if (this._callbacks) {
|
218
|
+
this._callbacks.dispose();
|
219
|
+
this._callbacks = undefined;
|
220
|
+
}
|
221
|
+
this._disposed = true;
|
222
|
+
}
|
217
223
|
}
|
218
224
|
var WaitUntilEvent;
|
219
225
|
(function (WaitUntilEvent) {
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
}
|
249
|
-
WaitUntilEvent.fire = fire;
|
226
|
+
async function fire(emitter, event, timeout = undefined) {
|
227
|
+
const waitables = [];
|
228
|
+
const asyncEvent = Object.assign(event, {
|
229
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
230
|
+
waitUntil: thenable => {
|
231
|
+
if (Object.isFrozen(waitables)) {
|
232
|
+
throw new Error('waitUntil cannot be called asynchronously.');
|
233
|
+
}
|
234
|
+
waitables.push(thenable);
|
235
|
+
}
|
236
|
+
});
|
237
|
+
try {
|
238
|
+
emitter.fire(asyncEvent);
|
239
|
+
// Asynchronous calls to `waitUntil` should fail.
|
240
|
+
Object.freeze(waitables);
|
241
|
+
} finally {
|
242
|
+
delete asyncEvent['waitUntil'];
|
243
|
+
}
|
244
|
+
if (!waitables.length) {
|
245
|
+
return;
|
246
|
+
}
|
247
|
+
if (timeout !== undefined) {
|
248
|
+
await Promise.race([Promise.all(waitables), new Promise(resolve => setTimeout(resolve, timeout))]);
|
249
|
+
} else {
|
250
|
+
await Promise.all(waitables);
|
251
|
+
}
|
252
|
+
}
|
253
|
+
WaitUntilEvent.fire = fire;
|
250
254
|
})(WaitUntilEvent || (WaitUntilEvent = {}));export{Emitter,Event,WaitUntilEvent};//# sourceMappingURL=event.js.map
|