@powerhousedao/connect 1.0.25-dev.3 → 1.0.25-dev.5

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 (34) hide show
  1. package/dist/assets/{app-BtiIdebC.css → app-Di6g_N6F.css} +96 -78
  2. package/dist/assets/{app-DuevLOGa.js → app-DpvGvYx-.js} +2395 -1285
  3. package/dist/assets/app-DpvGvYx-.js.map +1 -0
  4. package/dist/assets/{app-loader-BNl_S7y5.js → app-loader-DlmRZ8eU.js} +219 -45
  5. package/dist/assets/app-loader-DlmRZ8eU.js.map +1 -0
  6. package/dist/assets/{app-loader-Kh2XKQY5.css → app-loader-b43YtazY.css} +15 -8
  7. package/dist/assets/{browser-BMIKwzU9.js → browser-CyAxFNDr.js} +4 -4
  8. package/dist/assets/{browser-BMIKwzU9.js.map → browser-CyAxFNDr.js.map} +1 -1
  9. package/dist/assets/{ccip-BoCYNkmd.js → ccip-B0vnV_KE.js} +4 -4
  10. package/dist/assets/{ccip-BoCYNkmd.js.map → ccip-B0vnV_KE.js.map} +1 -1
  11. package/dist/assets/{content-BLgob3rk.js → content-BECi_eC-.js} +5 -5
  12. package/dist/assets/{content-BLgob3rk.js.map → content-BECi_eC-.js.map} +1 -1
  13. package/dist/assets/{index-ChTDZAEG.js → index-CSdlimsY.js} +3409 -7
  14. package/dist/assets/index-CSdlimsY.js.map +1 -0
  15. package/dist/assets/{index-DjoCexCi.js → index-DdwuDRF1.js} +4 -4
  16. package/dist/assets/{index-DjoCexCi.js.map → index-DdwuDRF1.js.map} +1 -1
  17. package/dist/assets/{index-CvFSOEaQ.js → index-K6dF3gGM.js} +5 -5
  18. package/dist/assets/{index-CvFSOEaQ.js.map → index-K6dF3gGM.js.map} +1 -1
  19. package/dist/assets/{index-C6zbFAcK.js → index-mvOgfrBU.js} +4 -4
  20. package/dist/assets/index-mvOgfrBU.js.map +1 -0
  21. package/dist/assets/{main.CBcxpJYb.js → main.6cK_RVAD.js} +2 -2
  22. package/dist/assets/{main.CBcxpJYb.js.map → main.6cK_RVAD.js.map} +1 -1
  23. package/dist/assets/{reactor-analytics-m8eVeqfl.js → reactor-analytics-CPrrgnol.js} +6 -6
  24. package/dist/assets/{reactor-analytics-m8eVeqfl.js.map → reactor-analytics-CPrrgnol.js.map} +1 -1
  25. package/dist/assets/{router-BCYFp_Nf.js → router-Cdqw5UqJ.js} +6 -6
  26. package/dist/assets/{router-BCYFp_Nf.js.map → router-Cdqw5UqJ.js.map} +1 -1
  27. package/dist/assets/{style-DCJSX6pm.css → style-CK8AY-7U.css} +11 -12
  28. package/dist/index.html +1 -1
  29. package/dist/vite-envs.sh +1 -1
  30. package/package.json +12 -7
  31. package/dist/assets/app-DuevLOGa.js.map +0 -1
  32. package/dist/assets/app-loader-BNl_S7y5.js.map +0 -1
  33. package/dist/assets/index-C6zbFAcK.js.map +0 -1
  34. package/dist/assets/index-ChTDZAEG.js.map +0 -1
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-DuevLOGa.js","assets/main.CBcxpJYb.js","assets/app-BtiIdebC.css"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/app-DpvGvYx-.js","assets/main.6cK_RVAD.js","assets/app-Di6g_N6F.css"])))=>i.map(i=>d[i]);
2
2
  var __defProp = Object.defineProperty;
3
3
  var __typeError = (msg) => {
4
4
  throw TypeError(msg);
@@ -11,7 +11,7 @@ var __privateAdd = (obj, member, value) => member.has(obj) ? __typeError("Cannot
11
11
  var __privateSet = (obj, member, value, setter) => (__accessCheck(obj, member, "write to private field"), setter ? setter.call(obj, value) : member.set(obj, value), value);
12
12
  var __privateMethod = (obj, member, method) => (__accessCheck(obj, member, "access private method"), method);
13
13
  var _tags, _levelString, _errorHandler, _ConsoleLogger_instances, levelValue_get, _getDocumentModelModule, _drives, _ReadModeService_instances, parseGraphQLErrors_fn, fetchDrive_fn, _a, _ServiceWorkerManager_instances, handleServiceWorkerMessage_fn, handleServiceWorker_fn;
14
- import { _ as __vitePreload } from "./main.CBcxpJYb.js";
14
+ import { _ as __vitePreload } from "./main.6cK_RVAD.js";
15
15
  import { jsx, jsxs } from "react/jsx-runtime";
16
16
  import { useState, useEffect, Suspense, lazy } from "react";
17
17
  function _mergeNamespaces(n, m) {
@@ -22188,10 +22188,12 @@ const callOrIdentity = (value) => {
22188
22188
  const gql = (chunks, ...variables) => {
22189
22189
  return chunks.reduce((acc, chunk, index) => `${acc}${chunk}${index in variables ? String(variables[index]) : ``}`, ``);
22190
22190
  };
22191
- async function requestGraphql(...args) {
22192
- const [url, ...requestArgs] = args;
22193
- const client = new GraphQLClient(url, { fetch });
22194
- const { errors, ...response } = await client.request(...requestArgs);
22191
+ async function requestGraphql(url, document, variables, headers) {
22192
+ const client = new GraphQLClient(url, {
22193
+ fetch,
22194
+ headers: headers || {}
22195
+ });
22196
+ const { errors, ...response } = await client.request(document, variables);
22195
22197
  const result = { ...response };
22196
22198
  if (errors == null ? void 0 : errors.length) {
22197
22199
  result.errors = errors.map(({ message, ...options }) => new GraphQLError(message, options));
@@ -22244,7 +22246,13 @@ function generateDocumentStateQueryFields(documentModelState, prefix, options) {
22244
22246
  const queryFields = getFields(stateQuery.type, prefix);
22245
22247
  return queryFields;
22246
22248
  }
22247
- async function requestPublicDrive(url) {
22249
+ async function requestPublicDriveWithTokenFromReactor(url, server) {
22250
+ var _a2;
22251
+ const token = await ((_a2 = server.generateJwtHandler) == null ? void 0 : _a2.call(server, url));
22252
+ const headers = token ? { Authorization: `Bearer ${token}` } : {};
22253
+ return requestPublicDrive(url, headers);
22254
+ }
22255
+ async function requestPublicDrive(url, headers) {
22248
22256
  var _a2, _b;
22249
22257
  let drive;
22250
22258
  try {
@@ -22260,7 +22268,7 @@ async function requestPublicDrive(url) {
22260
22268
  }
22261
22269
  }
22262
22270
  }
22263
- `);
22271
+ `, void 0, headers);
22264
22272
  if (((_a2 = result.errors) == null ? void 0 : _a2.length) || !result.drive) {
22265
22273
  throw ((_b = result.errors) == null ? void 0 : _b.at(0)) ?? new Error("Drive not found");
22266
22274
  }
@@ -22599,7 +22607,7 @@ class DefaultDrivesManager {
22599
22607
  case "preserve-by-url-and-detach":
22600
22608
  case "preserve-by-url": {
22601
22609
  const detach = this.removeOldRemoteDrivesConfig.strategy === "preserve-by-url-and-detach" ? "detach" : "remove";
22602
- const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((url) => requestPublicDrive(url));
22610
+ const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((url) => requestPublicDriveWithTokenFromReactor(url, this.server));
22603
22611
  const drivesIdsToPreserve = (await Promise.all(getDrivesInfo)).map((driveInfo) => driveInfo.id);
22604
22612
  await this.preserveDrivesById(drivesIdsToPreserve, driveids, detach);
22605
22613
  break;
@@ -22610,7 +22618,7 @@ class DefaultDrivesManager {
22610
22618
  break;
22611
22619
  }
22612
22620
  case "remove-by-url": {
22613
- const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((driveUrl) => requestPublicDrive(driveUrl));
22621
+ const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((driveUrl) => requestPublicDriveWithTokenFromReactor(driveUrl, this.server));
22614
22622
  const drivesInfo = await Promise.all(getDrivesInfo);
22615
22623
  const drivesIdsToRemove = drivesInfo.map((driveInfo) => driveInfo.id).filter((driveId) => driveids.includes(driveId));
22616
22624
  await this.removeDrivesById(drivesIdsToRemove);
@@ -22630,7 +22638,7 @@ class DefaultDrivesManager {
22630
22638
  break;
22631
22639
  }
22632
22640
  case "detach-by-url": {
22633
- const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((driveUrl) => requestPublicDrive(driveUrl));
22641
+ const getDrivesInfo = this.removeOldRemoteDrivesConfig.urls.map((driveUrl) => requestPublicDriveWithTokenFromReactor(driveUrl, this.server));
22634
22642
  const drivesInfo = await Promise.all(getDrivesInfo);
22635
22643
  const drivesIdsToRemove = drivesInfo.map((driveInfo) => driveInfo.id).filter((driveId) => driveids.includes(driveId));
22636
22644
  const detachDrivesPromises = drivesIdsToRemove.map((driveId) => this.delegate.detachDrive(driveId));
@@ -22663,7 +22671,7 @@ class DefaultDrivesManager {
22663
22671
  for (const remoteDrive of defaultDrives) {
22664
22672
  let remoteDriveInfo = { ...remoteDrive };
22665
22673
  try {
22666
- const driveInfo = remoteDrive.metadata ?? await requestPublicDrive(remoteDrive.url);
22674
+ const driveInfo = remoteDrive.metadata ?? await requestPublicDriveWithTokenFromReactor(remoteDrive.url, this.server);
22667
22675
  remoteDriveInfo = { ...remoteDrive, metadata: driveInfo };
22668
22676
  this.defaultRemoteDrives.set(remoteDrive.url, remoteDriveInfo);
22669
22677
  const driveIsAdded = drives.includes(driveInfo.id);
@@ -22732,6 +22740,34 @@ class PullResponderTransmitter {
22732
22740
  this.manager = manager;
22733
22741
  this.logger.verbose(`constructor(listener: ${listener.listenerId})`);
22734
22742
  }
22743
+ static async getAuthHeaders(url, manager) {
22744
+ if (!(manager == null ? void 0 : manager.generateJwtHandler)) {
22745
+ staticLogger().verbose(`No JWT handler available for ${url}`);
22746
+ return {};
22747
+ }
22748
+ try {
22749
+ const jwt = await manager.generateJwtHandler(url);
22750
+ if (!jwt) {
22751
+ staticLogger().verbose(`No JWT generated for ${url}`);
22752
+ return {};
22753
+ }
22754
+ return { Authorization: `Bearer ${jwt}` };
22755
+ } catch (error) {
22756
+ staticLogger().error(`Error generating JWT for ${url}:`, error);
22757
+ return {};
22758
+ }
22759
+ }
22760
+ async requestWithAuth(url, query, variables) {
22761
+ var _a2;
22762
+ const headers = await PullResponderTransmitter.getAuthHeaders(url, this.manager);
22763
+ const result = await requestGraphql(url, query, variables, headers);
22764
+ const error = (_a2 = result.errors) == null ? void 0 : _a2.at(0);
22765
+ if (error == null ? void 0 : error.message.includes("Unauthorized")) {
22766
+ const freshHeaders = await PullResponderTransmitter.getAuthHeaders(url, this.manager);
22767
+ return requestGraphql(url, query, variables, freshHeaders);
22768
+ }
22769
+ return result;
22770
+ }
22735
22771
  getStrands(options) {
22736
22772
  this.logger.verbose(`[SYNC DEBUG] PullResponderTransmitter.getStrands called for drive: ${this.listener.driveId}, listener: ${this.listener.listenerId}, options: ${JSON.stringify(options || {})}`);
22737
22773
  return this.manager.getStrands(this.listener.driveId, this.listener.listenerId, options).then((strands) => {
@@ -22754,7 +22790,7 @@ class PullResponderTransmitter {
22754
22790
  const syncUnits = await this.manager.getListenerSyncUnitIds(driveId, listenerId);
22755
22791
  let success = true;
22756
22792
  for (const revision of revisions) {
22757
- const syncUnit = syncUnits.find((s) => s.scope === revision.scope && s.branch === revision.branch && s.documentId == revision.documentId);
22793
+ const syncUnit = syncUnits.find((s) => s.scope === revision.scope && s.branch === revision.branch && s.documentId === revision.documentId);
22758
22794
  if (!syncUnit) {
22759
22795
  this.logger.warn("Unknown sync unit was acknowledged", revision);
22760
22796
  success = false;
@@ -22764,9 +22800,10 @@ class PullResponderTransmitter {
22764
22800
  }
22765
22801
  return success;
22766
22802
  }
22767
- static async registerPullResponder(driveId, url, filter, listenerId) {
22768
- var _a2;
22803
+ static async registerPullResponder(driveId, url, filter, listenerId, manager) {
22804
+ var _a2, _b;
22769
22805
  staticLogger().verbose(`registerPullResponder(url: ${url})`, filter);
22806
+ const headers = await this.getAuthHeaders(url, manager);
22770
22807
  const result = await requestGraphql(url, gql`
22771
22808
  mutation registerPullResponderListener(
22772
22809
  $filter: InputListenerFilter!
@@ -22779,9 +22816,32 @@ class PullResponderTransmitter {
22779
22816
  listenerId
22780
22817
  }
22781
22818
  }
22782
- `, { filter, listenerId });
22819
+ `, { filter, listenerId }, headers);
22783
22820
  const error = (_a2 = result.errors) == null ? void 0 : _a2.at(0);
22784
22821
  if (error) {
22822
+ if (error.message.includes("Unauthorized")) {
22823
+ const freshHeaders = await this.getAuthHeaders(url, manager);
22824
+ const retryResult = await requestGraphql(url, gql`
22825
+ mutation registerPullResponderListener(
22826
+ $filter: InputListenerFilter!
22827
+ $listenerId: String
22828
+ ) {
22829
+ registerPullResponderListener(
22830
+ filter: $filter
22831
+ listenerId: $listenerId
22832
+ ) {
22833
+ listenerId
22834
+ }
22835
+ }
22836
+ `, { filter, listenerId }, freshHeaders);
22837
+ if ((_b = retryResult.errors) == null ? void 0 : _b.at(0)) {
22838
+ throw retryResult.errors[0];
22839
+ }
22840
+ if (!retryResult.registerPullResponderListener) {
22841
+ throw new Error("Error registering listener");
22842
+ }
22843
+ return retryResult.registerPullResponderListener.listenerId;
22844
+ }
22785
22845
  throw error;
22786
22846
  }
22787
22847
  if (!result.registerPullResponderListener) {
@@ -22789,9 +22849,10 @@ class PullResponderTransmitter {
22789
22849
  }
22790
22850
  return result.registerPullResponderListener.listenerId;
22791
22851
  }
22792
- static async pullStrands(driveId, url, listenerId, options) {
22793
- var _a2;
22852
+ static async pullStrands(driveId, url, listenerId, options, manager) {
22853
+ var _a2, _b;
22794
22854
  staticLogger().verbose(`[SYNC DEBUG] PullResponderTransmitter.pullStrands called for drive: ${driveId}, url: ${url}, listener: ${listenerId}, options: ${JSON.stringify(options || {})}`);
22855
+ const headers = await this.getAuthHeaders(url, manager);
22795
22856
  const result = await requestGraphql(url, gql`
22796
22857
  query strands($listenerId: ID!) {
22797
22858
  system {
@@ -22828,10 +22889,62 @@ class PullResponderTransmitter {
22828
22889
  }
22829
22890
  }
22830
22891
  }
22831
- `, { listenerId });
22892
+ `, { listenerId }, headers);
22832
22893
  const error = (_a2 = result.errors) == null ? void 0 : _a2.at(0);
22833
22894
  if (error) {
22834
- staticLogger().verbose(`[SYNC DEBUG] Error pulling strands for drive: ${driveId}, listener: ${listenerId}, error: ${JSON.stringify(error)}`);
22895
+ if (error.message.includes("Unauthorized")) {
22896
+ const freshHeaders = await this.getAuthHeaders(url, manager);
22897
+ const retryResult = await requestGraphql(url, gql`
22898
+ query strands($listenerId: ID!) {
22899
+ system {
22900
+ sync {
22901
+ strands(listenerId: $listenerId) {
22902
+ driveId
22903
+ documentId
22904
+ scope
22905
+ branch
22906
+ operations {
22907
+ id
22908
+ timestamp
22909
+ skip
22910
+ type
22911
+ input
22912
+ hash
22913
+ index
22914
+ context {
22915
+ signer {
22916
+ user {
22917
+ address
22918
+ networkId
22919
+ chainId
22920
+ }
22921
+ app {
22922
+ name
22923
+ key
22924
+ }
22925
+ signatures
22926
+ }
22927
+ }
22928
+ }
22929
+ }
22930
+ }
22931
+ }
22932
+ }
22933
+ `, { listenerId }, freshHeaders);
22934
+ if ((_b = retryResult.errors) == null ? void 0 : _b.at(0)) {
22935
+ throw retryResult.errors[0];
22936
+ }
22937
+ if (!retryResult.system) {
22938
+ return [];
22939
+ }
22940
+ return retryResult.system.sync.strands.map((s) => ({
22941
+ ...s,
22942
+ operations: s.operations.map((o) => ({
22943
+ ...o,
22944
+ input: JSON.parse(o.input)
22945
+ }))
22946
+ }));
22947
+ }
22835
22948
  throw error;
22836
22949
  }
22837
22950
  if (!result.system) {
@@ -22851,7 +22964,7 @@ class PullResponderTransmitter {
22851
22964
  }
22852
22965
  return strands;
22853
22966
  }
22854
- static async acknowledgeStrands(url, listenerId, revisions) {
22967
+ static async acknowledgeStrands(url, listenerId, revisions, manager) {
22855
22968
  staticLogger().verbose(`acknowledgeStrands(url: ${url}, listener: ${listenerId})`, revisions);
22856
22969
  const chunks = [];
22857
22970
  for (let i = 0; i < revisions.length; i += MAX_REVISIONS_PER_ACK) {
@@ -22860,8 +22973,9 @@ class PullResponderTransmitter {
22860
22973
  if (chunks.length > 1) {
22861
22974
  staticLogger().verbose(`Breaking strand acknowledgement into ${chunks.length} chunks...`);
22862
22975
  }
22976
+ const headers = await this.getAuthHeaders(url, manager);
22863
22977
  const results = await Promise.allSettled(chunks.map(async (chunk) => {
22864
- var _a2;
22978
+ var _a2, _b;
22865
22979
  const result = await requestGraphql(url, gql`
22866
22980
  mutation acknowledge(
22867
22981
  $listenerId: String!
@@ -22869,9 +22983,27 @@ class PullResponderTransmitter {
22869
22983
  ) {
22870
22984
  acknowledge(listenerId: $listenerId, revisions: $revisions)
22871
22985
  }
22872
- `, { listenerId, revisions: chunk });
22986
+ `, { listenerId, revisions: chunk }, headers);
22873
22987
  const error = (_a2 = result.errors) == null ? void 0 : _a2.at(0);
22874
22988
  if (error) {
22989
+ if (error.message.includes("Unauthorized")) {
22990
+ const freshHeaders = await this.getAuthHeaders(url, manager);
22991
+ const retryResult = await requestGraphql(url, gql`
22992
+ mutation acknowledge(
22993
+ $listenerId: String!
22994
+ $revisions: [ListenerRevisionInput]
22995
+ ) {
22996
+ acknowledge(listenerId: $listenerId, revisions: $revisions)
22997
+ }
22998
+ `, { listenerId, revisions: chunk }, freshHeaders);
22999
+ if ((_b = retryResult.errors) == null ? void 0 : _b.at(0)) {
23000
+ throw retryResult.errors[0];
23001
+ }
23002
+ if (retryResult.acknowledge === null || !retryResult.acknowledge) {
23003
+ throw new Error("Error acknowledging strands");
23004
+ }
23005
+ return;
23006
+ }
22875
23007
  throw error;
22876
23008
  }
22877
23009
  if (result.acknowledge === null || !result.acknowledge) {
@@ -22893,7 +23025,7 @@ class PullResponderTransmitter {
22893
23025
  *
22894
23026
  * @returns boolean indicating whether there might be more data to pull
22895
23027
  */
22896
- static async executePull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge) {
23028
+ static async executePull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge, manager) {
22897
23029
  var _a2, _b;
22898
23030
  staticLogger().verbose(`executePull(driveId: ${driveId}), trigger:`, trigger);
22899
23031
  staticLogger().debug(`[SYNC DEBUG] PullResponderTransmitter.executePull starting for drive: ${driveId}, listenerId: ${trigger.data.listenerId}`);
@@ -22902,7 +23034,7 @@ class PullResponderTransmitter {
22902
23034
  let error;
22903
23035
  const listenerId = trigger.data.listenerId;
22904
23036
  try {
22905
- strands = await PullResponderTransmitter.pullStrands(driveId, url, listenerId);
23037
+ strands = await PullResponderTransmitter.pullStrands(driveId, url, listenerId, void 0, manager);
22906
23038
  } catch (e) {
22907
23039
  error = e;
22908
23040
  const graphqlError = error;
@@ -22912,7 +23044,7 @@ class PullResponderTransmitter {
22912
23044
  staticLogger().verbose(`[SYNC DEBUG] Auto-registering pull responder for drive: ${driveId}`);
22913
23045
  await PullResponderTransmitter.registerPullResponder(trigger.driveId, url, trigger.filter, listenerId);
22914
23046
  try {
22915
- strands = await PullResponderTransmitter.pullStrands(driveId, url, listenerId);
23047
+ strands = await PullResponderTransmitter.pullStrands(driveId, url, listenerId, void 0, manager);
22916
23048
  staticLogger().verbose(`Successfully auto-registered and pulled strands for drive: ${driveId}, listenerId: ${listenerId}`);
22917
23049
  } catch (error2) {
22918
23050
  staticLogger().error(`Could not resolve 'Listener not found' error by registering a new pull responder for drive: ${driveId}, listenerId: ${listenerId}: ${error2}`);
@@ -22984,7 +23116,7 @@ class PullResponderTransmitter {
22984
23116
  await PullResponderTransmitter.acknowledgeStrands(url, trigger.data.listenerId, listenerRevisions.map((revision) => {
22985
23117
  const { error: error2, ...rest } = revision;
22986
23118
  return rest;
22987
- }));
23119
+ }), manager);
22988
23120
  success = true;
22989
23121
  } catch (error2) {
22990
23122
  staticLogger().error(`Error acknowledging strands for drive: ${driveId}, listenerId: ${trigger.data.listenerId}: ${error2}`);
@@ -23003,7 +23135,7 @@ class PullResponderTransmitter {
23003
23135
  }
23004
23136
  return strands.length > 0;
23005
23137
  }
23006
- static setupPull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge) {
23138
+ static setupPull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge, manager) {
23007
23139
  staticLogger().verbose(`[SYNC DEBUG] PullResponderTransmitter.setupPull initiated for drive: ${driveId}, listenerId: ${trigger.data.listenerId}`);
23008
23140
  const { interval } = trigger.data;
23009
23141
  let loopInterval = PULL_DRIVE_INTERVAL;
@@ -23026,7 +23158,7 @@ class PullResponderTransmitter {
23026
23158
  let hasMore = true;
23027
23159
  while (hasMore && !isCancelled && counter < MAX_PULLS) {
23028
23160
  counter++;
23029
- hasMore = await this.executePull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge);
23161
+ hasMore = await this.executePull(driveId, trigger, onStrandUpdate, onError, onRevisions, onAcknowledge, manager);
23030
23162
  if (hasMore) {
23031
23163
  staticLogger().verbose(`[SYNC DEBUG] More strands available, continuing pull cycle for drive: ${driveId}, listenerId: ${trigger.data.listenerId}`);
23032
23164
  }
@@ -23049,7 +23181,7 @@ class PullResponderTransmitter {
23049
23181
  }
23050
23182
  };
23051
23183
  }
23052
- static async createPullResponderTrigger(driveId, url, options) {
23184
+ static async createPullResponderTrigger(driveId, url, options, listenerManager) {
23053
23185
  staticLogger().verbose(`createPullResponderTrigger(drive: ${driveId}, url: ${url})`);
23054
23186
  const { pullFilter, pullInterval } = options;
23055
23187
  const filter = pullFilter ?? {
@@ -23058,7 +23190,7 @@ class PullResponderTransmitter {
23058
23190
  branch: ["*"],
23059
23191
  scope: ["*"]
23060
23192
  };
23061
- const listenerId = await PullResponderTransmitter.registerPullResponder(driveId, url, filter);
23193
+ const listenerId = await PullResponderTransmitter.registerPullResponder(driveId, url, filter, void 0, listenerManager);
23062
23194
  const pullTrigger = {
23063
23195
  id: generateId(),
23064
23196
  type: "PullResponder",
@@ -23184,13 +23316,44 @@ var libExports = requireLib();
23184
23316
  const stringify = /* @__PURE__ */ getDefaultExportFromCjs(libExports);
23185
23317
  const SYNC_OPS_BATCH_LIMIT = 10;
23186
23318
  class SwitchboardPushTransmitter {
23187
- constructor(targetURL) {
23319
+ constructor(targetURL, manager) {
23188
23320
  __publicField(this, "targetURL");
23321
+ __publicField(this, "manager");
23189
23322
  __publicField(this, "logger", childLogger([
23190
23323
  "SwitchboardPushTransmitter",
23191
23324
  Math.floor(Math.random() * 999).toString()
23192
23325
  ]));
23193
23326
  this.targetURL = targetURL;
23327
+ this.manager = manager;
23328
+ }
23329
+ async getAuthHeaders() {
23330
+ var _a2;
23331
+ if (!((_a2 = this.manager) == null ? void 0 : _a2.generateJwtHandler)) {
23332
+ this.logger.verbose(`No JWT handler available for ${this.targetURL}`);
23333
+ return {};
23334
+ }
23335
+ try {
23336
+ const jwt = await this.manager.generateJwtHandler(this.targetURL);
23337
+ if (!jwt) {
23338
+ this.logger.verbose(`No JWT generated for ${this.targetURL}`);
23339
+ return {};
23340
+ }
23341
+ return { Authorization: `Bearer ${jwt}` };
23342
+ } catch (error) {
23343
+ this.logger.error(`Error generating JWT for ${this.targetURL}:`, error);
23344
+ return {};
23345
+ }
23346
+ }
23347
+ async requestWithAuth(query, variables) {
23348
+ var _a2;
23349
+ const headers = await this.getAuthHeaders();
23350
+ const result = await requestGraphql(this.targetURL, query, variables, headers);
23351
+ const error = (_a2 = result.errors) == null ? void 0 : _a2.at(0);
23352
+ if (error == null ? void 0 : error.message.includes("Unauthorized")) {
23353
+ const freshHeaders = await this.getAuthHeaders();
23354
+ return requestGraphql(this.targetURL, query, variables, freshHeaders);
23355
+ }
23356
+ return result;
23194
23357
  }
23195
23358
  async transmit(strands, source) {
23196
23359
  var _a2;
@@ -23225,7 +23388,7 @@ class SwitchboardPushTransmitter {
23225
23388
  this.logger.verbose(` Total update: [${strands.map((s) => s.operations.length).join(", ")}] operations`);
23226
23389
  this.logger.verbose(`Culled update: [${culledStrands.map((s) => s.operations.length).join(", ")}] operations`);
23227
23390
  try {
23228
- const { pushUpdates } = await requestGraphql(this.targetURL, gql`
23391
+ const result = await this.requestWithAuth(gql`
23229
23392
  mutation pushUpdates($strands: [InputStrandUpdate!]) {
23230
23393
  pushUpdates(strands: $strands) {
23231
23394
  driveId
@@ -23246,15 +23409,14 @@ class SwitchboardPushTransmitter {
23246
23409
  }))
23247
23410
  }))
23248
23411
  });
23249
- if (!pushUpdates) {
23412
+ if (!result.pushUpdates) {
23250
23413
  throw new Error("Couldn't update listener revision");
23251
23414
  }
23252
- return pushUpdates;
23415
+ return result.pushUpdates;
23253
23416
  } catch (e) {
23254
23417
  this.logger.error(e);
23255
23418
  throw e;
23256
23419
  }
23257
- return [];
23258
23420
  }
23259
23421
  }
23260
23422
  var TransmitterType;
@@ -23303,6 +23465,7 @@ class BaseDocumentDriveServer {
23303
23465
  __publicField(this, "options");
23304
23466
  __publicField(this, "listenerManager");
23305
23467
  __publicField(this, "synchronizationManager");
23468
+ __publicField(this, "generateJwtHandler");
23306
23469
  // internal dependencies
23307
23470
  __publicField(this, "defaultDrivesManager");
23308
23471
  __publicField(this, "defaultDrivesManagerDelegate", {
@@ -23347,6 +23510,7 @@ class BaseDocumentDriveServer {
23347
23510
  ...DefaultListenerManagerOptions,
23348
23511
  ...options == null ? void 0 : options.listenerManager
23349
23512
  },
23513
+ jwtHandler: (options == null ? void 0 : options.jwtHandler) === void 0 ? () => Promise.resolve("") : options.jwtHandler,
23350
23514
  taskQueueMethod: (options == null ? void 0 : options.taskQueueMethod) === void 0 ? RunAsap.runAsap : options.taskQueueMethod
23351
23515
  };
23352
23516
  this.defaultDrivesManager = new DefaultDrivesManager(this, this.defaultDrivesManagerDelegate, options);
@@ -23473,7 +23637,7 @@ class BaseDocumentDriveServer {
23473
23637
  }).catch(this.logger.error);
23474
23638
  }
23475
23639
  }
23476
- });
23640
+ }, void 0, this.listeners);
23477
23641
  driveTriggers.set(trigger.id, cancelPullLoop);
23478
23642
  this.triggerMap.set(driveId, driveTriggers);
23479
23643
  }
@@ -23503,7 +23667,7 @@ class BaseDocumentDriveServer {
23503
23667
  for (const zodListener of drive.state.local.listeners) {
23504
23668
  if (((_a2 = zodListener.callInfo) == null ? void 0 : _a2.transmitterType) === "SwitchboardPush") {
23505
23669
  this.logger.verbose(`[SYNC DEBUG] Setting up SwitchboardPush listener ${zodListener.listenerId} for drive ${driveId}`);
23506
- const transmitter = new SwitchboardPushTransmitter(zodListener.callInfo.data ?? "");
23670
+ const transmitter = new SwitchboardPushTransmitter(zodListener.callInfo.data ?? "", this.listeners);
23507
23671
  this.logger.verbose(`[SYNC DEBUG] Created SwitchboardPush transmitter with URL: ${zodListener.callInfo.data || "none"}`);
23508
23672
  await this.listenerManager.setListener(driveId, {
23509
23673
  block: zodListener.block,
@@ -23592,12 +23756,14 @@ class BaseDocumentDriveServer {
23592
23756
  return document;
23593
23757
  }
23594
23758
  async addRemoteDrive(url, options) {
23595
- const { id, name: name2, slug, icon, meta } = options.expectedDriveInfo || await requestPublicDrive(url);
23759
+ var _a2;
23760
+ await ((_a2 = this.generateJwtHandler) == null ? void 0 : _a2.call(this, url));
23761
+ const { id, name: name2, slug, icon, meta } = options.expectedDriveInfo || await requestPublicDriveWithTokenFromReactor(url, this);
23596
23762
  const { pullFilter, pullInterval, availableOffline, sharingType, listeners, triggers } = options;
23597
23763
  const pullTrigger = await PullResponderTransmitter.createPullResponderTrigger(id, url, {
23598
23764
  pullFilter,
23599
23765
  pullInterval
23600
- });
23766
+ }, this.listeners);
23601
23767
  return await this.addDrive({
23602
23768
  id,
23603
23769
  slug,
@@ -24402,6 +24568,10 @@ class BaseDocumentDriveServer {
24402
24568
  this.eventEmitter.emit("strandUpdate", strand);
24403
24569
  return result;
24404
24570
  }
24571
+ setGenerateJwtHandler(handler) {
24572
+ this.generateJwtHandler = handler;
24573
+ this.listenerManager.setGenerateJwtHandler(handler);
24574
+ }
24405
24575
  }
24406
24576
  const DocumentDriveServer = ReadModeServer(BaseDocumentDriveServer);
24407
24577
  class MemoryStorage {
@@ -24662,6 +24832,7 @@ const _ListenerManager = class _ListenerManager {
24662
24832
  ]));
24663
24833
  __publicField(this, "syncManager");
24664
24834
  __publicField(this, "options");
24835
+ __publicField(this, "generateJwtHandler");
24665
24836
  // driveId -> listenerId -> listenerState
24666
24837
  __publicField(this, "listenerStateByDriveId", /* @__PURE__ */ new Map());
24667
24838
  __publicField(this, "triggerUpdate", debounce(this._triggerUpdate.bind(this), _ListenerManager.LISTENER_UPDATE_DELAY));
@@ -24669,6 +24840,9 @@ const _ListenerManager = class _ListenerManager {
24669
24840
  this.options = { ...DefaultListenerManagerOptions, ...options };
24670
24841
  this.logger.verbose(`constructor(...)`);
24671
24842
  }
24843
+ setGenerateJwtHandler(handler) {
24844
+ this.generateJwtHandler = handler;
24845
+ }
24672
24846
  async initialize(handler) {
24673
24847
  this.logger.verbose("initialize(...)");
24674
24848
  if (typeof window !== "undefined") {
@@ -25047,7 +25221,7 @@ class TransmitterFactory {
25047
25221
  if (!((_a2 = listener.callInfo) == null ? void 0 : _a2.data)) {
25048
25222
  throw new Error("No call info data: " + JSON.stringify(listener));
25049
25223
  }
25050
- return new SwitchboardPushTransmitter(listener.callInfo.data);
25224
+ return new SwitchboardPushTransmitter(listener.callInfo.data, this.listenerManager);
25051
25225
  }
25052
25226
  case "Internal": {
25053
25227
  throw new Error("Internal transmitter not implemented");
@@ -26073,7 +26247,7 @@ const nodeOptionsMap = {
26073
26247
  };
26074
26248
  const name = "@powerhousedao/connect";
26075
26249
  const productName = "Powerhouse-Connect";
26076
- const version$1 = "1.0.25-dev.3";
26250
+ const version$1 = "1.0.25-dev.5";
26077
26251
  const description = "Powerhouse Connect";
26078
26252
  const main = "./dist/index.html";
26079
26253
  const type = "module";
@@ -26085,7 +26259,7 @@ const repository = { "type": "git", "url": "git+https://github.com/powerhouse-in
26085
26259
  const bugs = { "url": "https://github.com/powerhouse-inc/document-model-electron/issues" };
26086
26260
  const homepage = "https://github.com/powerhouse-inc/document-model-electron#readme";
26087
26261
  const scripts = { "build:tsc": "tsc --build", "start": "electron-forge start", "package": "electron-forge package", "make": "PH_CONNECT_BASE_HREF=./ electron-forge make", "make:mac": "PH_CONNECT_BASE_HREF=./ electron-forge make -p darwin", "make:linux": "PH_CONNECT_BASE_HREF=./ electron-forge make -p linux", "make:windows": "PH_CONNECT_BASE_HREF=./ electron-forge make -p win32", "publish:electron": "electron-forge publish", "prepublishOnly": "npm run build", "lint": "eslint .", "lint:fix": "eslint --fix .", "lint:nx": "eslint --quiet --fix .", "format": 'prettier --write "**/*.+(js|ts|jsx|tsx|json)"', "dev": "vite -c vite.renderer.config.mts", "dev:nocache": "rm -rf node_modules/.vite && rm -rf node_modules/.cache && npm run dev", "prebuild": "npm run clean && tsc --build --noEmit", "build": "NODE_OPTIONS=--max-old-space-size=6144 vite build -c vite.renderer.config.mts", "preview:web": "vite preview -c vite.renderer.config.mts", "e2e": "playwright test", "cy:open": "cypress open", "build:service-worker": "tsc --build ./tsconfig.sw.json", "clean": "rimraf dist", "clean:node_modules": "rimraf node_modules" };
26088
- const devDependencies = { "@electron-forge/cli": "^6.1.1", "@electron-forge/maker-deb": "^6.1.1", "@electron-forge/maker-rpm": "^6.1.1", "@electron-forge/maker-squirrel": "^6.1.1", "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-vite": "^6.1.1", "@electron-forge/publisher-electron-release-server": "^6.2.1", "@electron-forge/publisher-github": "^7.2.0", "@electron-forge/shared-types": "^7.7.0", "@playwright/test": "^1.41.2", "@powerhousedao/builder-tools": "workspace:*", "@powerhousedao/common": "workspace:*", "@powerhousedao/config": "workspace:*", "@powerhousedao/design-system": "workspace:*", "@powerhousedao/diff-analyzer": "^0.0.0-dev.4", "@powerhousedao/reactor-browser": "workspace:*", "@rollup/plugin-node-resolve": "^15.2.3", "@sentry/browser": "^9.1.0", "@sentry/react": "^7.109.0", "@sentry/vite-plugin": "^2.23.0", "@tailwindcss/vite": "^4.1.4", "@tanstack/react-virtual": "^3.8.1", "@types/node": "^22.15.17", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.18", "@types/uuid": "^9.0.7", "@types/wicg-file-system-access": "^2020.9.6", "@vitejs/plugin-basic-ssl": "^2.0.0", "@vitejs/plugin-react": "^4.4.1", "asar": "^3.2.0", "did-key-creator": "^1.2.0", "document-drive": "workspace:*", "document-model": "workspace:*", "electron": "30.0.0", "electron-is-dev": "^3.0.1", "electron-playwright-helpers": "^1.7.1", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "esbuild": "^0.24.0", "graphql": "^16.11.0", "graphql-request": "^6.1.0", "i18next": "^23.7.6", "jotai": "^2.1.0", "jotai-effect": "^1.1.6", "localforage": "^1.10.0", "lz-string": "^1.5.0", "playwright": "^1.41.2", "playwright-core": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.11", "react-hotkeys-hook": "^4.5.0", "react-i18next": "^13.5.0", "react-router-dom": "^6.11.2", "tailwind-merge": "^3.0.2", "tailwindcss": "^4.1.4", "uuid": "^9.0.1", "viem": "^2.8.13", "vite": "^6.3.3", "vite-envs": "^4.6.0", "vite-plugin-html": "^3.2.2", "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", "xvfb-maybe": "^0.2.1" };
26262
+ const devDependencies = { "@didtools/key-webcrypto": "^0.2.0", "@electron-forge/cli": "^6.1.1", "@electron-forge/maker-deb": "^6.1.1", "@electron-forge/maker-rpm": "^6.1.1", "@electron-forge/maker-squirrel": "^6.1.1", "@electron-forge/maker-zip": "^6.1.1", "@electron-forge/plugin-vite": "^6.1.1", "@electron-forge/publisher-electron-release-server": "^6.2.1", "@electron-forge/publisher-github": "^7.2.0", "@electron-forge/shared-types": "^7.7.0", "@playwright/test": "^1.41.2", "@powerhousedao/builder-tools": "workspace:*", "@powerhousedao/common": "workspace:*", "@powerhousedao/config": "workspace:*", "@powerhousedao/design-system": "workspace:*", "@powerhousedao/diff-analyzer": "^0.0.0-dev.4", "@powerhousedao/reactor-browser": "workspace:*", "@renown/sdk": "workspace:*", "@rollup/plugin-node-resolve": "^15.2.3", "@sentry/browser": "^9.1.0", "@sentry/react": "^7.109.0", "@sentry/vite-plugin": "^2.23.0", "@tailwindcss/vite": "^4.1.4", "@tanstack/react-virtual": "^3.8.1", "@types/node": "^22.15.17", "@types/react": "^18.2.79", "@types/react-dom": "^18.2.18", "@types/uuid": "^9.0.7", "@types/wicg-file-system-access": "^2020.9.6", "@vitejs/plugin-basic-ssl": "^2.0.0", "@vitejs/plugin-react": "^4.4.1", "asar": "^3.2.0", "did-jwt": "^8.0.14", "did-jwt-vc": "^4.0.12", "did-key-creator": "^1.2.0", "document-drive": "workspace:*", "document-model": "workspace:*", "electron": "30.0.0", "electron-is-dev": "^3.0.1", "electron-playwright-helpers": "^1.7.1", "electron-squirrel-startup": "^1.0.0", "electron-store": "^8.1.0", "esbuild": "^0.24.0", "graphql": "^16.11.0", "graphql-request": "^6.1.0", "i18next": "^23.7.6", "jotai": "^2.1.0", "jotai-effect": "^1.1.6", "localforage": "^1.10.0", "lz-string": "^1.5.0", "playwright": "^1.41.2", "playwright-core": "^1.41.2", "react": "^18.2.0", "react-dom": "^18.2.0", "react-error-boundary": "^4.0.11", "react-hotkeys-hook": "^4.5.0", "react-i18next": "^13.5.0", "react-router-dom": "^6.11.2", "tailwind-merge": "^3.0.2", "tailwindcss": "^4.1.4", "uint8arrays": "^5.1.0", "uuid": "^9.0.1", "viem": "^2.8.13", "vite": "^6.3.3", "vite-envs": "^4.6.0", "vite-plugin-html": "^3.2.2", "vite-plugin-node-polyfills": "^0.23.0", "vite-plugin-svgr": "^4.3.0", "vite-tsconfig-paths": "^5.1.4", "xvfb-maybe": "^0.2.1" };
26089
26263
  const optionalDependencies = { "@esbuild/linux-x64": "^0.21.4", "@rollup/rollup-linux-x64-musl": "4.14.3" };
26090
26264
  const packageJson = {
26091
26265
  name,
@@ -31766,7 +31940,7 @@ if (window.__VITE_ENVS.MODE === "development") {
31766
31940
  } else {
31767
31941
  serviceWorkerManager.registerServiceWorker(false);
31768
31942
  }
31769
- const App = lazy(() => __vitePreload(() => import("./app-DuevLOGa.js").then((n) => n.bu), true ? __vite__mapDeps([0,1,2]) : void 0));
31943
+ const App = lazy(() => __vitePreload(() => import("./app-DpvGvYx-.js").then((n) => n.by), true ? __vite__mapDeps([0,1,2]) : void 0));
31770
31944
  const AppLoader = /* @__PURE__ */ jsx(Suspense, { children: /* @__PURE__ */ jsx(App, {}) });
31771
31945
  const appLoader = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
31772
31946
  __proto__: null,
@@ -31966,4 +32140,4 @@ export {
31966
32140
  ReorderModulesInputSchema as y,
31967
32141
  DeleteModuleInputSchema as z
31968
32142
  };
31969
- //# sourceMappingURL=app-loader-BNl_S7y5.js.map
32143
+ //# sourceMappingURL=app-loader-DlmRZ8eU.js.map