@hypen-space/core 0.4.32 → 0.4.35
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/dist/app.d.ts +73 -2
- package/dist/app.js +112 -9
- package/dist/app.js.map +6 -5
- package/dist/components/builtin.js +112 -9
- package/dist/components/builtin.js.map +6 -5
- package/dist/context.d.ts +8 -0
- package/dist/context.js +6 -2
- package/dist/context.js.map +3 -3
- package/dist/datasource.d.ts +168 -0
- package/dist/discovery.js +114 -9
- package/dist/discovery.js.map +7 -6
- package/dist/disposable.js +6 -2
- package/dist/disposable.js.map +2 -2
- package/dist/engine.browser.d.ts +15 -0
- package/dist/engine.browser.js +19 -2
- package/dist/engine.browser.js.map +3 -3
- package/dist/engine.d.ts +22 -0
- package/dist/engine.js +37 -3
- package/dist/engine.js.map +3 -3
- package/dist/events.js +6 -2
- package/dist/events.js.map +2 -2
- package/dist/index.browser.js +295 -179
- package/dist/index.browser.js.map +9 -8
- package/dist/index.d.ts +3 -1
- package/dist/index.js +298 -179
- package/dist/index.js.map +10 -9
- package/dist/loader.js +6 -2
- package/dist/loader.js.map +2 -2
- package/dist/logger.js +6 -2
- package/dist/logger.js.map +2 -2
- package/dist/plugin.js +6 -2
- package/dist/plugin.js.map +2 -2
- package/dist/remote/client.js +6 -2
- package/dist/remote/client.js.map +2 -2
- package/dist/remote/index.js +152 -11
- package/dist/remote/index.js.map +9 -8
- package/dist/remote/server.js +152 -11
- package/dist/remote/server.js.map +9 -8
- package/dist/renderer.js +6 -2
- package/dist/renderer.js.map +2 -2
- package/dist/resolver.js +6 -2
- package/dist/resolver.js.map +2 -2
- package/dist/router.d.ts +9 -0
- package/dist/router.js +186 -18
- package/dist/router.js.map +6 -5
- package/dist/state.js +13 -6
- package/dist/state.js.map +3 -3
- package/package.json +1 -1
- package/src/app.ts +121 -4
- package/src/context.ts +10 -2
- package/src/datasource.ts +252 -0
- package/src/discovery.ts +2 -0
- package/src/engine.browser.ts +30 -0
- package/src/engine.ts +56 -1
- package/src/index.ts +16 -0
- package/src/managed-router.ts +3 -0
- package/src/remote/server.ts +11 -2
- package/src/router.ts +36 -10
- package/src/state.ts +10 -3
- package/wasm-browser/README.md +10 -10
- package/wasm-browser/hypen_engine.d.ts +368 -131
- package/wasm-browser/hypen_engine.js +896 -645
- package/wasm-browser/hypen_engine_bg.wasm +0 -0
- package/wasm-browser/hypen_engine_bg.wasm.d.ts +20 -13
- package/wasm-browser/package.json +1 -1
- package/wasm-node/README.md +10 -10
- package/wasm-node/hypen_engine.d.ts +318 -89
- package/wasm-node/hypen_engine.js +832 -613
- package/wasm-node/hypen_engine_bg.wasm +0 -0
- package/wasm-node/hypen_engine_bg.wasm.d.ts +20 -13
- package/wasm-node/package.json +1 -1
package/dist/index.browser.js
CHANGED
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
|
+
var __returnValue = (v) => v;
|
|
3
|
+
function __exportSetter(name, newValue) {
|
|
4
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
5
|
+
}
|
|
2
6
|
var __export = (target, all) => {
|
|
3
7
|
for (var name in all)
|
|
4
8
|
__defProp(target, name, {
|
|
5
9
|
get: all[name],
|
|
6
10
|
enumerable: true,
|
|
7
11
|
configurable: true,
|
|
8
|
-
set: (
|
|
12
|
+
set: __exportSetter.bind(all, name)
|
|
9
13
|
});
|
|
10
14
|
};
|
|
11
15
|
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
@@ -156,9 +160,11 @@ function createObservableState(initialState, options) {
|
|
|
156
160
|
notificationPending = false;
|
|
157
161
|
if (batchDepth === 0) {
|
|
158
162
|
notifyChange();
|
|
159
|
-
}
|
|
163
|
+
} else {}
|
|
160
164
|
});
|
|
161
165
|
}
|
|
166
|
+
} else {
|
|
167
|
+
pendingChange = pendingChange || { paths: [], newValues: {} };
|
|
162
168
|
}
|
|
163
169
|
}
|
|
164
170
|
const proxyCache = new WeakMap;
|
|
@@ -217,11 +223,12 @@ function createObservableState(initialState, options) {
|
|
|
217
223
|
return true;
|
|
218
224
|
},
|
|
219
225
|
deleteProperty(obj, prop) {
|
|
220
|
-
|
|
221
|
-
|
|
226
|
+
const existed = Object.prototype.hasOwnProperty.call(obj, prop);
|
|
227
|
+
const result = delete obj[prop];
|
|
228
|
+
if (existed) {
|
|
222
229
|
scheduleBatch();
|
|
223
230
|
}
|
|
224
|
-
return
|
|
231
|
+
return result;
|
|
225
232
|
}
|
|
226
233
|
});
|
|
227
234
|
proxyCache.set(target, proxy);
|
|
@@ -555,6 +562,59 @@ var init_result = __esm(() => {
|
|
|
555
562
|
};
|
|
556
563
|
});
|
|
557
564
|
|
|
565
|
+
// src/datasource.ts
|
|
566
|
+
class DataSourceManager {
|
|
567
|
+
plugins = new Map;
|
|
568
|
+
configs = new Map;
|
|
569
|
+
state = new Map;
|
|
570
|
+
engine;
|
|
571
|
+
constructor(engine) {
|
|
572
|
+
this.engine = engine;
|
|
573
|
+
}
|
|
574
|
+
async use(plugin, config2) {
|
|
575
|
+
const { name } = plugin;
|
|
576
|
+
this.state.set(name, {});
|
|
577
|
+
this.plugins.set(name, plugin);
|
|
578
|
+
this.configs.set(name, config2);
|
|
579
|
+
await plugin.connect(config2, (change) => {
|
|
580
|
+
const current = this.state.get(name) ?? {};
|
|
581
|
+
for (const path of change.paths) {
|
|
582
|
+
if (path in change.values) {
|
|
583
|
+
current[path] = change.values[path];
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
this.state.set(name, current);
|
|
587
|
+
this.engine.setContext(name, current);
|
|
588
|
+
});
|
|
589
|
+
}
|
|
590
|
+
get(name) {
|
|
591
|
+
return this.plugins.get(name);
|
|
592
|
+
}
|
|
593
|
+
has(name) {
|
|
594
|
+
return this.plugins.has(name);
|
|
595
|
+
}
|
|
596
|
+
getNames() {
|
|
597
|
+
return Array.from(this.plugins.keys());
|
|
598
|
+
}
|
|
599
|
+
getStatus(name) {
|
|
600
|
+
return this.plugins.get(name)?.status;
|
|
601
|
+
}
|
|
602
|
+
async remove(name) {
|
|
603
|
+
const plugin = this.plugins.get(name);
|
|
604
|
+
if (plugin) {
|
|
605
|
+
await plugin.disconnect();
|
|
606
|
+
this.plugins.delete(name);
|
|
607
|
+
this.configs.delete(name);
|
|
608
|
+
this.state.delete(name);
|
|
609
|
+
this.engine.removeContext(name);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
async disconnectAll() {
|
|
613
|
+
const names = Array.from(this.plugins.keys());
|
|
614
|
+
await Promise.all(names.map((name) => this.remove(name)));
|
|
615
|
+
}
|
|
616
|
+
}
|
|
617
|
+
|
|
558
618
|
// src/app.ts
|
|
559
619
|
var exports_app = {};
|
|
560
620
|
__export(exports_app, {
|
|
@@ -576,6 +636,7 @@ class HypenAppBuilder {
|
|
|
576
636
|
errorHandler;
|
|
577
637
|
template;
|
|
578
638
|
_registry;
|
|
639
|
+
dataSourceEntries = [];
|
|
579
640
|
constructor(initialState, options, registry) {
|
|
580
641
|
this.initialState = initialState;
|
|
581
642
|
this.options = options || {};
|
|
@@ -609,10 +670,19 @@ class HypenAppBuilder {
|
|
|
609
670
|
this.errorHandler = fn;
|
|
610
671
|
return this;
|
|
611
672
|
}
|
|
673
|
+
useDataSource(plugin, config2) {
|
|
674
|
+
this.dataSourceEntries.push({ plugin, config: config2 });
|
|
675
|
+
return this;
|
|
676
|
+
}
|
|
612
677
|
ui(template) {
|
|
613
678
|
this.template = template;
|
|
614
679
|
return this.build();
|
|
615
680
|
}
|
|
681
|
+
uiFile(path) {
|
|
682
|
+
const fs = (() => ({}));
|
|
683
|
+
this.template = fs.readFileSync(path, "utf-8").trim();
|
|
684
|
+
return this.build();
|
|
685
|
+
}
|
|
616
686
|
build() {
|
|
617
687
|
const stateKeys = this.initialState !== null && typeof this.initialState === "object" ? Object.keys(this.initialState) : [];
|
|
618
688
|
const definition = {
|
|
@@ -623,6 +693,7 @@ class HypenAppBuilder {
|
|
|
623
693
|
version: this.options.version,
|
|
624
694
|
initialState: this.initialState,
|
|
625
695
|
template: this.template,
|
|
696
|
+
dataSources: this.dataSourceEntries.length > 0 ? this.dataSourceEntries : undefined,
|
|
626
697
|
handlers: {
|
|
627
698
|
onCreated: this.createdHandler,
|
|
628
699
|
onAction: this.actionHandlers,
|
|
@@ -684,6 +755,8 @@ class HypenModuleInstance {
|
|
|
684
755
|
router;
|
|
685
756
|
globalContext;
|
|
686
757
|
stateChangeCallbacks = [];
|
|
758
|
+
dataSourceManager;
|
|
759
|
+
dataSourceAccessor = {};
|
|
687
760
|
constructor(engine, definition, router, globalContext) {
|
|
688
761
|
this.engine = engine;
|
|
689
762
|
this.definition = definition;
|
|
@@ -713,7 +786,8 @@ class HypenModuleInstance {
|
|
|
713
786
|
const result = await this.executeAction(actionName, handler, {
|
|
714
787
|
action: actionCtx,
|
|
715
788
|
state: this.state,
|
|
716
|
-
context
|
|
789
|
+
context,
|
|
790
|
+
dataSources: this.dataSourceAccessor
|
|
717
791
|
});
|
|
718
792
|
if (!result.ok) {
|
|
719
793
|
const shouldRethrow = await this.handleError(result.error, { actionName });
|
|
@@ -756,8 +830,9 @@ class HypenModuleInstance {
|
|
|
756
830
|
on: (event, handler) => ctx.on(event, handler),
|
|
757
831
|
router: this.router
|
|
758
832
|
};
|
|
759
|
-
|
|
760
|
-
|
|
833
|
+
const ctxRecord = ctx;
|
|
834
|
+
if (ctxRecord.__hypenEngine) {
|
|
835
|
+
api.__hypenEngine = ctxRecord.__hypenEngine;
|
|
761
836
|
}
|
|
762
837
|
return api;
|
|
763
838
|
}
|
|
@@ -804,6 +879,25 @@ class HypenModuleInstance {
|
|
|
804
879
|
return false;
|
|
805
880
|
}
|
|
806
881
|
async callCreatedHandler() {
|
|
882
|
+
if (this.definition.dataSources?.length) {
|
|
883
|
+
const dsEngine = this.engine;
|
|
884
|
+
this.dataSourceManager = new DataSourceManager(dsEngine);
|
|
885
|
+
for (const { plugin, config: config2 } of this.definition.dataSources) {
|
|
886
|
+
try {
|
|
887
|
+
await this.dataSourceManager.use(plugin, config2);
|
|
888
|
+
this.dataSourceAccessor[plugin.name] = new Proxy(plugin, {
|
|
889
|
+
get(target, prop) {
|
|
890
|
+
if (typeof prop === "string" && !(prop in target)) {
|
|
891
|
+
return (...args) => target.call(prop, ...args);
|
|
892
|
+
}
|
|
893
|
+
return target[prop];
|
|
894
|
+
}
|
|
895
|
+
});
|
|
896
|
+
} catch (e) {
|
|
897
|
+
log2.error(`Failed to connect data source "${plugin.name}":`, e);
|
|
898
|
+
}
|
|
899
|
+
}
|
|
900
|
+
}
|
|
807
901
|
if (this.definition.handlers.onCreated) {
|
|
808
902
|
const context = this.globalContext ? this.createGlobalContextAPI() : undefined;
|
|
809
903
|
try {
|
|
@@ -823,6 +917,15 @@ class HypenModuleInstance {
|
|
|
823
917
|
async destroy() {
|
|
824
918
|
if (this.isDestroyed)
|
|
825
919
|
return;
|
|
920
|
+
if (this.dataSourceManager) {
|
|
921
|
+
try {
|
|
922
|
+
await this.dataSourceManager.disconnectAll();
|
|
923
|
+
} catch (e) {
|
|
924
|
+
log2.error("Error disconnecting data sources:", e);
|
|
925
|
+
}
|
|
926
|
+
this.dataSourceManager = undefined;
|
|
927
|
+
this.dataSourceAccessor = {};
|
|
928
|
+
}
|
|
826
929
|
if (this.definition.handlers.onDestroyed) {
|
|
827
930
|
try {
|
|
828
931
|
await this.definition.handlers.onDestroyed(this.state);
|
|
@@ -907,16 +1010,165 @@ class ConsoleRenderer {
|
|
|
907
1010
|
}
|
|
908
1011
|
}
|
|
909
1012
|
|
|
1013
|
+
// src/disposable.ts
|
|
1014
|
+
init_logger();
|
|
1015
|
+
var log4 = frameworkLoggers.lifecycle;
|
|
1016
|
+
function isDisposable(obj) {
|
|
1017
|
+
return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
|
|
1018
|
+
}
|
|
1019
|
+
|
|
1020
|
+
class DisposableStack {
|
|
1021
|
+
stack = [];
|
|
1022
|
+
disposed = false;
|
|
1023
|
+
add(disposable) {
|
|
1024
|
+
if (this.disposed) {
|
|
1025
|
+
disposable.dispose();
|
|
1026
|
+
return disposable;
|
|
1027
|
+
}
|
|
1028
|
+
this.stack.push(disposable);
|
|
1029
|
+
return disposable;
|
|
1030
|
+
}
|
|
1031
|
+
addCallback(callback) {
|
|
1032
|
+
this.add({ dispose: callback });
|
|
1033
|
+
}
|
|
1034
|
+
addValue(value, dispose) {
|
|
1035
|
+
this.add({ dispose: () => dispose(value) });
|
|
1036
|
+
return value;
|
|
1037
|
+
}
|
|
1038
|
+
dispose() {
|
|
1039
|
+
if (this.disposed)
|
|
1040
|
+
return;
|
|
1041
|
+
this.disposed = true;
|
|
1042
|
+
while (this.stack.length > 0) {
|
|
1043
|
+
const item = this.stack.pop();
|
|
1044
|
+
try {
|
|
1045
|
+
item.dispose();
|
|
1046
|
+
} catch (error) {
|
|
1047
|
+
log4.error("Error during dispose:", error);
|
|
1048
|
+
}
|
|
1049
|
+
}
|
|
1050
|
+
}
|
|
1051
|
+
get isDisposed() {
|
|
1052
|
+
return this.disposed;
|
|
1053
|
+
}
|
|
1054
|
+
get size() {
|
|
1055
|
+
return this.stack.length;
|
|
1056
|
+
}
|
|
1057
|
+
}
|
|
1058
|
+
function disposableListener(target, event, handler, options) {
|
|
1059
|
+
target.addEventListener(event, handler, options);
|
|
1060
|
+
return {
|
|
1061
|
+
dispose: () => target.removeEventListener(event, handler, options)
|
|
1062
|
+
};
|
|
1063
|
+
}
|
|
1064
|
+
function disposableTimeout(callback, ms) {
|
|
1065
|
+
const id = setTimeout(callback, ms);
|
|
1066
|
+
return {
|
|
1067
|
+
id,
|
|
1068
|
+
dispose: () => clearTimeout(id)
|
|
1069
|
+
};
|
|
1070
|
+
}
|
|
1071
|
+
function disposableInterval(callback, ms) {
|
|
1072
|
+
const id = setInterval(callback, ms);
|
|
1073
|
+
return {
|
|
1074
|
+
id,
|
|
1075
|
+
dispose: () => clearInterval(id)
|
|
1076
|
+
};
|
|
1077
|
+
}
|
|
1078
|
+
function disposableWebSocket(ws) {
|
|
1079
|
+
return {
|
|
1080
|
+
dispose: () => {
|
|
1081
|
+
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
1082
|
+
ws.close();
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
};
|
|
1086
|
+
}
|
|
1087
|
+
function disposableAbortController() {
|
|
1088
|
+
const controller = new AbortController;
|
|
1089
|
+
return {
|
|
1090
|
+
controller,
|
|
1091
|
+
signal: controller.signal,
|
|
1092
|
+
dispose: () => controller.abort()
|
|
1093
|
+
};
|
|
1094
|
+
}
|
|
1095
|
+
function disposableSubscription(unsubscribe) {
|
|
1096
|
+
return { dispose: unsubscribe };
|
|
1097
|
+
}
|
|
1098
|
+
var ELEMENT_DISPOSABLES = Symbol("hypen.disposables");
|
|
1099
|
+
function getElementDisposables(element) {
|
|
1100
|
+
const existing = element[ELEMENT_DISPOSABLES];
|
|
1101
|
+
if (existing instanceof DisposableStack) {
|
|
1102
|
+
return existing;
|
|
1103
|
+
}
|
|
1104
|
+
const stack = new DisposableStack;
|
|
1105
|
+
element[ELEMENT_DISPOSABLES] = stack;
|
|
1106
|
+
return stack;
|
|
1107
|
+
}
|
|
1108
|
+
function disposeElement(element) {
|
|
1109
|
+
const stack = element[ELEMENT_DISPOSABLES];
|
|
1110
|
+
if (stack instanceof DisposableStack) {
|
|
1111
|
+
stack.dispose();
|
|
1112
|
+
delete element[ELEMENT_DISPOSABLES];
|
|
1113
|
+
}
|
|
1114
|
+
}
|
|
1115
|
+
function hasElementDisposables(element) {
|
|
1116
|
+
return element[ELEMENT_DISPOSABLES] instanceof DisposableStack;
|
|
1117
|
+
}
|
|
1118
|
+
|
|
1119
|
+
class DisposableMixin {
|
|
1120
|
+
disposables = new DisposableStack;
|
|
1121
|
+
track(disposable) {
|
|
1122
|
+
return this.disposables.add(disposable);
|
|
1123
|
+
}
|
|
1124
|
+
onDispose(callback) {
|
|
1125
|
+
this.disposables.addCallback(callback);
|
|
1126
|
+
}
|
|
1127
|
+
dispose() {
|
|
1128
|
+
this.disposables.dispose();
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
1131
|
+
function compositeDisposable(...disposables) {
|
|
1132
|
+
return {
|
|
1133
|
+
dispose: () => {
|
|
1134
|
+
for (const d of disposables) {
|
|
1135
|
+
try {
|
|
1136
|
+
d.dispose();
|
|
1137
|
+
} catch (error) {
|
|
1138
|
+
log4.error("Error during dispose:", error);
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
};
|
|
1143
|
+
}
|
|
1144
|
+
async function using(resource, fn) {
|
|
1145
|
+
const r = typeof resource === "function" ? resource() : resource;
|
|
1146
|
+
try {
|
|
1147
|
+
return await fn(r);
|
|
1148
|
+
} finally {
|
|
1149
|
+
r.dispose();
|
|
1150
|
+
}
|
|
1151
|
+
}
|
|
1152
|
+
function usingSync(resource, fn) {
|
|
1153
|
+
const r = typeof resource === "function" ? resource() : resource;
|
|
1154
|
+
try {
|
|
1155
|
+
return fn(r);
|
|
1156
|
+
} finally {
|
|
1157
|
+
r.dispose();
|
|
1158
|
+
}
|
|
1159
|
+
}
|
|
1160
|
+
|
|
910
1161
|
// src/router.ts
|
|
911
1162
|
init_state();
|
|
912
1163
|
init_logger();
|
|
913
|
-
var
|
|
1164
|
+
var log5 = frameworkLoggers.router;
|
|
914
1165
|
|
|
915
1166
|
class HypenRouter {
|
|
916
1167
|
state;
|
|
917
1168
|
subscribers = new Set;
|
|
918
1169
|
isInitialized = false;
|
|
919
1170
|
isUpdating = false;
|
|
1171
|
+
browserListeners = [];
|
|
920
1172
|
constructor() {
|
|
921
1173
|
this.state = createObservableState({
|
|
922
1174
|
currentPath: "/",
|
|
@@ -937,18 +1189,18 @@ class HypenRouter {
|
|
|
937
1189
|
this.state.currentPath = initialPath;
|
|
938
1190
|
this.state.params = {};
|
|
939
1191
|
this.state.query = this.parseQuery();
|
|
940
|
-
|
|
1192
|
+
this.browserListeners.push(disposableListener(window, "popstate", () => {
|
|
941
1193
|
const newPath = this.getPathFromBrowser();
|
|
942
1194
|
this.updatePath(newPath, false);
|
|
943
|
-
});
|
|
944
|
-
|
|
1195
|
+
}));
|
|
1196
|
+
this.browserListeners.push(disposableListener(window, "hashchange", () => {
|
|
945
1197
|
if (this.isUpdating)
|
|
946
1198
|
return;
|
|
947
1199
|
const newPath = this.getPathFromBrowser();
|
|
948
1200
|
this.updatePath(newPath, false);
|
|
949
|
-
});
|
|
1201
|
+
}));
|
|
950
1202
|
this.isInitialized = true;
|
|
951
|
-
|
|
1203
|
+
log5.debug("Router initialized at:", initialPath);
|
|
952
1204
|
}
|
|
953
1205
|
getPathFromBrowser() {
|
|
954
1206
|
if (typeof window === "undefined")
|
|
@@ -969,21 +1221,21 @@ class HypenRouter {
|
|
|
969
1221
|
return query;
|
|
970
1222
|
}
|
|
971
1223
|
push(path) {
|
|
972
|
-
|
|
1224
|
+
log5.debug("push:", path);
|
|
973
1225
|
this.updatePath(path, true);
|
|
974
1226
|
}
|
|
975
1227
|
replace(path) {
|
|
976
|
-
|
|
1228
|
+
log5.debug("replace:", path);
|
|
977
1229
|
this.updatePath(path, true, true);
|
|
978
1230
|
}
|
|
979
1231
|
back() {
|
|
980
|
-
|
|
1232
|
+
log5.debug("back");
|
|
981
1233
|
if (typeof window !== "undefined") {
|
|
982
1234
|
window.history.back();
|
|
983
1235
|
}
|
|
984
1236
|
}
|
|
985
1237
|
forward() {
|
|
986
|
-
|
|
1238
|
+
log5.debug("forward");
|
|
987
1239
|
if (typeof window !== "undefined") {
|
|
988
1240
|
window.history.forward();
|
|
989
1241
|
}
|
|
@@ -1079,7 +1331,7 @@ class HypenRouter {
|
|
|
1079
1331
|
try {
|
|
1080
1332
|
callback(this.getState());
|
|
1081
1333
|
} catch (error) {
|
|
1082
|
-
|
|
1334
|
+
log5.error("Error in route subscriber:", error);
|
|
1083
1335
|
}
|
|
1084
1336
|
return () => {
|
|
1085
1337
|
this.subscribers.delete(callback);
|
|
@@ -1091,7 +1343,7 @@ class HypenRouter {
|
|
|
1091
1343
|
try {
|
|
1092
1344
|
callback(routeState);
|
|
1093
1345
|
} catch (error) {
|
|
1094
|
-
|
|
1346
|
+
log5.error("Error in route subscriber:", error);
|
|
1095
1347
|
}
|
|
1096
1348
|
});
|
|
1097
1349
|
}
|
|
@@ -1105,11 +1357,23 @@ class HypenRouter {
|
|
|
1105
1357
|
const queryString = new URLSearchParams(query).toString();
|
|
1106
1358
|
return `${path}?${queryString}`;
|
|
1107
1359
|
}
|
|
1360
|
+
dispose() {
|
|
1361
|
+
for (const listener of this.browserListeners) {
|
|
1362
|
+
listener.dispose();
|
|
1363
|
+
}
|
|
1364
|
+
this.browserListeners = [];
|
|
1365
|
+
this.subscribers.clear();
|
|
1366
|
+
this.isInitialized = false;
|
|
1367
|
+
log5.debug("Router disposed");
|
|
1368
|
+
}
|
|
1369
|
+
[Symbol.dispose]() {
|
|
1370
|
+
this.dispose();
|
|
1371
|
+
}
|
|
1108
1372
|
}
|
|
1109
1373
|
|
|
1110
1374
|
// src/events.ts
|
|
1111
1375
|
init_logger();
|
|
1112
|
-
var
|
|
1376
|
+
var log6 = frameworkLoggers.events;
|
|
1113
1377
|
|
|
1114
1378
|
class TypedEventEmitter {
|
|
1115
1379
|
eventBus = new Map;
|
|
@@ -1122,7 +1386,7 @@ class TypedEventEmitter {
|
|
|
1122
1386
|
try {
|
|
1123
1387
|
handler(payload);
|
|
1124
1388
|
} catch (error) {
|
|
1125
|
-
|
|
1389
|
+
log6.error(`Error in event handler for "${String(event)}":`, error);
|
|
1126
1390
|
}
|
|
1127
1391
|
});
|
|
1128
1392
|
}
|
|
@@ -1175,7 +1439,7 @@ function createEventEmitter() {
|
|
|
1175
1439
|
|
|
1176
1440
|
// src/context.ts
|
|
1177
1441
|
init_logger();
|
|
1178
|
-
var
|
|
1442
|
+
var log7 = frameworkLoggers.context;
|
|
1179
1443
|
|
|
1180
1444
|
class HypenGlobalContext {
|
|
1181
1445
|
modules = new Map;
|
|
@@ -1189,14 +1453,14 @@ class HypenGlobalContext {
|
|
|
1189
1453
|
}
|
|
1190
1454
|
registerModule(id, instance) {
|
|
1191
1455
|
if (this.modules.has(id)) {
|
|
1192
|
-
|
|
1456
|
+
log7.warn(`Module "${id}" is already registered. Overwriting.`);
|
|
1193
1457
|
}
|
|
1194
1458
|
this.modules.set(id, instance);
|
|
1195
|
-
|
|
1459
|
+
log7.debug(`Registered module: ${id}`);
|
|
1196
1460
|
}
|
|
1197
1461
|
unregisterModule(id) {
|
|
1198
1462
|
this.modules.delete(id);
|
|
1199
|
-
|
|
1463
|
+
log7.debug(`Unregistered module: ${id}`);
|
|
1200
1464
|
}
|
|
1201
1465
|
getModule(id) {
|
|
1202
1466
|
const module = this.modules.get(id);
|
|
@@ -1225,14 +1489,14 @@ class HypenGlobalContext {
|
|
|
1225
1489
|
emit(event, payload) {
|
|
1226
1490
|
const handlers = this.legacyEventBus.get(event);
|
|
1227
1491
|
if (!handlers || handlers.size === 0) {
|
|
1228
|
-
|
|
1492
|
+
log7.debug(`Event "${event}" emitted but no listeners`);
|
|
1229
1493
|
} else {
|
|
1230
|
-
|
|
1494
|
+
log7.debug(`Emitting event: ${event}`, payload);
|
|
1231
1495
|
handlers.forEach((handler) => {
|
|
1232
1496
|
try {
|
|
1233
1497
|
handler(payload);
|
|
1234
1498
|
} catch (error) {
|
|
1235
|
-
|
|
1499
|
+
log7.error(`Error in event handler for "${event}":`, error);
|
|
1236
1500
|
}
|
|
1237
1501
|
});
|
|
1238
1502
|
}
|
|
@@ -1246,7 +1510,7 @@ class HypenGlobalContext {
|
|
|
1246
1510
|
}
|
|
1247
1511
|
const handlers = this.legacyEventBus.get(event);
|
|
1248
1512
|
handlers.add(handler);
|
|
1249
|
-
|
|
1513
|
+
log7.debug(`Listening to event: ${event}`);
|
|
1250
1514
|
return () => {
|
|
1251
1515
|
handlers.delete(handler);
|
|
1252
1516
|
if (handlers.size === 0) {
|
|
@@ -1279,154 +1543,6 @@ class HypenGlobalContext {
|
|
|
1279
1543
|
}
|
|
1280
1544
|
}
|
|
1281
1545
|
|
|
1282
|
-
// src/disposable.ts
|
|
1283
|
-
init_logger();
|
|
1284
|
-
var log7 = frameworkLoggers.lifecycle;
|
|
1285
|
-
function isDisposable(obj) {
|
|
1286
|
-
return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
|
|
1287
|
-
}
|
|
1288
|
-
|
|
1289
|
-
class DisposableStack {
|
|
1290
|
-
stack = [];
|
|
1291
|
-
disposed = false;
|
|
1292
|
-
add(disposable) {
|
|
1293
|
-
if (this.disposed) {
|
|
1294
|
-
disposable.dispose();
|
|
1295
|
-
return disposable;
|
|
1296
|
-
}
|
|
1297
|
-
this.stack.push(disposable);
|
|
1298
|
-
return disposable;
|
|
1299
|
-
}
|
|
1300
|
-
addCallback(callback) {
|
|
1301
|
-
this.add({ dispose: callback });
|
|
1302
|
-
}
|
|
1303
|
-
addValue(value, dispose) {
|
|
1304
|
-
this.add({ dispose: () => dispose(value) });
|
|
1305
|
-
return value;
|
|
1306
|
-
}
|
|
1307
|
-
dispose() {
|
|
1308
|
-
if (this.disposed)
|
|
1309
|
-
return;
|
|
1310
|
-
this.disposed = true;
|
|
1311
|
-
while (this.stack.length > 0) {
|
|
1312
|
-
const item = this.stack.pop();
|
|
1313
|
-
try {
|
|
1314
|
-
item.dispose();
|
|
1315
|
-
} catch (error) {
|
|
1316
|
-
log7.error("Error during dispose:", error);
|
|
1317
|
-
}
|
|
1318
|
-
}
|
|
1319
|
-
}
|
|
1320
|
-
get isDisposed() {
|
|
1321
|
-
return this.disposed;
|
|
1322
|
-
}
|
|
1323
|
-
get size() {
|
|
1324
|
-
return this.stack.length;
|
|
1325
|
-
}
|
|
1326
|
-
}
|
|
1327
|
-
function disposableListener(target, event, handler, options) {
|
|
1328
|
-
target.addEventListener(event, handler, options);
|
|
1329
|
-
return {
|
|
1330
|
-
dispose: () => target.removeEventListener(event, handler, options)
|
|
1331
|
-
};
|
|
1332
|
-
}
|
|
1333
|
-
function disposableTimeout(callback, ms) {
|
|
1334
|
-
const id = setTimeout(callback, ms);
|
|
1335
|
-
return {
|
|
1336
|
-
id,
|
|
1337
|
-
dispose: () => clearTimeout(id)
|
|
1338
|
-
};
|
|
1339
|
-
}
|
|
1340
|
-
function disposableInterval(callback, ms) {
|
|
1341
|
-
const id = setInterval(callback, ms);
|
|
1342
|
-
return {
|
|
1343
|
-
id,
|
|
1344
|
-
dispose: () => clearInterval(id)
|
|
1345
|
-
};
|
|
1346
|
-
}
|
|
1347
|
-
function disposableWebSocket(ws) {
|
|
1348
|
-
return {
|
|
1349
|
-
dispose: () => {
|
|
1350
|
-
if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
|
|
1351
|
-
ws.close();
|
|
1352
|
-
}
|
|
1353
|
-
}
|
|
1354
|
-
};
|
|
1355
|
-
}
|
|
1356
|
-
function disposableAbortController() {
|
|
1357
|
-
const controller = new AbortController;
|
|
1358
|
-
return {
|
|
1359
|
-
controller,
|
|
1360
|
-
signal: controller.signal,
|
|
1361
|
-
dispose: () => controller.abort()
|
|
1362
|
-
};
|
|
1363
|
-
}
|
|
1364
|
-
function disposableSubscription(unsubscribe) {
|
|
1365
|
-
return { dispose: unsubscribe };
|
|
1366
|
-
}
|
|
1367
|
-
var ELEMENT_DISPOSABLES = Symbol("hypen.disposables");
|
|
1368
|
-
function getElementDisposables(element) {
|
|
1369
|
-
const existing = element[ELEMENT_DISPOSABLES];
|
|
1370
|
-
if (existing instanceof DisposableStack) {
|
|
1371
|
-
return existing;
|
|
1372
|
-
}
|
|
1373
|
-
const stack = new DisposableStack;
|
|
1374
|
-
element[ELEMENT_DISPOSABLES] = stack;
|
|
1375
|
-
return stack;
|
|
1376
|
-
}
|
|
1377
|
-
function disposeElement(element) {
|
|
1378
|
-
const stack = element[ELEMENT_DISPOSABLES];
|
|
1379
|
-
if (stack instanceof DisposableStack) {
|
|
1380
|
-
stack.dispose();
|
|
1381
|
-
delete element[ELEMENT_DISPOSABLES];
|
|
1382
|
-
}
|
|
1383
|
-
}
|
|
1384
|
-
function hasElementDisposables(element) {
|
|
1385
|
-
return element[ELEMENT_DISPOSABLES] instanceof DisposableStack;
|
|
1386
|
-
}
|
|
1387
|
-
|
|
1388
|
-
class DisposableMixin {
|
|
1389
|
-
disposables = new DisposableStack;
|
|
1390
|
-
track(disposable) {
|
|
1391
|
-
return this.disposables.add(disposable);
|
|
1392
|
-
}
|
|
1393
|
-
onDispose(callback) {
|
|
1394
|
-
this.disposables.addCallback(callback);
|
|
1395
|
-
}
|
|
1396
|
-
dispose() {
|
|
1397
|
-
this.disposables.dispose();
|
|
1398
|
-
}
|
|
1399
|
-
}
|
|
1400
|
-
function compositeDisposable(...disposables) {
|
|
1401
|
-
return {
|
|
1402
|
-
dispose: () => {
|
|
1403
|
-
for (const d of disposables) {
|
|
1404
|
-
try {
|
|
1405
|
-
d.dispose();
|
|
1406
|
-
} catch (error) {
|
|
1407
|
-
log7.error("Error during dispose:", error);
|
|
1408
|
-
}
|
|
1409
|
-
}
|
|
1410
|
-
}
|
|
1411
|
-
};
|
|
1412
|
-
}
|
|
1413
|
-
async function using(resource, fn) {
|
|
1414
|
-
const r = typeof resource === "function" ? resource() : resource;
|
|
1415
|
-
try {
|
|
1416
|
-
return await fn(r);
|
|
1417
|
-
} finally {
|
|
1418
|
-
r.dispose();
|
|
1419
|
-
}
|
|
1420
|
-
}
|
|
1421
|
-
function usingSync(resource, fn) {
|
|
1422
|
-
const r = typeof resource === "function" ? resource() : resource;
|
|
1423
|
-
try {
|
|
1424
|
-
return fn(r);
|
|
1425
|
-
} finally {
|
|
1426
|
-
r.dispose();
|
|
1427
|
-
}
|
|
1428
|
-
}
|
|
1429
|
-
|
|
1430
1546
|
// src/remote/client.ts
|
|
1431
1547
|
init_result();
|
|
1432
1548
|
|
|
@@ -1854,4 +1970,4 @@ export {
|
|
|
1854
1970
|
BaseRenderer
|
|
1855
1971
|
};
|
|
1856
1972
|
|
|
1857
|
-
//# debugId=
|
|
1973
|
+
//# debugId=36DBB2A8D0751B8C64756E2164756E21
|