@kaspernj/api-maker 1.0.2105 → 1.0.2106
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/build/use-destroyed-event.d.ts +9 -9
- package/build/use-destroyed-event.d.ts.map +1 -1
- package/build/use-destroyed-event.js +67 -20
- package/build/use-model-event.d.ts +9 -9
- package/build/use-model-event.d.ts.map +1 -1
- package/build/use-model-event.js +67 -20
- package/build/use-updated-event.d.ts +9 -9
- package/build/use-updated-event.d.ts.map +1 -1
- package/build/use-updated-event.js +67 -20
- package/package.json +1 -1
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export default apiMakerUseDestroyedEvent;
|
|
2
2
|
/**
|
|
3
|
-
* @param {object} model
|
|
3
|
+
* @param {object|object[]} model
|
|
4
4
|
* @param {Function} onDestroyed
|
|
5
|
-
* @param {object} props
|
|
6
|
-
* @param {boolean} props.active
|
|
7
|
-
* @param {number} props.debounce
|
|
8
|
-
* @param {Function} props.onConnected
|
|
5
|
+
* @param {object} [props]
|
|
6
|
+
* @param {boolean} [props.active]
|
|
7
|
+
* @param {number} [props.debounce]
|
|
8
|
+
* @param {Function} [props.onConnected]
|
|
9
9
|
* @returns {void}
|
|
10
10
|
*/
|
|
11
|
-
declare function apiMakerUseDestroyedEvent(model: object, onDestroyed: Function, props
|
|
12
|
-
active
|
|
13
|
-
debounce
|
|
14
|
-
onConnected
|
|
11
|
+
declare function apiMakerUseDestroyedEvent(model: object | object[], onDestroyed: Function, props?: {
|
|
12
|
+
active?: boolean;
|
|
13
|
+
debounce?: number;
|
|
14
|
+
onConnected?: Function;
|
|
15
15
|
}): void;
|
|
16
16
|
//# sourceMappingURL=use-destroyed-event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-destroyed-event.d.ts","sourceRoot":"/src/","sources":["use-destroyed-event.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"use-destroyed-event.d.ts","sourceRoot":"/src/","sources":["use-destroyed-event.js"],"names":[],"mappings":";AA0CA;;;;;;;;GAQG;AACH,kDARW,MAAM,GAAC,MAAM,EAAE,iCAGvB;IAAwB,MAAM,GAAtB,OAAO;IACQ,QAAQ,GAAvB,MAAM;IACW,WAAW;CACpC,GAAU,IAAI,CA0EhB"}
|
|
@@ -1,19 +1,51 @@
|
|
|
1
1
|
/* eslint-disable sort-imports */
|
|
2
|
-
import { useCallback, useLayoutEffect, useMemo } from "react";
|
|
2
|
+
import { useCallback, useLayoutEffect, useMemo, useRef } from "react";
|
|
3
3
|
import debounceFunction from "debounce";
|
|
4
4
|
import ModelEvents from "./model-events.js";
|
|
5
5
|
import useShape from "set-state-compare/build/use-shape.js";
|
|
6
6
|
/**
|
|
7
|
-
* @param {object}
|
|
7
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
8
|
+
* @returns {object[]}
|
|
9
|
+
*/
|
|
10
|
+
const modelsFromInput = (modelOrModels) => {
|
|
11
|
+
if (!modelOrModels) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
else if (Array.isArray(modelOrModels)) {
|
|
15
|
+
return modelOrModels.filter(Boolean);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return [modelOrModels];
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
const modelsDependencyKey = (modelOrModels) => JSON.stringify(modelsFromInput(modelOrModels).map((model) => model.id()));
|
|
26
|
+
/**
|
|
27
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
28
|
+
* @returns {Record<string, object>}
|
|
29
|
+
*/
|
|
30
|
+
const modelsByIdFromInput = (modelOrModels) => {
|
|
31
|
+
const modelsById = {};
|
|
32
|
+
modelsFromInput(modelOrModels).forEach((model) => {
|
|
33
|
+
modelsById[model.id()] = model;
|
|
34
|
+
});
|
|
35
|
+
return modelsById;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* @param {object|object[]} model
|
|
8
39
|
* @param {Function} onDestroyed
|
|
9
|
-
* @param {object} props
|
|
10
|
-
* @param {boolean} props.active
|
|
11
|
-
* @param {number} props.debounce
|
|
12
|
-
* @param {Function} props.onConnected
|
|
40
|
+
* @param {object} [props]
|
|
41
|
+
* @param {boolean} [props.active]
|
|
42
|
+
* @param {number} [props.debounce]
|
|
43
|
+
* @param {Function} [props.onConnected]
|
|
13
44
|
* @returns {void}
|
|
14
45
|
*/
|
|
15
46
|
const apiMakerUseDestroyedEvent = (model, onDestroyed, props) => {
|
|
16
47
|
const { active = true, debounce, onConnected, ...restProps } = props || {};
|
|
48
|
+
const connectionsRef = useRef({});
|
|
17
49
|
if (Object.keys(restProps).length > 0) {
|
|
18
50
|
throw new Error(`Unknown props given to useDestroyedEvent: ${Object.keys(restProps).join(", ")}`);
|
|
19
51
|
}
|
|
@@ -39,22 +71,37 @@ const apiMakerUseDestroyedEvent = (model, onDestroyed, props) => {
|
|
|
39
71
|
}
|
|
40
72
|
}, []);
|
|
41
73
|
useLayoutEffect(() => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
74
|
+
const currentConnections = connectionsRef.current;
|
|
75
|
+
const nextModelsById = modelsByIdFromInput(model);
|
|
76
|
+
Object.keys(currentConnections).forEach((modelId) => {
|
|
77
|
+
if (!(modelId in nextModelsById)) {
|
|
78
|
+
if (onConnected) {
|
|
79
|
+
currentConnections[modelId].events.removeListener("connected", onConnected);
|
|
80
|
+
}
|
|
81
|
+
currentConnections[modelId].unsubscribe();
|
|
82
|
+
delete currentConnections[modelId];
|
|
47
83
|
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
84
|
+
});
|
|
85
|
+
Object.keys(nextModelsById).forEach((modelId) => {
|
|
86
|
+
if (modelId in currentConnections) {
|
|
87
|
+
return;
|
|
52
88
|
}
|
|
53
|
-
|
|
54
|
-
|
|
89
|
+
const destroyedConnection = ModelEvents.connectDestroyed(nextModelsById[modelId], onDestroyedCallback);
|
|
90
|
+
currentConnections[modelId] = destroyedConnection;
|
|
91
|
+
if (onConnected) {
|
|
92
|
+
destroyedConnection.events.addListener("connected", onConnected);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}, [modelsDependencyKey(model)]);
|
|
96
|
+
useLayoutEffect(() => () => {
|
|
97
|
+
Object.values(connectionsRef.current).forEach((destroyedConnection) => {
|
|
98
|
+
if (onConnected) {
|
|
99
|
+
destroyedConnection.events.removeListener("connected", onConnected);
|
|
55
100
|
}
|
|
56
|
-
|
|
57
|
-
|
|
101
|
+
destroyedConnection.unsubscribe();
|
|
102
|
+
});
|
|
103
|
+
connectionsRef.current = {};
|
|
104
|
+
}, []);
|
|
58
105
|
};
|
|
59
106
|
export default apiMakerUseDestroyedEvent;
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLWRlc3Ryb3llZC1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIvc3JjLyIsInNvdXJjZXMiOlsidXNlLWRlc3Ryb3llZC1ldmVudC5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxpQ0FBaUM7QUFDakMsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBQyxNQUFNLE9BQU8sQ0FBQTtBQUNuRSxPQUFPLGdCQUFnQixNQUFNLFVBQVUsQ0FBQTtBQUN2QyxPQUFPLFdBQVcsTUFBTSxtQkFBbUIsQ0FBQTtBQUMzQyxPQUFPLFFBQVEsTUFBTSxzQ0FBc0MsQ0FBQTtBQUUzRDs7O0dBR0c7QUFDSCxNQUFNLGVBQWUsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFO0lBQ3hDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNuQixPQUFPLEVBQUUsQ0FBQTtJQUNYLENBQUM7U0FBTSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztRQUN4QyxPQUFPLGFBQWEsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUE7SUFDdEMsQ0FBQztTQUFNLENBQUM7UUFDTixPQUFPLENBQUMsYUFBYSxDQUFDLENBQUE7SUFDeEIsQ0FBQztBQUNILENBQUMsQ0FBQTtBQUVEOzs7R0FHRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQzNELGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUMxRCxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFO0lBQzVDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQTtJQUVyQixlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLENB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LENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDOUMsSUFBSSxPQUFPLElBQUksa0JBQWtCLEVBQUUsQ0FBQztnQkFDbEMsT0FBTTtZQUNSLENBQUM7WUFFRCxNQUFNLG1CQUFtQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQTtZQUN0RyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxtQkFBbUIsQ0FBQTtZQUVqRCxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNsRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFaEMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtRQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFO1lBQ3BFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ3JFLENBQUM7WUFFRCxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNuQyxDQUFDLENBQUMsQ0FBQTtRQUVGLGNBQWMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBQzdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNSLENBQUMsQ0FBQTtBQUVELGVBQWUseUJBQXlCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBzb3J0LWltcG9ydHMgKi9cbmltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IGRlYm91bmNlRnVuY3Rpb24gZnJvbSBcImRlYm91bmNlXCJcbmltcG9ydCBNb2RlbEV2ZW50cyBmcm9tIFwiLi9tb2RlbC1ldmVudHMuanNcIlxuaW1wb3J0IHVzZVNoYXBlIGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC91c2Utc2hhcGUuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fG9iamVjdFtdfHVuZGVmaW5lZHxudWxsfSBtb2RlbE9yTW9kZWxzXG4gKiBAcmV0dXJucyB7b2JqZWN0W119XG4gKi9cbmNvbnN0IG1vZGVsc0Zyb21JbnB1dCA9IChtb2RlbE9yTW9kZWxzKSA9PiB7XG4gIGlmICghbW9kZWxPck1vZGVscykge1xuICAgIHJldHVybiBbXVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxPck1vZGVscykpIHtcbiAgICByZXR1cm4gbW9kZWxPck1vZGVscy5maWx0ZXIoQm9vbGVhbilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW21vZGVsT3JNb2RlbHNdXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdHxvYmplY3RbXXx1bmRlZmluZWR8bnVsbH0gbW9kZWxPck1vZGVsc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgbW9kZWxzRGVwZW5kZW5jeUtleSA9IChtb2RlbE9yTW9kZWxzKSA9PiBKU09OLnN0cmluZ2lmeShcbiAgbW9kZWxzRnJvbUlucHV0KG1vZGVsT3JNb2RlbHMpLm1hcCgobW9kZWwpID0+IG1vZGVsLmlkKCkpXG4pXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R8b2JqZWN0W118dW5kZWZpbmVkfG51bGx9IG1vZGVsT3JNb2RlbHNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fVxuICovXG5jb25zdCBtb2RlbHNCeUlkRnJvbUlucHV0ID0gKG1vZGVsT3JNb2RlbHMpID0+IHtcbiAgY29uc3QgbW9kZWxzQnlJZCA9IHt9XG5cbiAgbW9kZWxzRnJvbUlucHV0KG1vZGVsT3JNb2RlbHMpLmZvckVhY2goKG1vZGVsKSA9PiB7XG4gICAgbW9kZWxzQnlJZFttb2RlbC5pZCgpXSA9IG1vZGVsXG4gIH0pXG5cbiAgcmV0dXJuIG1vZGVsc0J5SWRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdHxvYmplY3RbXX0gbW9kZWxcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uRGVzdHJveWVkXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMuYWN0aXZlXVxuICogQHBhcmFtIHtudW1iZXJ9IFtwcm9wcy5kZWJvdW5jZV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wcy5vbkNvbm5lY3RlZF1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhcGlNYWtlclVzZURlc3Ryb3llZEV2ZW50ID0gKG1vZGVsLCBvbkRlc3Ryb3llZCwgcHJvcHMpID0+IHtcbiAgY29uc3Qge2FjdGl2ZSA9IHRydWUsIGRlYm91bmNlLCBvbkNvbm5lY3RlZCwgLi4ucmVzdFByb3BzfSA9IHByb3BzIHx8IHt9XG4gIGNvbnN0IGNvbm5lY3Rpb25zUmVmID0gdXNlUmVmKHt9KVxuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvcHMgZ2l2ZW4gdG8gdXNlRGVzdHJveWVkRXZlbnQ6ICR7T2JqZWN0LmtleXMocmVzdFByb3BzKS5qb2luKFwiLCBcIil9YClcbiAgfVxuXG4gIGNvbnN0IHMgPSB1c2VTaGFwZSh7YWN0aXZlLCBkZWJvdW5jZSwgbW9kZWwsIG9uRGVzdHJveWVkfSlcblxuICBjb25zdCBkZWJvdW5jZUNhbGxiYWNrID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkZWJvdW5jZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gZGVib3VuY2VGdW5jdGlvbihzLnAub25EZXN0cm95ZWQsIGRlYm91bmNlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVib3VuY2VGdW5jdGlvbihzLnAub25EZXN0cm95ZWQpXG4gICAgfVxuICB9LCBbZGVib3VuY2VdKVxuXG4gIHMudXBkYXRlTWV0YSh7ZGVib3VuY2VDYWxsYmFja30pXG5cbiAgY29uc3Qgb25EZXN0cm95ZWRDYWxsYmFjayA9IHVzZUNhbGxiYWNrKCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCFzLnAuYWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocy5wLmRlYm91bmNlKSB7XG4gICAgICBzLm0uZGVib3VuY2VDYWxsYmFjayguLi5hcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBzLnAub25EZXN0cm95ZWQoLi4uYXJncylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudENvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNSZWYuY3VycmVudFxuICAgIGNvbnN0IG5leHRNb2RlbHNCeUlkID0gbW9kZWxzQnlJZEZyb21JbnB1dChtb2RlbClcblxuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25uZWN0aW9ucykuZm9yRWFjaCgobW9kZWxJZCkgPT4ge1xuICAgICAgaWYgKCEobW9kZWxJZCBpbiBuZXh0TW9kZWxzQnlJZCkpIHtcbiAgICAgICAgaWYgKG9uQ29ubmVjdGVkKSB7XG4gICAgICAgICAgY3VycmVudENvbm5lY3Rpb25zW21vZGVsSWRdLmV2ZW50cy5yZW1vdmVMaXN0ZW5lcihcImNvbm5lY3RlZFwiLCBvbkNvbm5lY3RlZClcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRDb25uZWN0aW9uc1ttb2RlbElkXS51bnN1YnNjcmliZSgpXG4gICAgICAgIGRlbGV0ZSBjdXJyZW50Q29ubmVjdGlvbnNbbW9kZWxJZF1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgT2JqZWN0LmtleXMobmV4dE1vZGVsc0J5SWQpLmZvckVhY2goKG1vZGVsSWQpID0+IHtcbiAgICAgIGlmIChtb2RlbElkIGluIGN1cnJlbnRDb25uZWN0aW9ucykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgZGVzdHJveWVkQ29ubmVjdGlvbiA9IE1vZGVsRXZlbnRzLmNvbm5lY3REZXN0cm95ZWQobmV4dE1vZGVsc0J5SWRbbW9kZWxJZF0sIG9uRGVzdHJveWVkQ2FsbGJhY2spXG4gICAgICBjdXJyZW50Q29ubmVjdGlvbnNbbW9kZWxJZF0gPSBkZXN0cm95ZWRDb25uZWN0aW9uXG5cbiAgICAgIGlmIChvbkNvbm5lY3RlZCkge1xuICAgICAgICBkZXN0cm95ZWRDb25uZWN0aW9uLmV2ZW50cy5hZGRMaXN0ZW5lcihcImNvbm5lY3RlZFwiLCBvbkNvbm5lY3RlZClcbiAgICAgIH1cbiAgICB9KVxuICB9LCBbbW9kZWxzRGVwZW5kZW5jeUtleShtb2RlbCldKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiAoKSA9PiB7XG4gICAgT2JqZWN0LnZhbHVlcyhjb25uZWN0aW9uc1JlZi5jdXJyZW50KS5mb3JFYWNoKChkZXN0cm95ZWRDb25uZWN0aW9uKSA9PiB7XG4gICAgICBpZiAob25Db25uZWN0ZWQpIHtcbiAgICAgICAgZGVzdHJveWVkQ29ubmVjdGlvbi5ldmVudHMucmVtb3ZlTGlzdGVuZXIoXCJjb25uZWN0ZWRcIiwgb25Db25uZWN0ZWQpXG4gICAgICB9XG5cbiAgICAgIGRlc3Ryb3llZENvbm5lY3Rpb24udW5zdWJzY3JpYmUoKVxuICAgIH0pXG5cbiAgICBjb25uZWN0aW9uc1JlZi5jdXJyZW50ID0ge31cbiAgfSwgW10pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwaU1ha2VyVXNlRGVzdHJveWVkRXZlbnRcbiJdfQ==
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
export default apiMakerUseModelEvent;
|
|
2
2
|
/**
|
|
3
|
-
* @param {import("./base-model.js").default} model
|
|
3
|
+
* @param {import("./base-model.js").default|import("./base-model.js").default[]} model
|
|
4
4
|
* @param {string} event
|
|
5
5
|
* @param {Function} onCallback
|
|
6
|
-
* @param {object} props
|
|
7
|
-
* @param {
|
|
8
|
-
* @param {number} props.debounce
|
|
9
|
-
* @param {Function} props.onConnected
|
|
6
|
+
* @param {object} [props]
|
|
7
|
+
* @param {boolean} [props.active]
|
|
8
|
+
* @param {number} [props.debounce]
|
|
9
|
+
* @param {Function} [props.onConnected]
|
|
10
10
|
* @returns {void}
|
|
11
11
|
*/
|
|
12
|
-
declare function apiMakerUseModelEvent(model: import("./base-model.js").default, event: string, onCallback: Function, props
|
|
13
|
-
active
|
|
14
|
-
debounce
|
|
15
|
-
onConnected
|
|
12
|
+
declare function apiMakerUseModelEvent(model: import("./base-model.js").default | import("./base-model.js").default[], event: string, onCallback: Function, props?: {
|
|
13
|
+
active?: boolean;
|
|
14
|
+
debounce?: number;
|
|
15
|
+
onConnected?: Function;
|
|
16
16
|
}): void;
|
|
17
17
|
//# sourceMappingURL=use-model-event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-model-event.d.ts","sourceRoot":"/src/","sources":["use-model-event.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"use-model-event.d.ts","sourceRoot":"/src/","sources":["use-model-event.js"],"names":[],"mappings":";AA0CA;;;;;;;;;GASG;AAEH,8CAVW,OAAO,iBAAiB,EAAE,OAAO,GAAC,OAAO,iBAAiB,EAAE,OAAO,EAAE,SACrE,MAAM,gCAGd;IAAwB,MAAM,GAAtB,OAAO;IACQ,QAAQ,GAAvB,MAAM;IACW,WAAW;CACpC,GAAU,IAAI,CA2EhB"}
|
package/build/use-model-event.js
CHANGED
|
@@ -1,21 +1,53 @@
|
|
|
1
1
|
/* eslint-disable sort-imports */
|
|
2
|
-
import { useCallback, useLayoutEffect, useMemo } from "react";
|
|
2
|
+
import { useCallback, useLayoutEffect, useMemo, useRef } from "react";
|
|
3
3
|
import debounceFunction from "debounce";
|
|
4
4
|
import ModelEvents from "./model-events.js";
|
|
5
5
|
import useShape from "set-state-compare/build/use-shape.js";
|
|
6
6
|
/**
|
|
7
|
-
* @param {
|
|
7
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
8
|
+
* @returns {object[]}
|
|
9
|
+
*/
|
|
10
|
+
const modelsFromInput = (modelOrModels) => {
|
|
11
|
+
if (!modelOrModels) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
else if (Array.isArray(modelOrModels)) {
|
|
15
|
+
return modelOrModels.filter(Boolean);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return [modelOrModels];
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
const modelsDependencyKey = (modelOrModels) => JSON.stringify(modelsFromInput(modelOrModels).map((model) => model.id()));
|
|
26
|
+
/**
|
|
27
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
28
|
+
* @returns {Record<string, object>}
|
|
29
|
+
*/
|
|
30
|
+
const modelsByIdFromInput = (modelOrModels) => {
|
|
31
|
+
const modelsById = {};
|
|
32
|
+
modelsFromInput(modelOrModels).forEach((model) => {
|
|
33
|
+
modelsById[model.id()] = model;
|
|
34
|
+
});
|
|
35
|
+
return modelsById;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* @param {import("./base-model.js").default|import("./base-model.js").default[]} model
|
|
8
39
|
* @param {string} event
|
|
9
40
|
* @param {Function} onCallback
|
|
10
|
-
* @param {object} props
|
|
11
|
-
* @param {
|
|
12
|
-
* @param {number} props.debounce
|
|
13
|
-
* @param {Function} props.onConnected
|
|
41
|
+
* @param {object} [props]
|
|
42
|
+
* @param {boolean} [props.active]
|
|
43
|
+
* @param {number} [props.debounce]
|
|
44
|
+
* @param {Function} [props.onConnected]
|
|
14
45
|
* @returns {void}
|
|
15
46
|
*/
|
|
16
47
|
// eslint-disable-next-line max-params
|
|
17
48
|
const apiMakerUseModelEvent = (model, event, onCallback, props) => {
|
|
18
49
|
const { active = true, debounce, onConnected, ...restProps } = props || {};
|
|
50
|
+
const connectionsRef = useRef({});
|
|
19
51
|
if (Object.keys(restProps).length > 0) {
|
|
20
52
|
throw new Error(`Unknown props given to apiMakerUseModelEvent: ${Object.keys(restProps).join(", ")}`);
|
|
21
53
|
}
|
|
@@ -41,22 +73,37 @@ const apiMakerUseModelEvent = (model, event, onCallback, props) => {
|
|
|
41
73
|
}
|
|
42
74
|
}, []);
|
|
43
75
|
useLayoutEffect(() => {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
if (
|
|
48
|
-
|
|
76
|
+
const currentConnections = connectionsRef.current;
|
|
77
|
+
const nextModelsById = modelsByIdFromInput(model);
|
|
78
|
+
Object.keys(currentConnections).forEach((modelId) => {
|
|
79
|
+
if (!(modelId in nextModelsById)) {
|
|
80
|
+
if (onConnected) {
|
|
81
|
+
currentConnections[modelId].events.removeListener("connected", onConnected);
|
|
82
|
+
}
|
|
83
|
+
currentConnections[modelId].unsubscribe();
|
|
84
|
+
delete currentConnections[modelId];
|
|
49
85
|
}
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
if (
|
|
53
|
-
|
|
86
|
+
});
|
|
87
|
+
Object.keys(nextModelsById).forEach((modelId) => {
|
|
88
|
+
if (modelId in currentConnections) {
|
|
89
|
+
return;
|
|
54
90
|
}
|
|
55
|
-
|
|
56
|
-
|
|
91
|
+
const eventConnection = ModelEvents.connect(nextModelsById[modelId], event, onCallbackCallback);
|
|
92
|
+
currentConnections[modelId] = eventConnection;
|
|
93
|
+
if (onConnected) {
|
|
94
|
+
eventConnection.events.addListener("connected", onConnected);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}, [event, modelsDependencyKey(model)]);
|
|
98
|
+
useLayoutEffect(() => () => {
|
|
99
|
+
Object.values(connectionsRef.current).forEach((eventConnection) => {
|
|
100
|
+
if (onConnected) {
|
|
101
|
+
eventConnection.events.removeListener("connected", onConnected);
|
|
57
102
|
}
|
|
58
|
-
|
|
59
|
-
|
|
103
|
+
eventConnection.unsubscribe();
|
|
104
|
+
});
|
|
105
|
+
connectionsRef.current = {};
|
|
106
|
+
}, []);
|
|
60
107
|
};
|
|
61
108
|
export default apiMakerUseModelEvent;
|
|
62
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
109
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLW1vZGVsLWV2ZW50LmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ1c2UtbW9kZWwtZXZlbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUNBQWlDO0FBQ2pDLE9BQU8sRUFBQyxXQUFXLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUMsTUFBTSxPQUFPLENBQUE7QUFDbkUsT0FBTyxnQkFBZ0IsTUFBTSxVQUFVLENBQUE7QUFDdkMsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxRQUFRLE1BQU0sc0NBQXNDLENBQUE7QUFFM0Q7OztHQUdHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBRTtJQUN4QyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDbkIsT0FBTyxFQUFFLENBQUE7SUFDWCxDQUFDO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7UUFDeEMsT0FBTyxhQUFhLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RDLENBQUM7U0FBTSxDQUFDO1FBQ04sT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7QUFDSCxDQUFDLENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUMzRCxlQUFlLENBQUMsYUFBYSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FDMUQsQ0FBQTtBQUVEOzs7R0FHRztBQUNILE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFhLEVBQUUsRUFBRTtJQUM1QyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUE7SUFFckIsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUss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RixNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzlDLElBQUksT0FBTyxJQUFJLGtCQUFrQixFQUFFLENBQUM7Z0JBQ2xDLE9BQU07WUFDUixDQUFDO1lBRUQsTUFBTSxlQUFlLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUE7WUFDL0Ysa0JBQWtCLENBQUMsT0FBTyxDQUFDLEdBQUcsZUFBZSxDQUFBO1lBRTdDLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLGVBQWUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUM5RCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBRXZDLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLEVBQUU7UUFDekIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsZUFBZSxFQUFFLEVBQUU7WUFDaEUsSUFBSSxXQUFXLEVBQUUsQ0FBQztnQkFDaEIsZUFBZSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ2pFLENBQUM7WUFFRCxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDL0IsQ0FBQyxDQUFDLENBQUE7UUFFRixjQUFjLENBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQTtJQUM3QixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7QUFDUixDQUFDLENBQUE7QUFFRCxlQUFlLHFCQUFxQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgc29ydC1pbXBvcnRzICovXG5pbXBvcnQge3VzZUNhbGxiYWNrLCB1c2VMYXlvdXRFZmZlY3QsIHVzZU1lbW8sIHVzZVJlZn0gZnJvbSBcInJlYWN0XCJcbmltcG9ydCBkZWJvdW5jZUZ1bmN0aW9uIGZyb20gXCJkZWJvdW5jZVwiXG5pbXBvcnQgTW9kZWxFdmVudHMgZnJvbSBcIi4vbW9kZWwtZXZlbnRzLmpzXCJcbmltcG9ydCB1c2VTaGFwZSBmcm9tIFwic2V0LXN0YXRlLWNvbXBhcmUvYnVpbGQvdXNlLXNoYXBlLmpzXCJcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdHxvYmplY3RbXXx1bmRlZmluZWR8bnVsbH0gbW9kZWxPck1vZGVsc1xuICogQHJldHVybnMge29iamVjdFtdfVxuICovXG5jb25zdCBtb2RlbHNGcm9tSW5wdXQgPSAobW9kZWxPck1vZGVscykgPT4ge1xuICBpZiAoIW1vZGVsT3JNb2RlbHMpIHtcbiAgICByZXR1cm4gW11cbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KG1vZGVsT3JNb2RlbHMpKSB7XG4gICAgcmV0dXJuIG1vZGVsT3JNb2RlbHMuZmlsdGVyKEJvb2xlYW4pXG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIFttb2RlbE9yTW9kZWxzXVxuICB9XG59XG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R8b2JqZWN0W118dW5kZWZpbmVkfG51bGx9IG1vZGVsT3JNb2RlbHNcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IG1vZGVsc0RlcGVuZGVuY3lLZXkgPSAobW9kZWxPck1vZGVscykgPT4gSlNPTi5zdHJpbmdpZnkoXG4gIG1vZGVsc0Zyb21JbnB1dChtb2RlbE9yTW9kZWxzKS5tYXAoKG1vZGVsKSA9PiBtb2RlbC5pZCgpKVxuKVxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fG9iamVjdFtdfHVuZGVmaW5lZHxudWxsfSBtb2RlbE9yTW9kZWxzXG4gKiBAcmV0dXJucyB7UmVjb3JkPHN0cmluZywgb2JqZWN0Pn1cbiAqL1xuY29uc3QgbW9kZWxzQnlJZEZyb21JbnB1dCA9IChtb2RlbE9yTW9kZWxzKSA9PiB7XG4gIGNvbnN0IG1vZGVsc0J5SWQgPSB7fVxuXG4gIG1vZGVsc0Zyb21JbnB1dChtb2RlbE9yTW9kZWxzKS5mb3JFYWNoKChtb2RlbCkgPT4ge1xuICAgIG1vZGVsc0J5SWRbbW9kZWwuaWQoKV0gPSBtb2RlbFxuICB9KVxuXG4gIHJldHVybiBtb2RlbHNCeUlkXG59XG5cbi8qKlxuICogQHBhcmFtIHtpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdHxpbXBvcnQoXCIuL2Jhc2UtbW9kZWwuanNcIikuZGVmYXVsdFtdfSBtb2RlbFxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50XG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvbkNhbGxiYWNrXG4gKiBAcGFyYW0ge29iamVjdH0gW3Byb3BzXVxuICogQHBhcmFtIHtib29sZWFufSBbcHJvcHMuYWN0aXZlXVxuICogQHBhcmFtIHtudW1iZXJ9IFtwcm9wcy5kZWJvdW5jZV1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcm9wcy5vbkNvbm5lY3RlZF1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXBhcmFtc1xuY29uc3QgYXBpTWFrZXJVc2VNb2RlbEV2ZW50ID0gKG1vZGVsLCBldmVudCwgb25DYWxsYmFjaywgcHJvcHMpID0+IHtcbiAgY29uc3Qge2FjdGl2ZSA9IHRydWUsIGRlYm91bmNlLCBvbkNvbm5lY3RlZCwgLi4ucmVzdFByb3BzfSA9IHByb3BzIHx8IHt9XG4gIGNvbnN0IGNvbm5lY3Rpb25zUmVmID0gdXNlUmVmKHt9KVxuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvcHMgZ2l2ZW4gdG8gYXBpTWFrZXJVc2VNb2RlbEV2ZW50OiAke09iamVjdC5rZXlzKHJlc3RQcm9wcykuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBjb25zdCBzID0gdXNlU2hhcGUoe2FjdGl2ZSwgZGVib3VuY2UsIG1vZGVsLCBvbkNhbGxiYWNrfSlcblxuICBjb25zdCBkZWJvdW5jZUNhbGxiYWNrID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiBkZWJvdW5jZSA9PSBcIm51bWJlclwiKSB7XG4gICAgICByZXR1cm4gZGVib3VuY2VGdW5jdGlvbihzLnAub25DYWxsYmFjaywgZGVib3VuY2UpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBkZWJvdW5jZUZ1bmN0aW9uKHMucC5vbkNhbGxiYWNrKVxuICAgIH1cbiAgfSwgW2RlYm91bmNlXSlcblxuICBzLnVwZGF0ZU1ldGEoe2RlYm91bmNlQ2FsbGJhY2t9KVxuXG4gIGNvbnN0IG9uQ2FsbGJhY2tDYWxsYmFjayA9IHVzZUNhbGxiYWNrKCguLi5hcmdzKSA9PiB7XG4gICAgaWYgKCFzLnAuYWN0aXZlKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAocy5wLmRlYm91bmNlKSB7XG4gICAgICBzLm0uZGVib3VuY2VDYWxsYmFjayguLi5hcmdzKVxuICAgIH0gZWxzZSB7XG4gICAgICBzLnAub25DYWxsYmFjayguLi5hcmdzKVxuICAgIH1cbiAgfSwgW10pXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+IHtcbiAgICBjb25zdCBjdXJyZW50Q29ubmVjdGlvbnMgPSBjb25uZWN0aW9uc1JlZi5jdXJyZW50XG4gICAgY29uc3QgbmV4dE1vZGVsc0J5SWQgPSBtb2RlbHNCeUlkRnJvbUlucHV0KG1vZGVsKVxuXG4gICAgT2JqZWN0LmtleXMoY3VycmVudENvbm5lY3Rpb25zKS5mb3JFYWNoKChtb2RlbElkKSA9PiB7XG4gICAgICBpZiAoIShtb2RlbElkIGluIG5leHRNb2RlbHNCeUlkKSkge1xuICAgICAgICBpZiAob25Db25uZWN0ZWQpIHtcbiAgICAgICAgICBjdXJyZW50Q29ubmVjdGlvbnNbbW9kZWxJZF0uZXZlbnRzLnJlbW92ZUxpc3RlbmVyKFwiY29ubmVjdGVkXCIsIG9uQ29ubmVjdGVkKVxuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudENvbm5lY3Rpb25zW21vZGVsSWRdLnVuc3Vic2NyaWJlKClcbiAgICAgICAgZGVsZXRlIGN1cnJlbnRDb25uZWN0aW9uc1ttb2RlbElkXVxuICAgICAgfVxuICAgIH0pXG5cbiAgICBPYmplY3Qua2V5cyhuZXh0TW9kZWxzQnlJZCkuZm9yRWFjaCgobW9kZWxJZCkgPT4ge1xuICAgICAgaWYgKG1vZGVsSWQgaW4gY3VycmVudENvbm5lY3Rpb25zKSB7XG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBldmVudENvbm5lY3Rpb24gPSBNb2RlbEV2ZW50cy5jb25uZWN0KG5leHRNb2RlbHNCeUlkW21vZGVsSWRdLCBldmVudCwgb25DYWxsYmFja0NhbGxiYWNrKVxuICAgICAgY3VycmVudENvbm5lY3Rpb25zW21vZGVsSWRdID0gZXZlbnRDb25uZWN0aW9uXG5cbiAgICAgIGlmIChvbkNvbm5lY3RlZCkge1xuICAgICAgICBldmVudENvbm5lY3Rpb24uZXZlbnRzLmFkZExpc3RlbmVyKFwiY29ubmVjdGVkXCIsIG9uQ29ubmVjdGVkKVxuICAgICAgfVxuICAgIH0pXG4gIH0sIFtldmVudCwgbW9kZWxzRGVwZW5kZW5jeUtleShtb2RlbCldKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiAoKSA9PiB7XG4gICAgT2JqZWN0LnZhbHVlcyhjb25uZWN0aW9uc1JlZi5jdXJyZW50KS5mb3JFYWNoKChldmVudENvbm5lY3Rpb24pID0+IHtcbiAgICAgIGlmIChvbkNvbm5lY3RlZCkge1xuICAgICAgICBldmVudENvbm5lY3Rpb24uZXZlbnRzLnJlbW92ZUxpc3RlbmVyKFwiY29ubmVjdGVkXCIsIG9uQ29ubmVjdGVkKVxuICAgICAgfVxuXG4gICAgICBldmVudENvbm5lY3Rpb24udW5zdWJzY3JpYmUoKVxuICAgIH0pXG5cbiAgICBjb25uZWN0aW9uc1JlZi5jdXJyZW50ID0ge31cbiAgfSwgW10pXG59XG5cbmV4cG9ydCBkZWZhdWx0IGFwaU1ha2VyVXNlTW9kZWxFdmVudFxuIl19
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
export default apiMakerUseUpdatedEvent;
|
|
2
2
|
/**
|
|
3
|
-
* @param {import("./base-model.js").default} model
|
|
3
|
+
* @param {import("./base-model.js").default|import("./base-model.js").default[]} model
|
|
4
4
|
* @param {Function} onUpdated
|
|
5
|
-
* @param {object} props
|
|
6
|
-
* @param {boolean} props.active
|
|
7
|
-
* @param {number} props.debounce
|
|
8
|
-
* @param {Function} props.onConnected
|
|
5
|
+
* @param {object} [props]
|
|
6
|
+
* @param {boolean} [props.active]
|
|
7
|
+
* @param {number} [props.debounce]
|
|
8
|
+
* @param {Function} [props.onConnected]
|
|
9
9
|
* @returns {void}
|
|
10
10
|
*/
|
|
11
|
-
declare function apiMakerUseUpdatedEvent(model: import("./base-model.js").default, onUpdated: Function, props?: {
|
|
12
|
-
active
|
|
13
|
-
debounce
|
|
14
|
-
onConnected
|
|
11
|
+
declare function apiMakerUseUpdatedEvent(model: import("./base-model.js").default | import("./base-model.js").default[], onUpdated: Function, props?: {
|
|
12
|
+
active?: boolean;
|
|
13
|
+
debounce?: number;
|
|
14
|
+
onConnected?: Function;
|
|
15
15
|
}): void;
|
|
16
16
|
//# sourceMappingURL=use-updated-event.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-updated-event.d.ts","sourceRoot":"/src/","sources":["use-updated-event.js"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"use-updated-event.d.ts","sourceRoot":"/src/","sources":["use-updated-event.js"],"names":[],"mappings":";AA0CA;;;;;;;;GAQG;AACH,gDARW,OAAO,iBAAiB,EAAE,OAAO,GAAC,OAAO,iBAAiB,EAAE,OAAO,EAAE,+BAG7E;IAAwB,MAAM,GAAtB,OAAO;IACQ,QAAQ,GAAvB,MAAM;IACW,WAAW;CACpC,GAAU,IAAI,CA0EhB"}
|
|
@@ -1,19 +1,51 @@
|
|
|
1
1
|
/* eslint-disable sort-imports */
|
|
2
|
-
import { useCallback, useLayoutEffect, useMemo } from "react";
|
|
2
|
+
import { useCallback, useLayoutEffect, useMemo, useRef } from "react";
|
|
3
3
|
import debounceFunction from "debounce";
|
|
4
4
|
import ModelEvents from "./model-events.js";
|
|
5
5
|
import useShape from "set-state-compare/build/use-shape.js";
|
|
6
6
|
/**
|
|
7
|
-
* @param {
|
|
7
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
8
|
+
* @returns {object[]}
|
|
9
|
+
*/
|
|
10
|
+
const modelsFromInput = (modelOrModels) => {
|
|
11
|
+
if (!modelOrModels) {
|
|
12
|
+
return [];
|
|
13
|
+
}
|
|
14
|
+
else if (Array.isArray(modelOrModels)) {
|
|
15
|
+
return modelOrModels.filter(Boolean);
|
|
16
|
+
}
|
|
17
|
+
else {
|
|
18
|
+
return [modelOrModels];
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
/**
|
|
22
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
23
|
+
* @returns {string}
|
|
24
|
+
*/
|
|
25
|
+
const modelsDependencyKey = (modelOrModels) => JSON.stringify(modelsFromInput(modelOrModels).map((model) => model.id()));
|
|
26
|
+
/**
|
|
27
|
+
* @param {object|object[]|undefined|null} modelOrModels
|
|
28
|
+
* @returns {Record<string, object>}
|
|
29
|
+
*/
|
|
30
|
+
const modelsByIdFromInput = (modelOrModels) => {
|
|
31
|
+
const modelsById = {};
|
|
32
|
+
modelsFromInput(modelOrModels).forEach((model) => {
|
|
33
|
+
modelsById[model.id()] = model;
|
|
34
|
+
});
|
|
35
|
+
return modelsById;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* @param {import("./base-model.js").default|import("./base-model.js").default[]} model
|
|
8
39
|
* @param {Function} onUpdated
|
|
9
|
-
* @param {object} props
|
|
10
|
-
* @param {boolean} props.active
|
|
11
|
-
* @param {number} props.debounce
|
|
12
|
-
* @param {Function} props.onConnected
|
|
40
|
+
* @param {object} [props]
|
|
41
|
+
* @param {boolean} [props.active]
|
|
42
|
+
* @param {number} [props.debounce]
|
|
43
|
+
* @param {Function} [props.onConnected]
|
|
13
44
|
* @returns {void}
|
|
14
45
|
*/
|
|
15
46
|
const apiMakerUseUpdatedEvent = (model, onUpdated, props = {}) => {
|
|
16
47
|
const { active = true, debounce, onConnected, ...restProps } = props;
|
|
48
|
+
const connectionsRef = useRef({});
|
|
17
49
|
if (Object.keys(restProps).length > 0) {
|
|
18
50
|
throw new Error(`Unknown props given to useUpdatedEvent: ${Object.keys(restProps).join(", ")}`);
|
|
19
51
|
}
|
|
@@ -39,22 +71,37 @@ const apiMakerUseUpdatedEvent = (model, onUpdated, props = {}) => {
|
|
|
39
71
|
}
|
|
40
72
|
}, []);
|
|
41
73
|
useLayoutEffect(() => {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
74
|
+
const currentConnections = connectionsRef.current;
|
|
75
|
+
const nextModelsById = modelsByIdFromInput(model);
|
|
76
|
+
Object.keys(currentConnections).forEach((modelId) => {
|
|
77
|
+
if (!(modelId in nextModelsById)) {
|
|
78
|
+
if (onConnected) {
|
|
79
|
+
currentConnections[modelId].events.removeListener("connected", onConnected);
|
|
80
|
+
}
|
|
81
|
+
currentConnections[modelId].unsubscribe();
|
|
82
|
+
delete currentConnections[modelId];
|
|
47
83
|
}
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
if (
|
|
51
|
-
|
|
84
|
+
});
|
|
85
|
+
Object.keys(nextModelsById).forEach((modelId) => {
|
|
86
|
+
if (modelId in currentConnections) {
|
|
87
|
+
return;
|
|
52
88
|
}
|
|
53
|
-
|
|
54
|
-
|
|
89
|
+
const updatedConnection = ModelEvents.connectUpdated(nextModelsById[modelId], onUpdatedCallback);
|
|
90
|
+
currentConnections[modelId] = updatedConnection;
|
|
91
|
+
if (onConnected) {
|
|
92
|
+
updatedConnection.events.addListener("connected", onConnected);
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}, [modelsDependencyKey(model)]);
|
|
96
|
+
useLayoutEffect(() => () => {
|
|
97
|
+
Object.values(connectionsRef.current).forEach((updatedConnection) => {
|
|
98
|
+
if (onConnected) {
|
|
99
|
+
updatedConnection.events.removeListener("connected", onConnected);
|
|
55
100
|
}
|
|
56
|
-
|
|
57
|
-
|
|
101
|
+
updatedConnection.unsubscribe();
|
|
102
|
+
});
|
|
103
|
+
connectionsRef.current = {};
|
|
104
|
+
}, []);
|
|
58
105
|
};
|
|
59
106
|
export default apiMakerUseUpdatedEvent;
|
|
60
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlLXVwZGF0ZWQtZXZlbnQuanMiLCJzb3VyY2VSb290IjoiL3NyYy8iLCJzb3VyY2VzIjpbInVzZS11cGRhdGVkLWV2ZW50LmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGlDQUFpQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFDLE1BQU0sT0FBTyxDQUFBO0FBQ25FLE9BQU8sZ0JBQWdCLE1BQU0sVUFBVSxDQUFBO0FBQ3ZDLE9BQU8sV0FBVyxNQUFNLG1CQUFtQixDQUFBO0FBQzNDLE9BQU8sUUFBUSxNQUFNLHNDQUFzQyxDQUFBO0FBRTNEOzs7R0FHRztBQUNILE1BQU0sZUFBZSxHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUU7SUFDeEMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE9BQU8sRUFBRSxDQUFBO0lBQ1gsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1FBQ3hDLE9BQU8sYUFBYSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN0QyxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxhQUFhLENBQUMsQ0FBQTtJQUN4QixDQUFDO0FBQ0gsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FDM0QsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQzFELENBQUE7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLG1CQUFtQixHQUFHLENBQUMsYUFBYSxFQUFFLEVBQUU7SUFDNUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFBO0lBRXJCLGVBQWUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxL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QyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUM5QyxJQUFJLE9BQU8sSUFBSSxrQkFBa0IsRUFBRSxDQUFDO2dCQUNsQyxPQUFNO1lBQ1IsQ0FBQztZQUVELE1BQU0saUJBQWlCLEdBQUcsV0FBVyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQTtZQUNoRyxrQkFBa0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxpQkFBaUIsQ0FBQTtZQUUvQyxJQUFJLFdBQVcsRUFBRSxDQUFDO2dCQUNoQixpQkFBaUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQTtZQUNoRSxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFFaEMsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRTtRQUN6QixNQUFNLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFO1lBQ2xFLElBQUksV0FBVyxFQUFFLENBQUM7Z0JBQ2hCLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFBO1lBQ25FLENBQUM7WUFFRCxpQkFBaUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQTtRQUNqQyxDQUFDLENBQUMsQ0FBQTtRQUVGLGNBQWMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFBO0lBQzdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQTtBQUNSLENBQUMsQ0FBQTtBQUVELGVBQWUsdUJBQXVCLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBzb3J0LWltcG9ydHMgKi9cbmltcG9ydCB7dXNlQ2FsbGJhY2ssIHVzZUxheW91dEVmZmVjdCwgdXNlTWVtbywgdXNlUmVmfSBmcm9tIFwicmVhY3RcIlxuaW1wb3J0IGRlYm91bmNlRnVuY3Rpb24gZnJvbSBcImRlYm91bmNlXCJcbmltcG9ydCBNb2RlbEV2ZW50cyBmcm9tIFwiLi9tb2RlbC1ldmVudHMuanNcIlxuaW1wb3J0IHVzZVNoYXBlIGZyb20gXCJzZXQtc3RhdGUtY29tcGFyZS9idWlsZC91c2Utc2hhcGUuanNcIlxuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0fG9iamVjdFtdfHVuZGVmaW5lZHxudWxsfSBtb2RlbE9yTW9kZWxzXG4gKiBAcmV0dXJucyB7b2JqZWN0W119XG4gKi9cbmNvbnN0IG1vZGVsc0Zyb21JbnB1dCA9IChtb2RlbE9yTW9kZWxzKSA9PiB7XG4gIGlmICghbW9kZWxPck1vZGVscykge1xuICAgIHJldHVybiBbXVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkobW9kZWxPck1vZGVscykpIHtcbiAgICByZXR1cm4gbW9kZWxPck1vZGVscy5maWx0ZXIoQm9vbGVhbilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gW21vZGVsT3JNb2RlbHNdXG4gIH1cbn1cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdHxvYmplY3RbXXx1bmRlZmluZWR8bnVsbH0gbW9kZWxPck1vZGVsc1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgbW9kZWxzRGVwZW5kZW5jeUtleSA9IChtb2RlbE9yTW9kZWxzKSA9PiBKU09OLnN0cmluZ2lmeShcbiAgbW9kZWxzRnJvbUlucHV0KG1vZGVsT3JNb2RlbHMpLm1hcCgobW9kZWwpID0+IG1vZGVsLmlkKCkpXG4pXG5cbi8qKlxuICogQHBhcmFtIHtvYmplY3R8b2JqZWN0W118dW5kZWZpbmVkfG51bGx9IG1vZGVsT3JNb2RlbHNcbiAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCBvYmplY3Q+fVxuICovXG5jb25zdCBtb2RlbHNCeUlkRnJvbUlucHV0ID0gKG1vZGVsT3JNb2RlbHMpID0+IHtcbiAgY29uc3QgbW9kZWxzQnlJZCA9IHt9XG5cbiAgbW9kZWxzRnJvbUlucHV0KG1vZGVsT3JNb2RlbHMpLmZvckVhY2goKG1vZGVsKSA9PiB7XG4gICAgbW9kZWxzQnlJZFttb2RlbC5pZCgpXSA9IG1vZGVsXG4gIH0pXG5cbiAgcmV0dXJuIG1vZGVsc0J5SWRcbn1cblxuLyoqXG4gKiBAcGFyYW0ge2ltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0fGltcG9ydChcIi4vYmFzZS1tb2RlbC5qc1wiKS5kZWZhdWx0W119IG1vZGVsXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBvblVwZGF0ZWRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbcHJvcHNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtwcm9wcy5hY3RpdmVdXG4gKiBAcGFyYW0ge251bWJlcn0gW3Byb3BzLmRlYm91bmNlXVxuICogQHBhcmFtIHtGdW5jdGlvbn0gW3Byb3BzLm9uQ29ubmVjdGVkXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFwaU1ha2VyVXNlVXBkYXRlZEV2ZW50ID0gKG1vZGVsLCBvblVwZGF0ZWQsIHByb3BzID0ge30pID0+IHtcbiAgY29uc3Qge2FjdGl2ZSA9IHRydWUsIGRlYm91bmNlLCBvbkNvbm5lY3RlZCwgLi4ucmVzdFByb3BzfSA9IHByb3BzXG4gIGNvbnN0IGNvbm5lY3Rpb25zUmVmID0gdXNlUmVmKHt9KVxuXG4gIGlmIChPYmplY3Qua2V5cyhyZXN0UHJvcHMpLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvcHMgZ2l2ZW4gdG8gdXNlVXBkYXRlZEV2ZW50OiAke09iamVjdC5rZXlzKHJlc3RQcm9wcykuam9pbihcIiwgXCIpfWApXG4gIH1cblxuICBjb25zdCBzID0gdXNlU2hhcGUoe2FjdGl2ZSwgZGVib3VuY2UsIG1vZGVsLCBvblVwZGF0ZWR9KVxuXG4gIGNvbnN0IGRlYm91bmNlQ2FsbGJhY2sgPSB1c2VNZW1vKCgpID0+IHtcbiAgICBpZiAodHlwZW9mIGRlYm91bmNlID09IFwibnVtYmVyXCIpIHtcbiAgICAgIHJldHVybiBkZWJvdW5jZUZ1bmN0aW9uKHMucC5vblVwZGF0ZWQsIGRlYm91bmNlKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZGVib3VuY2VGdW5jdGlvbihzLnAub25VcGRhdGVkKVxuICAgIH1cbiAgfSwgW2RlYm91bmNlXSlcblxuICBzLnVwZGF0ZU1ldGEoe2RlYm91bmNlQ2FsbGJhY2t9KVxuXG4gIGNvbnN0IG9uVXBkYXRlZENhbGxiYWNrID0gdXNlQ2FsbGJhY2soKC4uLmFyZ3MpID0+IHtcbiAgICBpZiAoIXMucC5hY3RpdmUpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChzLnAuZGVib3VuY2UpIHtcbiAgICAgIHMubS5kZWJvdW5jZUNhbGxiYWNrKC4uLmFyZ3MpXG4gICAgfSBlbHNlIHtcbiAgICAgIHMucC5vblVwZGF0ZWQoLi4uYXJncylcbiAgICB9XG4gIH0sIFtdKVxuXG4gIHVzZUxheW91dEVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgY3VycmVudENvbm5lY3Rpb25zID0gY29ubmVjdGlvbnNSZWYuY3VycmVudFxuICAgIGNvbnN0IG5leHRNb2RlbHNCeUlkID0gbW9kZWxzQnlJZEZyb21JbnB1dChtb2RlbClcblxuICAgIE9iamVjdC5rZXlzKGN1cnJlbnRDb25uZWN0aW9ucykuZm9yRWFjaCgobW9kZWxJZCkgPT4ge1xuICAgICAgaWYgKCEobW9kZWxJZCBpbiBuZXh0TW9kZWxzQnlJZCkpIHtcbiAgICAgICAgaWYgKG9uQ29ubmVjdGVkKSB7XG4gICAgICAgICAgY3VycmVudENvbm5lY3Rpb25zW21vZGVsSWRdLmV2ZW50cy5yZW1vdmVMaXN0ZW5lcihcImNvbm5lY3RlZFwiLCBvbkNvbm5lY3RlZClcbiAgICAgICAgfVxuXG4gICAgICAgIGN1cnJlbnRDb25uZWN0aW9uc1ttb2RlbElkXS51bnN1YnNjcmliZSgpXG4gICAgICAgIGRlbGV0ZSBjdXJyZW50Q29ubmVjdGlvbnNbbW9kZWxJZF1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgT2JqZWN0LmtleXMobmV4dE1vZGVsc0J5SWQpLmZvckVhY2goKG1vZGVsSWQpID0+IHtcbiAgICAgIGlmIChtb2RlbElkIGluIGN1cnJlbnRDb25uZWN0aW9ucykge1xuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3QgdXBkYXRlZENvbm5lY3Rpb24gPSBNb2RlbEV2ZW50cy5jb25uZWN0VXBkYXRlZChuZXh0TW9kZWxzQnlJZFttb2RlbElkXSwgb25VcGRhdGVkQ2FsbGJhY2spXG4gICAgICBjdXJyZW50Q29ubmVjdGlvbnNbbW9kZWxJZF0gPSB1cGRhdGVkQ29ubmVjdGlvblxuXG4gICAgICBpZiAob25Db25uZWN0ZWQpIHtcbiAgICAgICAgdXBkYXRlZENvbm5lY3Rpb24uZXZlbnRzLmFkZExpc3RlbmVyKFwiY29ubmVjdGVkXCIsIG9uQ29ubmVjdGVkKVxuICAgICAgfVxuICAgIH0pXG4gIH0sIFttb2RlbHNEZXBlbmRlbmN5S2V5KG1vZGVsKV0pXG5cbiAgdXNlTGF5b3V0RWZmZWN0KCgpID0+ICgpID0+IHtcbiAgICBPYmplY3QudmFsdWVzKGNvbm5lY3Rpb25zUmVmLmN1cnJlbnQpLmZvckVhY2goKHVwZGF0ZWRDb25uZWN0aW9uKSA9PiB7XG4gICAgICBpZiAob25Db25uZWN0ZWQpIHtcbiAgICAgICAgdXBkYXRlZENvbm5lY3Rpb24uZXZlbnRzLnJlbW92ZUxpc3RlbmVyKFwiY29ubmVjdGVkXCIsIG9uQ29ubmVjdGVkKVxuICAgICAgfVxuXG4gICAgICB1cGRhdGVkQ29ubmVjdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfSlcblxuICAgIGNvbm5lY3Rpb25zUmVmLmN1cnJlbnQgPSB7fVxuICB9LCBbXSlcbn1cblxuZXhwb3J0IGRlZmF1bHQgYXBpTWFrZXJVc2VVcGRhdGVkRXZlbnRcbiJdfQ==
|