@hypen-space/core 0.4.31 → 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
package/dist/index.d.ts CHANGED
@@ -44,7 +44,9 @@ export type { Patch, Action, RenderCallback, ActionHandler as EngineActionHandle
44
44
  export { app, HypenApp, HypenAppBuilder, HypenModuleInstance } from "./app.js";
45
45
  export { hypen, state, item, index } from "./hypen.js";
46
46
  export type { StateProxy, ItemProxy } from "./hypen.js";
47
- export type { IEngine, ActionContext, GlobalContext, LifecycleHandler, ActionHandlerContext, ActionHandler, HypenModuleDefinition, HypenModule, DisconnectContext, ReconnectContext, ExpireContext, DisconnectHandler, ReconnectHandler, ExpireHandler, ErrorContext, ErrorHandler, ErrorHandlerResult, } from "./app.js";
47
+ export type { IEngine, ActionContext, GlobalContext, LifecycleHandler, ActionHandlerContext, ActionHandler, HypenModuleDefinition, HypenModule, DisconnectContext, ReconnectContext, ExpireContext, DisconnectHandler, ReconnectHandler, ExpireHandler, ErrorContext, ErrorHandler, ErrorHandlerResult, DataSourceAccessor, } from "./app.js";
48
+ export { DataSourceManager } from "./datasource.js";
49
+ export type { DataSourcePlugin, DataSourceStatus, DataSourceQuery, DataSourceSubscription, DataSourceChange, IDataSourceEngine, } from "./datasource.js";
48
50
  export { createObservableState, batchStateUpdates, getStateSnapshot, isStateProxy, unwrapProxy, } from "./state.js";
49
51
  export type { StatePath, StateChange, StateObserverOptions, } from "./state.js";
50
52
  export { BaseRenderer, ConsoleRenderer } from "./renderer.js";
package/dist/index.js CHANGED
@@ -1,12 +1,16 @@
1
1
  import { createRequire } from "node:module";
2
2
  var __defProp = Object.defineProperty;
3
+ var __returnValue = (v) => v;
4
+ function __exportSetter(name, newValue) {
5
+ this[name] = __returnValue.bind(null, newValue);
6
+ }
3
7
  var __export = (target, all) => {
4
8
  for (var name in all)
5
9
  __defProp(target, name, {
6
10
  get: all[name],
7
11
  enumerable: true,
8
12
  configurable: true,
9
- set: (newValue) => all[name] = () => newValue
13
+ set: __exportSetter.bind(all, name)
10
14
  });
11
15
  };
12
16
  var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
@@ -182,6 +186,59 @@ var init_result = __esm(() => {
182
186
  };
183
187
  });
184
188
 
189
+ // src/datasource.ts
190
+ class DataSourceManager {
191
+ plugins = new Map;
192
+ configs = new Map;
193
+ state = new Map;
194
+ engine;
195
+ constructor(engine) {
196
+ this.engine = engine;
197
+ }
198
+ async use(plugin, config) {
199
+ const { name } = plugin;
200
+ this.state.set(name, {});
201
+ this.plugins.set(name, plugin);
202
+ this.configs.set(name, config);
203
+ await plugin.connect(config, (change) => {
204
+ const current = this.state.get(name) ?? {};
205
+ for (const path of change.paths) {
206
+ if (path in change.values) {
207
+ current[path] = change.values[path];
208
+ }
209
+ }
210
+ this.state.set(name, current);
211
+ this.engine.setContext(name, current);
212
+ });
213
+ }
214
+ get(name) {
215
+ return this.plugins.get(name);
216
+ }
217
+ has(name) {
218
+ return this.plugins.has(name);
219
+ }
220
+ getNames() {
221
+ return Array.from(this.plugins.keys());
222
+ }
223
+ getStatus(name) {
224
+ return this.plugins.get(name)?.status;
225
+ }
226
+ async remove(name) {
227
+ const plugin = this.plugins.get(name);
228
+ if (plugin) {
229
+ await plugin.disconnect();
230
+ this.plugins.delete(name);
231
+ this.configs.delete(name);
232
+ this.state.delete(name);
233
+ this.engine.removeContext(name);
234
+ }
235
+ }
236
+ async disconnectAll() {
237
+ const names = Array.from(this.plugins.keys());
238
+ await Promise.all(names.map((name) => this.remove(name)));
239
+ }
240
+ }
241
+
185
242
  // src/state.ts
186
243
  function deepClone(obj) {
187
244
  if (obj === null || typeof obj !== "object") {
@@ -321,9 +378,11 @@ function createObservableState(initialState, options) {
321
378
  notificationPending = false;
322
379
  if (batchDepth === 0) {
323
380
  notifyChange();
324
- }
381
+ } else {}
325
382
  });
326
383
  }
384
+ } else {
385
+ pendingChange = pendingChange || { paths: [], newValues: {} };
327
386
  }
328
387
  }
329
388
  const proxyCache = new WeakMap;
@@ -382,11 +441,12 @@ function createObservableState(initialState, options) {
382
441
  return true;
383
442
  },
384
443
  deleteProperty(obj, prop) {
385
- if (prop in obj) {
386
- delete obj[prop];
444
+ const existed = Object.prototype.hasOwnProperty.call(obj, prop);
445
+ const result = delete obj[prop];
446
+ if (existed) {
387
447
  scheduleBatch();
388
448
  }
389
- return true;
449
+ return result;
390
450
  }
391
451
  });
392
452
  proxyCache.set(target, proxy);
@@ -650,6 +710,7 @@ class HypenAppBuilder {
650
710
  errorHandler;
651
711
  template;
652
712
  _registry;
713
+ dataSourceEntries = [];
653
714
  constructor(initialState, options, registry) {
654
715
  this.initialState = initialState;
655
716
  this.options = options || {};
@@ -683,10 +744,19 @@ class HypenAppBuilder {
683
744
  this.errorHandler = fn;
684
745
  return this;
685
746
  }
747
+ useDataSource(plugin, config2) {
748
+ this.dataSourceEntries.push({ plugin, config: config2 });
749
+ return this;
750
+ }
686
751
  ui(template) {
687
752
  this.template = template;
688
753
  return this.build();
689
754
  }
755
+ uiFile(path) {
756
+ const fs = __require("fs");
757
+ this.template = fs.readFileSync(path, "utf-8").trim();
758
+ return this.build();
759
+ }
690
760
  build() {
691
761
  const stateKeys = this.initialState !== null && typeof this.initialState === "object" ? Object.keys(this.initialState) : [];
692
762
  const definition = {
@@ -697,6 +767,7 @@ class HypenAppBuilder {
697
767
  version: this.options.version,
698
768
  initialState: this.initialState,
699
769
  template: this.template,
770
+ dataSources: this.dataSourceEntries.length > 0 ? this.dataSourceEntries : undefined,
700
771
  handlers: {
701
772
  onCreated: this.createdHandler,
702
773
  onAction: this.actionHandlers,
@@ -758,6 +829,8 @@ class HypenModuleInstance {
758
829
  router;
759
830
  globalContext;
760
831
  stateChangeCallbacks = [];
832
+ dataSourceManager;
833
+ dataSourceAccessor = {};
761
834
  constructor(engine, definition, router, globalContext) {
762
835
  this.engine = engine;
763
836
  this.definition = definition;
@@ -787,7 +860,8 @@ class HypenModuleInstance {
787
860
  const result = await this.executeAction(actionName, handler, {
788
861
  action: actionCtx,
789
862
  state: this.state,
790
- context
863
+ context,
864
+ dataSources: this.dataSourceAccessor
791
865
  });
792
866
  if (!result.ok) {
793
867
  const shouldRethrow = await this.handleError(result.error, { actionName });
@@ -830,8 +904,9 @@ class HypenModuleInstance {
830
904
  on: (event, handler) => ctx.on(event, handler),
831
905
  router: this.router
832
906
  };
833
- if (ctx.__hypenEngine) {
834
- api.__hypenEngine = ctx.__hypenEngine;
907
+ const ctxRecord = ctx;
908
+ if (ctxRecord.__hypenEngine) {
909
+ api.__hypenEngine = ctxRecord.__hypenEngine;
835
910
  }
836
911
  return api;
837
912
  }
@@ -878,6 +953,25 @@ class HypenModuleInstance {
878
953
  return false;
879
954
  }
880
955
  async callCreatedHandler() {
956
+ if (this.definition.dataSources?.length) {
957
+ const dsEngine = this.engine;
958
+ this.dataSourceManager = new DataSourceManager(dsEngine);
959
+ for (const { plugin, config: config2 } of this.definition.dataSources) {
960
+ try {
961
+ await this.dataSourceManager.use(plugin, config2);
962
+ this.dataSourceAccessor[plugin.name] = new Proxy(plugin, {
963
+ get(target, prop) {
964
+ if (typeof prop === "string" && !(prop in target)) {
965
+ return (...args) => target.call(prop, ...args);
966
+ }
967
+ return target[prop];
968
+ }
969
+ });
970
+ } catch (e) {
971
+ log2.error(`Failed to connect data source "${plugin.name}":`, e);
972
+ }
973
+ }
974
+ }
881
975
  if (this.definition.handlers.onCreated) {
882
976
  const context = this.globalContext ? this.createGlobalContextAPI() : undefined;
883
977
  try {
@@ -897,6 +991,15 @@ class HypenModuleInstance {
897
991
  async destroy() {
898
992
  if (this.isDestroyed)
899
993
  return;
994
+ if (this.dataSourceManager) {
995
+ try {
996
+ await this.dataSourceManager.disconnectAll();
997
+ } catch (e) {
998
+ log2.error("Error disconnecting data sources:", e);
999
+ }
1000
+ this.dataSourceManager = undefined;
1001
+ this.dataSourceAccessor = {};
1002
+ }
900
1003
  if (this.definition.handlers.onDestroyed) {
901
1004
  try {
902
1005
  await this.definition.handlers.onDestroyed(this.state);
@@ -1036,14 +1139,165 @@ class ConsoleRenderer {
1036
1139
  }
1037
1140
  // src/router.ts
1038
1141
  init_state();
1142
+
1143
+ // src/disposable.ts
1039
1144
  init_logger();
1040
- var log4 = frameworkLoggers.router;
1145
+ var log4 = frameworkLoggers.lifecycle;
1146
+ function isDisposable(obj) {
1147
+ return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
1148
+ }
1149
+
1150
+ class DisposableStack {
1151
+ stack = [];
1152
+ disposed = false;
1153
+ add(disposable) {
1154
+ if (this.disposed) {
1155
+ disposable.dispose();
1156
+ return disposable;
1157
+ }
1158
+ this.stack.push(disposable);
1159
+ return disposable;
1160
+ }
1161
+ addCallback(callback) {
1162
+ this.add({ dispose: callback });
1163
+ }
1164
+ addValue(value, dispose) {
1165
+ this.add({ dispose: () => dispose(value) });
1166
+ return value;
1167
+ }
1168
+ dispose() {
1169
+ if (this.disposed)
1170
+ return;
1171
+ this.disposed = true;
1172
+ while (this.stack.length > 0) {
1173
+ const item2 = this.stack.pop();
1174
+ try {
1175
+ item2.dispose();
1176
+ } catch (error) {
1177
+ log4.error("Error during dispose:", error);
1178
+ }
1179
+ }
1180
+ }
1181
+ get isDisposed() {
1182
+ return this.disposed;
1183
+ }
1184
+ get size() {
1185
+ return this.stack.length;
1186
+ }
1187
+ }
1188
+ function disposableListener(target, event, handler, options) {
1189
+ target.addEventListener(event, handler, options);
1190
+ return {
1191
+ dispose: () => target.removeEventListener(event, handler, options)
1192
+ };
1193
+ }
1194
+ function disposableTimeout(callback, ms) {
1195
+ const id = setTimeout(callback, ms);
1196
+ return {
1197
+ id,
1198
+ dispose: () => clearTimeout(id)
1199
+ };
1200
+ }
1201
+ function disposableInterval(callback, ms) {
1202
+ const id = setInterval(callback, ms);
1203
+ return {
1204
+ id,
1205
+ dispose: () => clearInterval(id)
1206
+ };
1207
+ }
1208
+ function disposableWebSocket(ws) {
1209
+ return {
1210
+ dispose: () => {
1211
+ if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
1212
+ ws.close();
1213
+ }
1214
+ }
1215
+ };
1216
+ }
1217
+ function disposableAbortController() {
1218
+ const controller = new AbortController;
1219
+ return {
1220
+ controller,
1221
+ signal: controller.signal,
1222
+ dispose: () => controller.abort()
1223
+ };
1224
+ }
1225
+ function disposableSubscription(unsubscribe) {
1226
+ return { dispose: unsubscribe };
1227
+ }
1228
+ var ELEMENT_DISPOSABLES = Symbol("hypen.disposables");
1229
+ function getElementDisposables(element) {
1230
+ const existing = element[ELEMENT_DISPOSABLES];
1231
+ if (existing instanceof DisposableStack) {
1232
+ return existing;
1233
+ }
1234
+ const stack = new DisposableStack;
1235
+ element[ELEMENT_DISPOSABLES] = stack;
1236
+ return stack;
1237
+ }
1238
+ function disposeElement(element) {
1239
+ const stack = element[ELEMENT_DISPOSABLES];
1240
+ if (stack instanceof DisposableStack) {
1241
+ stack.dispose();
1242
+ delete element[ELEMENT_DISPOSABLES];
1243
+ }
1244
+ }
1245
+ function hasElementDisposables(element) {
1246
+ return element[ELEMENT_DISPOSABLES] instanceof DisposableStack;
1247
+ }
1248
+
1249
+ class DisposableMixin {
1250
+ disposables = new DisposableStack;
1251
+ track(disposable) {
1252
+ return this.disposables.add(disposable);
1253
+ }
1254
+ onDispose(callback) {
1255
+ this.disposables.addCallback(callback);
1256
+ }
1257
+ dispose() {
1258
+ this.disposables.dispose();
1259
+ }
1260
+ }
1261
+ function compositeDisposable(...disposables) {
1262
+ return {
1263
+ dispose: () => {
1264
+ for (const d of disposables) {
1265
+ try {
1266
+ d.dispose();
1267
+ } catch (error) {
1268
+ log4.error("Error during dispose:", error);
1269
+ }
1270
+ }
1271
+ }
1272
+ };
1273
+ }
1274
+ async function using(resource, fn) {
1275
+ const r = typeof resource === "function" ? resource() : resource;
1276
+ try {
1277
+ return await fn(r);
1278
+ } finally {
1279
+ r.dispose();
1280
+ }
1281
+ }
1282
+ function usingSync(resource, fn) {
1283
+ const r = typeof resource === "function" ? resource() : resource;
1284
+ try {
1285
+ return fn(r);
1286
+ } finally {
1287
+ r.dispose();
1288
+ }
1289
+ }
1290
+
1291
+ // src/router.ts
1292
+ init_logger();
1293
+ var log5 = frameworkLoggers.router;
1041
1294
 
1042
1295
  class HypenRouter {
1043
1296
  state;
1044
1297
  subscribers = new Set;
1045
1298
  isInitialized = false;
1046
1299
  isUpdating = false;
1300
+ browserListeners = [];
1047
1301
  constructor() {
1048
1302
  this.state = createObservableState({
1049
1303
  currentPath: "/",
@@ -1064,18 +1318,18 @@ class HypenRouter {
1064
1318
  this.state.currentPath = initialPath;
1065
1319
  this.state.params = {};
1066
1320
  this.state.query = this.parseQuery();
1067
- window.addEventListener("popstate", () => {
1321
+ this.browserListeners.push(disposableListener(window, "popstate", () => {
1068
1322
  const newPath = this.getPathFromBrowser();
1069
1323
  this.updatePath(newPath, false);
1070
- });
1071
- window.addEventListener("hashchange", () => {
1324
+ }));
1325
+ this.browserListeners.push(disposableListener(window, "hashchange", () => {
1072
1326
  if (this.isUpdating)
1073
1327
  return;
1074
1328
  const newPath = this.getPathFromBrowser();
1075
1329
  this.updatePath(newPath, false);
1076
- });
1330
+ }));
1077
1331
  this.isInitialized = true;
1078
- log4.debug("Router initialized at:", initialPath);
1332
+ log5.debug("Router initialized at:", initialPath);
1079
1333
  }
1080
1334
  getPathFromBrowser() {
1081
1335
  if (typeof window === "undefined")
@@ -1096,21 +1350,21 @@ class HypenRouter {
1096
1350
  return query;
1097
1351
  }
1098
1352
  push(path) {
1099
- log4.debug("push:", path);
1353
+ log5.debug("push:", path);
1100
1354
  this.updatePath(path, true);
1101
1355
  }
1102
1356
  replace(path) {
1103
- log4.debug("replace:", path);
1357
+ log5.debug("replace:", path);
1104
1358
  this.updatePath(path, true, true);
1105
1359
  }
1106
1360
  back() {
1107
- log4.debug("back");
1361
+ log5.debug("back");
1108
1362
  if (typeof window !== "undefined") {
1109
1363
  window.history.back();
1110
1364
  }
1111
1365
  }
1112
1366
  forward() {
1113
- log4.debug("forward");
1367
+ log5.debug("forward");
1114
1368
  if (typeof window !== "undefined") {
1115
1369
  window.history.forward();
1116
1370
  }
@@ -1206,7 +1460,7 @@ class HypenRouter {
1206
1460
  try {
1207
1461
  callback(this.getState());
1208
1462
  } catch (error) {
1209
- log4.error("Error in route subscriber:", error);
1463
+ log5.error("Error in route subscriber:", error);
1210
1464
  }
1211
1465
  return () => {
1212
1466
  this.subscribers.delete(callback);
@@ -1218,7 +1472,7 @@ class HypenRouter {
1218
1472
  try {
1219
1473
  callback(routeState);
1220
1474
  } catch (error) {
1221
- log4.error("Error in route subscriber:", error);
1475
+ log5.error("Error in route subscriber:", error);
1222
1476
  }
1223
1477
  });
1224
1478
  }
@@ -1232,10 +1486,22 @@ class HypenRouter {
1232
1486
  const queryString = new URLSearchParams(query).toString();
1233
1487
  return `${path}?${queryString}`;
1234
1488
  }
1489
+ dispose() {
1490
+ for (const listener of this.browserListeners) {
1491
+ listener.dispose();
1492
+ }
1493
+ this.browserListeners = [];
1494
+ this.subscribers.clear();
1495
+ this.isInitialized = false;
1496
+ log5.debug("Router disposed");
1497
+ }
1498
+ [Symbol.dispose]() {
1499
+ this.dispose();
1500
+ }
1235
1501
  }
1236
1502
  // src/events.ts
1237
1503
  init_logger();
1238
- var log5 = frameworkLoggers.events;
1504
+ var log6 = frameworkLoggers.events;
1239
1505
 
1240
1506
  class TypedEventEmitter {
1241
1507
  eventBus = new Map;
@@ -1248,7 +1514,7 @@ class TypedEventEmitter {
1248
1514
  try {
1249
1515
  handler(payload);
1250
1516
  } catch (error) {
1251
- log5.error(`Error in event handler for "${String(event)}":`, error);
1517
+ log6.error(`Error in event handler for "${String(event)}":`, error);
1252
1518
  }
1253
1519
  });
1254
1520
  }
@@ -1300,7 +1566,7 @@ function createEventEmitter() {
1300
1566
  }
1301
1567
  // src/context.ts
1302
1568
  init_logger();
1303
- var log6 = frameworkLoggers.context;
1569
+ var log7 = frameworkLoggers.context;
1304
1570
 
1305
1571
  class HypenGlobalContext {
1306
1572
  modules = new Map;
@@ -1314,14 +1580,14 @@ class HypenGlobalContext {
1314
1580
  }
1315
1581
  registerModule(id, instance) {
1316
1582
  if (this.modules.has(id)) {
1317
- log6.warn(`Module "${id}" is already registered. Overwriting.`);
1583
+ log7.warn(`Module "${id}" is already registered. Overwriting.`);
1318
1584
  }
1319
1585
  this.modules.set(id, instance);
1320
- log6.debug(`Registered module: ${id}`);
1586
+ log7.debug(`Registered module: ${id}`);
1321
1587
  }
1322
1588
  unregisterModule(id) {
1323
1589
  this.modules.delete(id);
1324
- log6.debug(`Unregistered module: ${id}`);
1590
+ log7.debug(`Unregistered module: ${id}`);
1325
1591
  }
1326
1592
  getModule(id) {
1327
1593
  const module = this.modules.get(id);
@@ -1350,14 +1616,14 @@ class HypenGlobalContext {
1350
1616
  emit(event, payload) {
1351
1617
  const handlers = this.legacyEventBus.get(event);
1352
1618
  if (!handlers || handlers.size === 0) {
1353
- log6.debug(`Event "${event}" emitted but no listeners`);
1619
+ log7.debug(`Event "${event}" emitted but no listeners`);
1354
1620
  } else {
1355
- log6.debug(`Emitting event: ${event}`, payload);
1621
+ log7.debug(`Emitting event: ${event}`, payload);
1356
1622
  handlers.forEach((handler) => {
1357
1623
  try {
1358
1624
  handler(payload);
1359
1625
  } catch (error) {
1360
- log6.error(`Error in event handler for "${event}":`, error);
1626
+ log7.error(`Error in event handler for "${event}":`, error);
1361
1627
  }
1362
1628
  });
1363
1629
  }
@@ -1371,7 +1637,7 @@ class HypenGlobalContext {
1371
1637
  }
1372
1638
  const handlers = this.legacyEventBus.get(event);
1373
1639
  handlers.add(handler);
1374
- log6.debug(`Listening to event: ${event}`);
1640
+ log7.debug(`Listening to event: ${event}`);
1375
1641
  return () => {
1376
1642
  handlers.delete(handler);
1377
1643
  if (handlers.size === 0) {
@@ -1406,154 +1672,6 @@ class HypenGlobalContext {
1406
1672
  // src/remote/client.ts
1407
1673
  init_result();
1408
1674
 
1409
- // src/disposable.ts
1410
- init_logger();
1411
- var log7 = frameworkLoggers.lifecycle;
1412
- function isDisposable(obj) {
1413
- return obj !== null && typeof obj === "object" && "dispose" in obj && typeof obj.dispose === "function";
1414
- }
1415
-
1416
- class DisposableStack {
1417
- stack = [];
1418
- disposed = false;
1419
- add(disposable) {
1420
- if (this.disposed) {
1421
- disposable.dispose();
1422
- return disposable;
1423
- }
1424
- this.stack.push(disposable);
1425
- return disposable;
1426
- }
1427
- addCallback(callback) {
1428
- this.add({ dispose: callback });
1429
- }
1430
- addValue(value, dispose) {
1431
- this.add({ dispose: () => dispose(value) });
1432
- return value;
1433
- }
1434
- dispose() {
1435
- if (this.disposed)
1436
- return;
1437
- this.disposed = true;
1438
- while (this.stack.length > 0) {
1439
- const item2 = this.stack.pop();
1440
- try {
1441
- item2.dispose();
1442
- } catch (error) {
1443
- log7.error("Error during dispose:", error);
1444
- }
1445
- }
1446
- }
1447
- get isDisposed() {
1448
- return this.disposed;
1449
- }
1450
- get size() {
1451
- return this.stack.length;
1452
- }
1453
- }
1454
- function disposableListener(target, event, handler, options) {
1455
- target.addEventListener(event, handler, options);
1456
- return {
1457
- dispose: () => target.removeEventListener(event, handler, options)
1458
- };
1459
- }
1460
- function disposableTimeout(callback, ms) {
1461
- const id = setTimeout(callback, ms);
1462
- return {
1463
- id,
1464
- dispose: () => clearTimeout(id)
1465
- };
1466
- }
1467
- function disposableInterval(callback, ms) {
1468
- const id = setInterval(callback, ms);
1469
- return {
1470
- id,
1471
- dispose: () => clearInterval(id)
1472
- };
1473
- }
1474
- function disposableWebSocket(ws) {
1475
- return {
1476
- dispose: () => {
1477
- if (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING) {
1478
- ws.close();
1479
- }
1480
- }
1481
- };
1482
- }
1483
- function disposableAbortController() {
1484
- const controller = new AbortController;
1485
- return {
1486
- controller,
1487
- signal: controller.signal,
1488
- dispose: () => controller.abort()
1489
- };
1490
- }
1491
- function disposableSubscription(unsubscribe) {
1492
- return { dispose: unsubscribe };
1493
- }
1494
- var ELEMENT_DISPOSABLES = Symbol("hypen.disposables");
1495
- function getElementDisposables(element) {
1496
- const existing = element[ELEMENT_DISPOSABLES];
1497
- if (existing instanceof DisposableStack) {
1498
- return existing;
1499
- }
1500
- const stack = new DisposableStack;
1501
- element[ELEMENT_DISPOSABLES] = stack;
1502
- return stack;
1503
- }
1504
- function disposeElement(element) {
1505
- const stack = element[ELEMENT_DISPOSABLES];
1506
- if (stack instanceof DisposableStack) {
1507
- stack.dispose();
1508
- delete element[ELEMENT_DISPOSABLES];
1509
- }
1510
- }
1511
- function hasElementDisposables(element) {
1512
- return element[ELEMENT_DISPOSABLES] instanceof DisposableStack;
1513
- }
1514
-
1515
- class DisposableMixin {
1516
- disposables = new DisposableStack;
1517
- track(disposable) {
1518
- return this.disposables.add(disposable);
1519
- }
1520
- onDispose(callback) {
1521
- this.disposables.addCallback(callback);
1522
- }
1523
- dispose() {
1524
- this.disposables.dispose();
1525
- }
1526
- }
1527
- function compositeDisposable(...disposables) {
1528
- return {
1529
- dispose: () => {
1530
- for (const d of disposables) {
1531
- try {
1532
- d.dispose();
1533
- } catch (error) {
1534
- log7.error("Error during dispose:", error);
1535
- }
1536
- }
1537
- }
1538
- };
1539
- }
1540
- async function using(resource, fn) {
1541
- const r = typeof resource === "function" ? resource() : resource;
1542
- try {
1543
- return await fn(r);
1544
- } finally {
1545
- r.dispose();
1546
- }
1547
- }
1548
- function usingSync(resource, fn) {
1549
- const r = typeof resource === "function" ? resource() : resource;
1550
- try {
1551
- return fn(r);
1552
- } finally {
1553
- r.dispose();
1554
- }
1555
- }
1556
-
1557
1675
  // src/retry.ts
1558
1676
  init_result();
1559
1677
  var DEFAULT_OPTIONS = {
@@ -2345,6 +2463,7 @@ export {
2345
2463
  Err,
2346
2464
  DisposableStack,
2347
2465
  DisposableMixin,
2466
+ DataSourceManager,
2348
2467
  ConsoleRenderer,
2349
2468
  ConnectionError,
2350
2469
  ComponentResolver,
@@ -2352,4 +2471,4 @@ export {
2352
2471
  ActionError
2353
2472
  };
2354
2473
 
2355
- //# debugId=3A4A103012E4551664756E2164756E21
2474
+ //# debugId=D4B51C3A115B4AA664756E2164756E21