@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.
Files changed (71) hide show
  1. package/dist/app.d.ts +73 -2
  2. package/dist/app.js +112 -9
  3. package/dist/app.js.map +6 -5
  4. package/dist/components/builtin.js +112 -9
  5. package/dist/components/builtin.js.map +6 -5
  6. package/dist/context.d.ts +8 -0
  7. package/dist/context.js +6 -2
  8. package/dist/context.js.map +3 -3
  9. package/dist/datasource.d.ts +168 -0
  10. package/dist/discovery.js +114 -9
  11. package/dist/discovery.js.map +7 -6
  12. package/dist/disposable.js +6 -2
  13. package/dist/disposable.js.map +2 -2
  14. package/dist/engine.browser.d.ts +15 -0
  15. package/dist/engine.browser.js +19 -2
  16. package/dist/engine.browser.js.map +3 -3
  17. package/dist/engine.d.ts +22 -0
  18. package/dist/engine.js +37 -3
  19. package/dist/engine.js.map +3 -3
  20. package/dist/events.js +6 -2
  21. package/dist/events.js.map +2 -2
  22. package/dist/index.browser.js +295 -179
  23. package/dist/index.browser.js.map +9 -8
  24. package/dist/index.d.ts +3 -1
  25. package/dist/index.js +298 -179
  26. package/dist/index.js.map +10 -9
  27. package/dist/loader.js +6 -2
  28. package/dist/loader.js.map +2 -2
  29. package/dist/logger.js +6 -2
  30. package/dist/logger.js.map +2 -2
  31. package/dist/plugin.js +6 -2
  32. package/dist/plugin.js.map +2 -2
  33. package/dist/remote/client.js +6 -2
  34. package/dist/remote/client.js.map +2 -2
  35. package/dist/remote/index.js +152 -11
  36. package/dist/remote/index.js.map +9 -8
  37. package/dist/remote/server.js +152 -11
  38. package/dist/remote/server.js.map +9 -8
  39. package/dist/renderer.js +6 -2
  40. package/dist/renderer.js.map +2 -2
  41. package/dist/resolver.js +6 -2
  42. package/dist/resolver.js.map +2 -2
  43. package/dist/router.d.ts +9 -0
  44. package/dist/router.js +186 -18
  45. package/dist/router.js.map +6 -5
  46. package/dist/state.js +13 -6
  47. package/dist/state.js.map +3 -3
  48. package/package.json +1 -1
  49. package/src/app.ts +121 -4
  50. package/src/context.ts +10 -2
  51. package/src/datasource.ts +252 -0
  52. package/src/discovery.ts +2 -0
  53. package/src/engine.browser.ts +30 -0
  54. package/src/engine.ts +56 -1
  55. package/src/index.ts +16 -0
  56. package/src/managed-router.ts +3 -0
  57. package/src/remote/server.ts +11 -2
  58. package/src/router.ts +36 -10
  59. package/src/state.ts +10 -3
  60. package/wasm-browser/README.md +10 -10
  61. package/wasm-browser/hypen_engine.d.ts +368 -131
  62. package/wasm-browser/hypen_engine.js +896 -645
  63. package/wasm-browser/hypen_engine_bg.wasm +0 -0
  64. package/wasm-browser/hypen_engine_bg.wasm.d.ts +20 -13
  65. package/wasm-browser/package.json +1 -1
  66. package/wasm-node/README.md +10 -10
  67. package/wasm-node/hypen_engine.d.ts +318 -89
  68. package/wasm-node/hypen_engine.js +832 -613
  69. package/wasm-node/hypen_engine_bg.wasm +0 -0
  70. package/wasm-node/hypen_engine_bg.wasm.d.ts +20 -13
  71. package/wasm-node/package.json +1 -1
@@ -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: (newValue) => all[name] = () => newValue
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
- if (prop in obj) {
221
- delete obj[prop];
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 true;
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
- if (ctx.__hypenEngine) {
760
- api.__hypenEngine = ctx.__hypenEngine;
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 log4 = frameworkLoggers.router;
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
- window.addEventListener("popstate", () => {
1192
+ this.browserListeners.push(disposableListener(window, "popstate", () => {
941
1193
  const newPath = this.getPathFromBrowser();
942
1194
  this.updatePath(newPath, false);
943
- });
944
- window.addEventListener("hashchange", () => {
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
- log4.debug("Router initialized at:", initialPath);
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
- log4.debug("push:", path);
1224
+ log5.debug("push:", path);
973
1225
  this.updatePath(path, true);
974
1226
  }
975
1227
  replace(path) {
976
- log4.debug("replace:", path);
1228
+ log5.debug("replace:", path);
977
1229
  this.updatePath(path, true, true);
978
1230
  }
979
1231
  back() {
980
- log4.debug("back");
1232
+ log5.debug("back");
981
1233
  if (typeof window !== "undefined") {
982
1234
  window.history.back();
983
1235
  }
984
1236
  }
985
1237
  forward() {
986
- log4.debug("forward");
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
- log4.error("Error in route subscriber:", error);
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
- log4.error("Error in route subscriber:", error);
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 log5 = frameworkLoggers.events;
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
- log5.error(`Error in event handler for "${String(event)}":`, error);
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 log6 = frameworkLoggers.context;
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
- log6.warn(`Module "${id}" is already registered. Overwriting.`);
1456
+ log7.warn(`Module "${id}" is already registered. Overwriting.`);
1193
1457
  }
1194
1458
  this.modules.set(id, instance);
1195
- log6.debug(`Registered module: ${id}`);
1459
+ log7.debug(`Registered module: ${id}`);
1196
1460
  }
1197
1461
  unregisterModule(id) {
1198
1462
  this.modules.delete(id);
1199
- log6.debug(`Unregistered module: ${id}`);
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
- log6.debug(`Event "${event}" emitted but no listeners`);
1492
+ log7.debug(`Event "${event}" emitted but no listeners`);
1229
1493
  } else {
1230
- log6.debug(`Emitting event: ${event}`, payload);
1494
+ log7.debug(`Emitting event: ${event}`, payload);
1231
1495
  handlers.forEach((handler) => {
1232
1496
  try {
1233
1497
  handler(payload);
1234
1498
  } catch (error) {
1235
- log6.error(`Error in event handler for "${event}":`, error);
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
- log6.debug(`Listening to event: ${event}`);
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=59E60B38E559B44564756E2164756E21
1973
+ //# debugId=36DBB2A8D0751B8C64756E2164756E21