@atlaskit/editor-synced-block-provider 3.30.3 → 3.30.4

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 (37) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/cjs/clients/block-service/blockSubscription.js +3 -53
  3. package/dist/cjs/clients/block-service/sharedSubscriptionUtils.js +82 -0
  4. package/dist/cjs/index.js +33 -0
  5. package/dist/cjs/providers/block-service/blockServiceAPI.js +22 -6
  6. package/dist/cjs/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +94 -0
  7. package/dist/cjs/utils/relayResponseConverter.js +76 -0
  8. package/dist/cjs/utils/relaySubscriptionUtils.js +130 -0
  9. package/dist/es2019/clients/block-service/blockSubscription.js +2 -67
  10. package/dist/es2019/clients/block-service/sharedSubscriptionUtils.js +91 -0
  11. package/dist/es2019/index.js +4 -0
  12. package/dist/es2019/providers/block-service/blockServiceAPI.js +22 -6
  13. package/dist/es2019/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +88 -0
  14. package/dist/es2019/utils/relayResponseConverter.js +69 -0
  15. package/dist/es2019/utils/relaySubscriptionUtils.js +125 -0
  16. package/dist/esm/clients/block-service/blockSubscription.js +2 -52
  17. package/dist/esm/clients/block-service/sharedSubscriptionUtils.js +76 -0
  18. package/dist/esm/index.js +4 -0
  19. package/dist/esm/providers/block-service/blockServiceAPI.js +22 -6
  20. package/dist/esm/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +88 -0
  21. package/dist/esm/utils/relayResponseConverter.js +69 -0
  22. package/dist/esm/utils/relaySubscriptionUtils.js +123 -0
  23. package/dist/types/clients/block-service/blockSubscription.d.ts +1 -26
  24. package/dist/types/clients/block-service/sharedSubscriptionUtils.d.ts +61 -0
  25. package/dist/types/index.d.ts +4 -0
  26. package/dist/types/providers/block-service/blockServiceAPI.d.ts +7 -2
  27. package/dist/types/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.d.ts +31 -0
  28. package/dist/types/utils/relayResponseConverter.d.ts +47 -0
  29. package/dist/types/utils/relaySubscriptionUtils.d.ts +61 -0
  30. package/dist/types-ts4.5/clients/block-service/blockSubscription.d.ts +1 -26
  31. package/dist/types-ts4.5/clients/block-service/sharedSubscriptionUtils.d.ts +61 -0
  32. package/dist/types-ts4.5/index.d.ts +4 -0
  33. package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +7 -2
  34. package/dist/types-ts4.5/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.d.ts +31 -0
  35. package/dist/types-ts4.5/utils/relayResponseConverter.d.ts +47 -0
  36. package/dist/types-ts4.5/utils/relaySubscriptionUtils.d.ts +61 -0
  37. package/package.json +3 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-synced-block-provider
2
2
 
3
+ ## 3.30.4
4
+
5
+ ### Patch Changes
6
+
7
+ - [`610719fffa0ba`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/610719fffa0ba) -
8
+ Move subscription API to pass in environment for subscription instead
9
+ - Updated dependencies
10
+
3
11
  ## 3.30.3
4
12
 
5
13
  ### Patch Changes
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.subscribeToBlockUpdates = void 0;
7
7
  var _graphqlWs = require("graphql-ws");
8
8
  var _coreUtils = require("@atlaskit/editor-common/core-utils");
9
- var _utils = require("../../utils/utils");
9
+ var _sharedSubscriptionUtils = require("./sharedSubscriptionUtils");
10
10
  var GRAPHQL_WS_ENDPOINT = '/gateway/api/graphql/subscriptions';
11
11
  var blockServiceClient = null;
12
12
  var getBlockServiceClient = function getBlockServiceClient() {
@@ -25,56 +25,6 @@ var getBlockServiceClient = function getBlockServiceClient() {
25
25
  }
26
26
  return blockServiceClient;
27
27
  };
28
- var SUBSCRIPTION_QUERY = "\nsubscription EDITOR_SYNCED_BLOCK_ON_BLOCK_UPDATED($resourceId: ID!) {\n\tblockService_onBlockUpdated(resourceId: $resourceId) {\n\t\tblockAri\n\t\tblockInstanceId\n\t\tcontent\n\t\tcontentUpdatedAt\n\t\tcreatedAt\n\t\tcreatedBy\n\t\tdeletionReason\n\t\tproduct\n\t\tsourceAri\n\t\tstatus\n\t}\n}\n";
29
- /**
30
- * Extracts the resourceId from a block ARI.
31
- * Block ARI format: ari:cloud:blocks:<cloudId>:synced-block/<resourceId>
32
- * @param blockAri - The block ARI string
33
- * @returns The resourceId portion of the ARI
34
- */
35
- var extractResourceIdFromBlockAri = function extractResourceIdFromBlockAri(blockAri) {
36
- // eslint-disable-next-line require-unicode-regexp
37
- var match = blockAri.match(/ari:cloud:blocks:[^:]+:synced-block\/(.+)$/);
38
- return (match === null || match === void 0 ? void 0 : match[1]) || null;
39
- };
40
-
41
- /**
42
- * Parses the subscription payload into a standardized format.
43
- * @param payload - The raw subscription payload
44
- * @returns Parsed block data or null if parsing fails
45
- */
46
- var parseSubscriptionPayload = function parseSubscriptionPayload(payload) {
47
- try {
48
- var resourceId = extractResourceIdFromBlockAri(payload.blockAri);
49
- if (!resourceId) {
50
- return null;
51
- }
52
- var createdAt;
53
- if (payload.createdAt !== undefined && payload.createdAt !== null) {
54
- try {
55
- // BE returns microseconds, convert to milliseconds
56
- createdAt = new Date(payload.createdAt / 1000).toISOString();
57
- } catch (_unused) {
58
- createdAt = undefined;
59
- }
60
- }
61
- return {
62
- blockAri: payload.blockAri,
63
- blockInstanceId: payload.blockInstanceId,
64
- content: JSON.parse(payload.content),
65
- contentUpdatedAt: (0, _utils.convertContentUpdatedAt)(payload.contentUpdatedAt),
66
- createdAt: createdAt,
67
- createdBy: payload.createdBy,
68
- product: payload.product,
69
- resourceId: resourceId,
70
- sourceAri: payload.sourceAri,
71
- status: payload.status
72
- };
73
- } catch (_unused2) {
74
- return null;
75
- }
76
- };
77
-
78
28
  /**
79
29
  * Creates a GraphQL subscription to block updates using the shared graphql-ws client.
80
30
  *
@@ -90,7 +40,7 @@ var subscribeToBlockUpdates = exports.subscribeToBlockUpdates = function subscri
90
40
  return function () {};
91
41
  }
92
42
  var unsubscribe = client.subscribe({
93
- query: SUBSCRIPTION_QUERY,
43
+ query: _sharedSubscriptionUtils.BLOCK_SERVICE_SUBSCRIPTION_QUERY,
94
44
  variables: {
95
45
  resourceId: blockAri
96
46
  },
@@ -99,7 +49,7 @@ var subscribeToBlockUpdates = exports.subscribeToBlockUpdates = function subscri
99
49
  next: function next(value) {
100
50
  var _value$data;
101
51
  if ((_value$data = value.data) !== null && _value$data !== void 0 && _value$data.blockService_onBlockUpdated) {
102
- var parsed = parseSubscriptionPayload(value.data.blockService_onBlockUpdated);
52
+ var parsed = (0, _sharedSubscriptionUtils.parseSubscriptionPayload)(value.data.blockService_onBlockUpdated);
103
53
  if (parsed !== null) {
104
54
  onData(parsed);
105
55
  } else {
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parseSubscriptionPayload = exports.extractResourceIdFromBlockAri = exports.convertTimestampToISOString = exports.BLOCK_SERVICE_SUBSCRIPTION_QUERY = void 0;
7
+ var _utils = require("../../utils/utils");
8
+ /**
9
+ * Shared GraphQL subscription query for block updates.
10
+ * This is the canonical subscription query used across all implementations.
11
+ */
12
+ var BLOCK_SERVICE_SUBSCRIPTION_QUERY = exports.BLOCK_SERVICE_SUBSCRIPTION_QUERY = "\nsubscription EDITOR_SYNCED_BLOCK_ON_BLOCK_UPDATED($resourceId: ID!) {\n\tblockService_onBlockUpdated(resourceId: $resourceId) {\n\t\tblockAri\n\t\tblockInstanceId\n\t\tcontent\n\t\tcontentUpdatedAt\n\t\tcreatedAt\n\t\tcreatedBy\n\t\tdeletionReason\n\t\tproduct\n\t\tsourceAri\n\t\tstatus\n\t}\n}\n";
13
+
14
+ /**
15
+ * Raw subscription payload from the GraphQL subscription.
16
+ * This represents the exact shape returned by the blockService_onBlockUpdated subscription.
17
+ */
18
+
19
+ /**
20
+ * Parsed and normalized block subscription data.
21
+ * This is the standardized format used across different subscription implementations.
22
+ */
23
+
24
+ /**
25
+ * Extracts the resourceId from a block ARI.
26
+ * Block ARI format: ari:cloud:blocks:<cloudId>:synced-block/<resourceId>
27
+ * @param blockAri - The block ARI string
28
+ * @returns The resourceId portion of the ARI
29
+ */
30
+ var extractResourceIdFromBlockAri = exports.extractResourceIdFromBlockAri = function extractResourceIdFromBlockAri(blockAri) {
31
+ // eslint-disable-next-line require-unicode-regexp
32
+ var match = blockAri.match(/ari:cloud:blocks:[^:]+:synced-block\/(.+)$/);
33
+ return (match === null || match === void 0 ? void 0 : match[1]) || null;
34
+ };
35
+
36
+ /**
37
+ * Converts a timestamp to ISO string.
38
+ * @param timestamp - Timestamp in milliseconds
39
+ * @returns ISO string or undefined if conversion fails
40
+ */
41
+ var convertTimestampToISOString = exports.convertTimestampToISOString = function convertTimestampToISOString(timestamp) {
42
+ if (timestamp === undefined || timestamp === null) {
43
+ return undefined;
44
+ }
45
+ try {
46
+ return new Date(timestamp).toISOString();
47
+ } catch (_unused) {
48
+ return undefined;
49
+ }
50
+ };
51
+
52
+ /**
53
+ * Parses the raw subscription payload into a standardized format.
54
+ * This function handles all the data transformation and error handling consistently
55
+ * across different subscription implementations.
56
+ *
57
+ * @param payload - The raw subscription payload
58
+ * @returns Parsed block data or null if parsing fails
59
+ */
60
+ var parseSubscriptionPayload = exports.parseSubscriptionPayload = function parseSubscriptionPayload(payload) {
61
+ try {
62
+ var resourceId = extractResourceIdFromBlockAri(payload.blockAri);
63
+ if (!resourceId) {
64
+ return null;
65
+ }
66
+ var createdAt = convertTimestampToISOString(payload.createdAt);
67
+ return {
68
+ blockAri: payload.blockAri,
69
+ blockInstanceId: payload.blockInstanceId,
70
+ content: JSON.parse(payload.content),
71
+ contentUpdatedAt: (0, _utils.convertContentUpdatedAt)(payload.contentUpdatedAt),
72
+ createdAt: createdAt,
73
+ createdBy: payload.createdBy,
74
+ product: payload.product,
75
+ resourceId: resourceId,
76
+ sourceAri: payload.sourceAri,
77
+ status: payload.status
78
+ };
79
+ } catch (_unused2) {
80
+ return null;
81
+ }
82
+ };
package/dist/cjs/index.js CHANGED
@@ -3,6 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ Object.defineProperty(exports, "BLOCK_SERVICE_SUBSCRIPTION_QUERY", {
7
+ enumerable: true,
8
+ get: function get() {
9
+ return _sharedSubscriptionUtils.BLOCK_SERVICE_SUBSCRIPTION_QUERY;
10
+ }
11
+ });
6
12
  Object.defineProperty(exports, "BlockError", {
7
13
  enumerable: true,
8
14
  get: function get() {
@@ -57,6 +63,12 @@ Object.defineProperty(exports, "convertPMNodesToSyncBlockNodes", {
57
63
  return _utils.convertPMNodesToSyncBlockNodes;
58
64
  }
59
65
  });
66
+ Object.defineProperty(exports, "convertRelayResponseToSyncBlockInstance", {
67
+ enumerable: true,
68
+ get: function get() {
69
+ return _relayResponseConverter.convertRelayResponseToSyncBlockInstance;
70
+ }
71
+ });
60
72
  Object.defineProperty(exports, "convertSyncBlockJSONNodeToSyncBlockNode", {
61
73
  enumerable: true,
62
74
  get: function get() {
@@ -75,6 +87,18 @@ Object.defineProperty(exports, "convertToSyncBlockData", {
75
87
  return _blockServiceAPI.convertToSyncBlockData;
76
88
  }
77
89
  });
90
+ Object.defineProperty(exports, "createRelayBlockSubscription", {
91
+ enumerable: true,
92
+ get: function get() {
93
+ return _relaySubscriptionUtils.createRelayBlockSubscription;
94
+ }
95
+ });
96
+ Object.defineProperty(exports, "createRelaySubscriptionFunction", {
97
+ enumerable: true,
98
+ get: function get() {
99
+ return _relaySubscriptionUtils.createRelaySubscriptionFunction;
100
+ }
101
+ });
78
102
  Object.defineProperty(exports, "createResourceIdForReference", {
79
103
  enumerable: true,
80
104
  get: function get() {
@@ -183,6 +207,12 @@ Object.defineProperty(exports, "parseResourceId", {
183
207
  return _resourceId.parseResourceId;
184
208
  }
185
209
  });
210
+ Object.defineProperty(exports, "parseSubscriptionPayload", {
211
+ enumerable: true,
212
+ get: function get() {
213
+ return _sharedSubscriptionUtils.parseSubscriptionPayload;
214
+ }
215
+ });
186
216
  Object.defineProperty(exports, "rebaseTransaction", {
187
217
  enumerable: true,
188
218
  get: function get() {
@@ -259,6 +289,9 @@ var _syncBlockProvider = require("./providers/syncBlockProvider");
259
289
  var _referenceSyncBlockStoreManager = require("./store-manager/referenceSyncBlockStoreManager");
260
290
  var _syncBlockInMemorySessionCache = require("./store-manager/syncBlockInMemorySessionCache");
261
291
  var _syncBlockStoreManager = require("./store-manager/syncBlockStoreManager");
292
+ var _sharedSubscriptionUtils = require("./clients/block-service/sharedSubscriptionUtils");
293
+ var _relayResponseConverter = require("./utils/relayResponseConverter");
294
+ var _relaySubscriptionUtils = require("./utils/relaySubscriptionUtils");
262
295
  var _resolveSyncBlockInstance = require("./utils/resolveSyncBlockInstance");
263
296
  var _resourceId = require("./utils/resourceId");
264
297
  var _utils = require("./utils/utils");
@@ -18,6 +18,7 @@ var _blockService = require("../../clients/block-service/blockService");
18
18
  var _blockSubscription = require("../../clients/block-service/blockSubscription");
19
19
  var _types = require("../../common/types");
20
20
  var _errorHandling = require("../../utils/errorHandling");
21
+ var _relaySubscriptionUtils = require("../../utils/relaySubscriptionUtils");
21
22
  var _resourceId2 = require("../../utils/resourceId");
22
23
  var _utils = require("../../utils/utils");
23
24
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -427,10 +428,12 @@ var _batchFetchData = exports.batchFetchData = /*#__PURE__*/function () {
427
428
  var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
428
429
  function BlockServiceADFFetchProvider(_ref4) {
429
430
  var cloudId = _ref4.cloudId,
430
- parentAri = _ref4.parentAri;
431
+ parentAri = _ref4.parentAri,
432
+ relayEnvironment = _ref4.relayEnvironment;
431
433
  (0, _classCallCheck2.default)(this, BlockServiceADFFetchProvider);
432
434
  this.cloudId = cloudId;
433
435
  this.parentAri = parentAri;
436
+ this.relayEnvironment = relayEnvironment;
434
437
  }
435
438
 
436
439
  // resourceId of the reference synced block.
@@ -615,6 +618,7 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
615
618
  }()
616
619
  /**
617
620
  * Subscribes to real-time updates for a specific block using GraphQL WebSocket subscriptions.
621
+ * If a Relay environment is provided, uses Relay subscriptions; otherwise falls back to WebSocket.
618
622
  * @param resourceId - The resource ID of the block to subscribe to
619
623
  * @param onUpdate - Callback function invoked when the block is updated
620
624
  * @param onError - Optional callback function invoked on subscription errors
@@ -628,6 +632,14 @@ var BlockServiceADFFetchProvider = /*#__PURE__*/function () {
628
632
  cloudId: this.cloudId,
629
633
  resourceId: resourceId
630
634
  });
635
+
636
+ // If Relay environment is available, use Relay subscriptions
637
+ if (this.relayEnvironment && (0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
638
+ var relaySubscribeToBlockUpdates = (0, _relaySubscriptionUtils.createRelaySubscriptionFunction)(this.cloudId, this.relayEnvironment);
639
+ return relaySubscribeToBlockUpdates(resourceId, onUpdate, onError);
640
+ }
641
+
642
+ // Fall back to WebSocket subscriptions
631
643
  return (0, _blockSubscription.subscribeToBlockUpdates)(blockAri, function (parsedData) {
632
644
  // Convert ParsedBlockSubscriptionData to SyncBlockInstance
633
645
  var syncBlockInstance = {
@@ -979,11 +991,13 @@ var createBlockServiceAPIProviders = function createBlockServiceAPIProviders(_re
979
991
  parentAri = _ref6.parentAri,
980
992
  parentId = _ref6.parentId,
981
993
  product = _ref6.product,
982
- getVersion = _ref6.getVersion;
994
+ getVersion = _ref6.getVersion,
995
+ relayEnvironment = _ref6.relayEnvironment;
983
996
  return {
984
997
  fetchProvider: new BlockServiceADFFetchProvider({
985
998
  cloudId: cloudId,
986
- parentAri: parentAri
999
+ parentAri: parentAri,
1000
+ relayEnvironment: relayEnvironment
987
1001
  }),
988
1002
  writeProvider: new BlockServiceADFWriteProvider({
989
1003
  cloudId: cloudId,
@@ -999,16 +1013,18 @@ var useMemoizedBlockServiceAPIProviders = exports.useMemoizedBlockServiceAPIProv
999
1013
  parentAri = _ref7.parentAri,
1000
1014
  parentId = _ref7.parentId,
1001
1015
  product = _ref7.product,
1002
- getVersion = _ref7.getVersion;
1016
+ getVersion = _ref7.getVersion,
1017
+ relayEnvironment = _ref7.relayEnvironment;
1003
1018
  return (0, _react.useMemo)(function () {
1004
1019
  return createBlockServiceAPIProviders({
1005
1020
  cloudId: cloudId,
1006
1021
  parentAri: parentAri,
1007
1022
  parentId: parentId,
1008
1023
  product: product,
1009
- getVersion: getVersion
1024
+ getVersion: getVersion,
1025
+ relayEnvironment: relayEnvironment
1010
1026
  });
1011
- }, [cloudId, parentAri, parentId, product, getVersion]);
1027
+ }, [cloudId, parentAri, parentId, product, getVersion, relayEnvironment]);
1012
1028
  };
1013
1029
  var createBlockServiceFetchOnlyAPIProvider = function createBlockServiceFetchOnlyAPIProvider(_ref8) {
1014
1030
  var cloudId = _ref8.cloudId,
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ /**
8
+ * @generated SignedSource<<559b4fb25d0e5bc72be383427a939e2d>>
9
+ * @relayHash 38684212c43376e58fea2d6095011652
10
+ * @lightSyntaxTransform
11
+ * @nogrep
12
+ * @codegen-command: yarn relay
13
+ */
14
+
15
+ /* tslint:disable */
16
+ /* eslint-disable */
17
+ // @ts-nocheck
18
+
19
+ // @relayRequestID c84045a1f05bd1e73ade0a9d8b18462cc3dad5dcae1ebabab76b13135411c530
20
+
21
+ var node = function () {
22
+ var v0 = [{
23
+ "defaultValue": null,
24
+ "kind": "LocalArgument",
25
+ "name": "resourceId"
26
+ }],
27
+ v1 = [{
28
+ "args": [{
29
+ "kind": "Variable",
30
+ "name": "resourceId",
31
+ "variableName": "resourceId"
32
+ }],
33
+ "concreteType": "BlockServiceBlockPayload",
34
+ "kind": "LinkedField",
35
+ "name": "blockService_onBlockUpdated",
36
+ "plural": false,
37
+ "selections": [{
38
+ "kind": "ScalarField",
39
+ "name": "blockAri"
40
+ }, {
41
+ "kind": "ScalarField",
42
+ "name": "blockInstanceId"
43
+ }, {
44
+ "kind": "ScalarField",
45
+ "name": "content"
46
+ }, {
47
+ "kind": "ScalarField",
48
+ "name": "contentUpdatedAt"
49
+ }, {
50
+ "kind": "ScalarField",
51
+ "name": "createdAt"
52
+ }, {
53
+ "kind": "ScalarField",
54
+ "name": "createdBy"
55
+ }, {
56
+ "kind": "ScalarField",
57
+ "name": "deletionReason"
58
+ }, {
59
+ "kind": "ScalarField",
60
+ "name": "product"
61
+ }, {
62
+ "kind": "ScalarField",
63
+ "name": "sourceAri"
64
+ }, {
65
+ "kind": "ScalarField",
66
+ "name": "status"
67
+ }]
68
+ }];
69
+ return {
70
+ "fragment": {
71
+ "argumentDefinitions": v0 /*: any*/,
72
+ "kind": "Fragment",
73
+ "name": "relaySubscriptionUtilsSubscription",
74
+ "selections": v1 /*: any*/,
75
+ "type": "Subscription"
76
+ },
77
+ "kind": "Request",
78
+ "operation": {
79
+ "argumentDefinitions": v0 /*: any*/,
80
+ "kind": "Operation",
81
+ "name": "relaySubscriptionUtilsSubscription",
82
+ "selections": v1 /*: any*/
83
+ },
84
+ "params": {
85
+ "id": "c84045a1f05bd1e73ade0a9d8b18462cc3dad5dcae1ebabab76b13135411c530",
86
+ "metadata": {},
87
+ "name": "relaySubscriptionUtilsSubscription",
88
+ "operationKind": "subscription",
89
+ "text": null
90
+ }
91
+ };
92
+ }();
93
+ node.hash = "6f3ebc87921555436cad753ec1aead2e";
94
+ var _default = exports.default = node;
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.convertParsedDataToSyncBlockInstance = convertParsedDataToSyncBlockInstance;
7
+ exports.convertRelayResponseToSyncBlockInstance = convertRelayResponseToSyncBlockInstance;
8
+ var _sharedSubscriptionUtils = require("../clients/block-service/sharedSubscriptionUtils");
9
+ var _validValue = require("./validValue");
10
+ /**
11
+ * Converts parsed subscription data to SyncBlockInstance format.
12
+ *
13
+ * @param parsed - The parsed subscription data
14
+ * @param resourceId - The resource ID for the block
15
+ * @returns A SyncBlockInstance
16
+ */
17
+ function convertParsedDataToSyncBlockInstance(parsed, resourceId) {
18
+ return {
19
+ data: {
20
+ content: parsed.content,
21
+ contentUpdatedAt: parsed.contentUpdatedAt,
22
+ resourceId: parsed.blockAri,
23
+ blockInstanceId: parsed.blockInstanceId,
24
+ sourceAri: parsed.sourceAri,
25
+ product: parsed.product,
26
+ createdAt: parsed.createdAt,
27
+ createdBy: parsed.createdBy,
28
+ status: (0, _validValue.normaliseSyncBlockStatus)(parsed.status)
29
+ },
30
+ resourceId: resourceId
31
+ };
32
+ }
33
+
34
+ /**
35
+ * Converts a Relay subscription response to SyncBlockInstance format using shared parsing logic.
36
+
37
+ * @param response - The Relay subscription response containing block update data
38
+ * @param resourceId - The resource ID for the block
39
+ * @returns A SyncBlockInstance or null if parsing fails
40
+ *
41
+ * @example
42
+ * ```typescript
43
+ * // In a Relay subscription handler
44
+ * onNext: (response) => {
45
+ * if (response?.blockService_onBlockUpdated) {
46
+ * const syncBlockInstance = convertRelayResponseToSyncBlockInstance(
47
+ * response.blockService_onBlockUpdated,
48
+ * resourceId,
49
+ * );
50
+ * if (syncBlockInstance) {
51
+ * onUpdate(syncBlockInstance);
52
+ * }
53
+ * }
54
+ * }
55
+ * ```
56
+ */
57
+ function convertRelayResponseToSyncBlockInstance(response, resourceId) {
58
+ var _response$contentUpda, _response$deletionRea;
59
+ var payload = {
60
+ blockAri: response.blockAri,
61
+ blockInstanceId: response.blockInstanceId,
62
+ content: response.content,
63
+ contentUpdatedAt: (_response$contentUpda = response.contentUpdatedAt) !== null && _response$contentUpda !== void 0 ? _response$contentUpda : undefined,
64
+ createdAt: response.createdAt,
65
+ createdBy: response.createdBy,
66
+ deletionReason: (_response$deletionRea = response.deletionReason) !== null && _response$deletionRea !== void 0 ? _response$deletionRea : undefined,
67
+ product: response.product,
68
+ sourceAri: response.sourceAri,
69
+ status: response.status
70
+ };
71
+ var parsed = (0, _sharedSubscriptionUtils.parseSubscriptionPayload)(payload);
72
+ if (!parsed) {
73
+ return null;
74
+ }
75
+ return convertParsedDataToSyncBlockInstance(parsed, resourceId);
76
+ }
@@ -0,0 +1,130 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.createRelayBlockSubscription = createRelayBlockSubscription;
8
+ exports.createRelaySubscriptionFunction = createRelaySubscriptionFunction;
9
+ var _relayRuntime = require("relay-runtime");
10
+ var _ari = require("../clients/block-service/ari");
11
+ var _blockSubscription = require("../clients/block-service/blockSubscription");
12
+ var _relaySubscriptionUtilsSubscription = _interopRequireDefault(require("./__generated__/relaySubscriptionUtilsSubscription.graphql"));
13
+ var _relayResponseConverter = require("./relayResponseConverter");
14
+ /**
15
+ * Configuration for creating a Relay block subscription.
16
+ */
17
+
18
+ /**
19
+ * Creates a Relay-based block subscription without needing to wrap providers.
20
+ * This is a clean utility function that can be used directly in components or hooks.
21
+ *
22
+ * @param config - Configuration for the subscription
23
+ * @returns An unsubscribe function to dispose the subscription
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * const unsubscribe = createRelayBlockSubscription({
28
+ * relayEnvironment: environment,
29
+ * cloudId: 'my-cloud-id',
30
+ * resourceId: 'my-resource-id',
31
+ * onUpdate: (blockInstance) => {
32
+ * console.log('Block updated:', blockInstance);
33
+ * },
34
+ * onError: (error) => {
35
+ * console.error('Subscription error:', error);
36
+ * }
37
+ * });
38
+ *
39
+ * // Later, when component unmounts or subscription is no longer needed
40
+ * unsubscribe();
41
+ * ```
42
+ */
43
+ function createRelayBlockSubscription(config) {
44
+ var relayEnvironment = config.relayEnvironment,
45
+ cloudId = config.cloudId,
46
+ resourceId = config.resourceId,
47
+ onUpdate = config.onUpdate,
48
+ _onError = config.onError;
49
+
50
+ // Convert resourceId to blockAri for the subscription
51
+ var blockAri = (0, _ari.generateBlockAriFromReference)({
52
+ cloudId: cloudId,
53
+ resourceId: resourceId
54
+ });
55
+ var subscriptionQuery = _relaySubscriptionUtilsSubscription.default;
56
+
57
+ // Try to use Relay subscription first
58
+ try {
59
+ var disposable = (0, _relayRuntime.requestSubscription)(relayEnvironment, {
60
+ subscription: subscriptionQuery,
61
+ variables: {
62
+ resourceId: blockAri
63
+ },
64
+ onNext: function onNext(response) {
65
+ if (response !== null && response !== void 0 && response.blockService_onBlockUpdated) {
66
+ var syncBlockInstance = (0, _relayResponseConverter.convertRelayResponseToSyncBlockInstance)(response.blockService_onBlockUpdated, resourceId);
67
+ if (syncBlockInstance) {
68
+ onUpdate(syncBlockInstance);
69
+ } else {
70
+ _onError === null || _onError === void 0 || _onError(new Error('Failed to parse Relay block subscription payload'));
71
+ }
72
+ }
73
+ },
74
+ onError: function onError(error) {
75
+ _onError === null || _onError === void 0 || _onError(error);
76
+ }
77
+ });
78
+
79
+ // If subscription was successfully created, return the unsubscribe function
80
+ if (disposable) {
81
+ return function () {
82
+ disposable.dispose();
83
+ };
84
+ }
85
+ } catch (error) {
86
+ // If requestSubscription throws, fall back to WebSocket
87
+ _onError === null || _onError === void 0 || _onError(error instanceof Error ? error : new Error('Relay subscription failed'));
88
+ }
89
+
90
+ // Fallback to WebSocket subscription when Relay subscriptions aren't available
91
+ return (0, _blockSubscription.subscribeToBlockUpdates)(blockAri, function (parsedData) {
92
+ var syncBlockInstance = (0, _relayResponseConverter.convertParsedDataToSyncBlockInstance)(parsedData, parsedData.resourceId);
93
+ onUpdate(syncBlockInstance);
94
+ }, function (error) {
95
+ _onError === null || _onError === void 0 || _onError(error);
96
+ });
97
+ }
98
+
99
+ /**
100
+ * Hook-like function to create a subscription function that can be passed to providers.
101
+ * This creates a function with the same signature as subscribeToBlockUpdates that uses Relay.
102
+ *
103
+ * @param cloudId - Cloud ID for generating block ARIs
104
+ * @param relayEnvironment - Optional Relay environment. If not provided, will attempt to use global environment
105
+ * @returns A function that can be used as subscribeToBlockUpdates in provider configurations
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const relaySubscribeToBlockUpdates = createRelaySubscriptionFunction(cloudId, environment);
110
+ *
111
+ * // Can be used directly as a subscribeToBlockUpdates replacement
112
+ * const unsubscribe = relaySubscribeToBlockUpdates(resourceId, onUpdate, onError);
113
+ * ```
114
+ */
115
+ function createRelaySubscriptionFunction(cloudId, relayEnvironment) {
116
+ return function (resourceId, onUpdate, onError) {
117
+ var environment = relayEnvironment;
118
+ if (!environment) {
119
+ onError === null || onError === void 0 || onError(new Error('Relay environment not available'));
120
+ return function () {};
121
+ }
122
+ return createRelayBlockSubscription({
123
+ relayEnvironment: environment,
124
+ cloudId: cloudId,
125
+ resourceId: resourceId,
126
+ onUpdate: onUpdate,
127
+ onError: onError
128
+ });
129
+ };
130
+ }