@atlaskit/editor-synced-block-provider 3.30.2 → 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.
- package/CHANGELOG.md +16 -0
- package/dist/cjs/clients/block-service/blockSubscription.js +3 -53
- package/dist/cjs/clients/block-service/sharedSubscriptionUtils.js +82 -0
- package/dist/cjs/index.js +46 -0
- package/dist/cjs/providers/block-service/blockServiceAPI.js +22 -6
- package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +25 -46
- package/dist/cjs/store-manager/syncBlockInMemorySessionCache.js +75 -0
- package/dist/cjs/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +94 -0
- package/dist/cjs/utils/relayResponseConverter.js +76 -0
- package/dist/cjs/utils/relaySubscriptionUtils.js +130 -0
- package/dist/es2019/clients/block-service/blockSubscription.js +2 -67
- package/dist/es2019/clients/block-service/sharedSubscriptionUtils.js +91 -0
- package/dist/es2019/index.js +5 -0
- package/dist/es2019/providers/block-service/blockServiceAPI.js +22 -6
- package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +22 -43
- package/dist/es2019/store-manager/syncBlockInMemorySessionCache.js +57 -0
- package/dist/es2019/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +88 -0
- package/dist/es2019/utils/relayResponseConverter.js +69 -0
- package/dist/es2019/utils/relaySubscriptionUtils.js +125 -0
- package/dist/esm/clients/block-service/blockSubscription.js +2 -52
- package/dist/esm/clients/block-service/sharedSubscriptionUtils.js +76 -0
- package/dist/esm/index.js +5 -0
- package/dist/esm/providers/block-service/blockServiceAPI.js +22 -6
- package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +25 -46
- package/dist/esm/store-manager/syncBlockInMemorySessionCache.js +68 -0
- package/dist/esm/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.js +88 -0
- package/dist/esm/utils/relayResponseConverter.js +69 -0
- package/dist/esm/utils/relaySubscriptionUtils.js +123 -0
- package/dist/types/clients/block-service/blockSubscription.d.ts +1 -26
- package/dist/types/clients/block-service/sharedSubscriptionUtils.d.ts +61 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/providers/block-service/blockServiceAPI.d.ts +7 -2
- package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +3 -3
- package/dist/types/store-manager/syncBlockInMemorySessionCache.d.ts +23 -0
- package/dist/types/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.d.ts +31 -0
- package/dist/types/utils/relayResponseConverter.d.ts +47 -0
- package/dist/types/utils/relaySubscriptionUtils.d.ts +61 -0
- package/dist/types/utils/validValue.d.ts +1 -1
- package/dist/types-ts4.5/clients/block-service/blockSubscription.d.ts +1 -26
- package/dist/types-ts4.5/clients/block-service/sharedSubscriptionUtils.d.ts +61 -0
- package/dist/types-ts4.5/index.d.ts +5 -0
- package/dist/types-ts4.5/providers/block-service/blockServiceAPI.d.ts +7 -2
- package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +3 -3
- package/dist/types-ts4.5/store-manager/syncBlockInMemorySessionCache.d.ts +23 -0
- package/dist/types-ts4.5/utils/__generated__/relaySubscriptionUtilsSubscription.graphql.d.ts +31 -0
- package/dist/types-ts4.5/utils/relayResponseConverter.d.ts +47 -0
- package/dist/types-ts4.5/utils/relaySubscriptionUtils.d.ts +61 -0
- package/dist/types-ts4.5/utils/validValue.d.ts +1 -1
- package/package.json +3 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
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
|
+
|
|
11
|
+
## 3.30.3
|
|
12
|
+
|
|
13
|
+
### Patch Changes
|
|
14
|
+
|
|
15
|
+
- [`5ddfc9ed0352f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5ddfc9ed0352f) -
|
|
16
|
+
Switched from browser session storage to in memory session storage
|
|
17
|
+
- Updated dependencies
|
|
18
|
+
|
|
3
19
|
## 3.30.2
|
|
4
20
|
|
|
5
21
|
### 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
|
|
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:
|
|
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() {
|
|
@@ -21,6 +27,12 @@ Object.defineProperty(exports, "SyncBlockError", {
|
|
|
21
27
|
return _types.SyncBlockError;
|
|
22
28
|
}
|
|
23
29
|
});
|
|
30
|
+
Object.defineProperty(exports, "SyncBlockInMemorySessionCache", {
|
|
31
|
+
enumerable: true,
|
|
32
|
+
get: function get() {
|
|
33
|
+
return _syncBlockInMemorySessionCache.SyncBlockInMemorySessionCache;
|
|
34
|
+
}
|
|
35
|
+
});
|
|
24
36
|
Object.defineProperty(exports, "SyncBlockStoreManager", {
|
|
25
37
|
enumerable: true,
|
|
26
38
|
get: function get() {
|
|
@@ -51,6 +63,12 @@ Object.defineProperty(exports, "convertPMNodesToSyncBlockNodes", {
|
|
|
51
63
|
return _utils.convertPMNodesToSyncBlockNodes;
|
|
52
64
|
}
|
|
53
65
|
});
|
|
66
|
+
Object.defineProperty(exports, "convertRelayResponseToSyncBlockInstance", {
|
|
67
|
+
enumerable: true,
|
|
68
|
+
get: function get() {
|
|
69
|
+
return _relayResponseConverter.convertRelayResponseToSyncBlockInstance;
|
|
70
|
+
}
|
|
71
|
+
});
|
|
54
72
|
Object.defineProperty(exports, "convertSyncBlockJSONNodeToSyncBlockNode", {
|
|
55
73
|
enumerable: true,
|
|
56
74
|
get: function get() {
|
|
@@ -69,6 +87,18 @@ Object.defineProperty(exports, "convertToSyncBlockData", {
|
|
|
69
87
|
return _blockServiceAPI.convertToSyncBlockData;
|
|
70
88
|
}
|
|
71
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
|
+
});
|
|
72
102
|
Object.defineProperty(exports, "createResourceIdForReference", {
|
|
73
103
|
enumerable: true,
|
|
74
104
|
get: function get() {
|
|
@@ -177,6 +207,12 @@ Object.defineProperty(exports, "parseResourceId", {
|
|
|
177
207
|
return _resourceId.parseResourceId;
|
|
178
208
|
}
|
|
179
209
|
});
|
|
210
|
+
Object.defineProperty(exports, "parseSubscriptionPayload", {
|
|
211
|
+
enumerable: true,
|
|
212
|
+
get: function get() {
|
|
213
|
+
return _sharedSubscriptionUtils.parseSubscriptionPayload;
|
|
214
|
+
}
|
|
215
|
+
});
|
|
180
216
|
Object.defineProperty(exports, "rebaseTransaction", {
|
|
181
217
|
enumerable: true,
|
|
182
218
|
get: function get() {
|
|
@@ -189,6 +225,12 @@ Object.defineProperty(exports, "resolveSyncBlockInstance", {
|
|
|
189
225
|
return _resolveSyncBlockInstance.resolveSyncBlockInstance;
|
|
190
226
|
}
|
|
191
227
|
});
|
|
228
|
+
Object.defineProperty(exports, "syncBlockInMemorySessionCache", {
|
|
229
|
+
enumerable: true,
|
|
230
|
+
get: function get() {
|
|
231
|
+
return _syncBlockInMemorySessionCache.syncBlockInMemorySessionCache;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
192
234
|
Object.defineProperty(exports, "useFetchSyncBlockData", {
|
|
193
235
|
enumerable: true,
|
|
194
236
|
get: function get() {
|
|
@@ -245,7 +287,11 @@ var _blockServiceAPI = require("./providers/block-service/blockServiceAPI");
|
|
|
245
287
|
var _sourceInfo = require("./clients/confluence/sourceInfo");
|
|
246
288
|
var _syncBlockProvider = require("./providers/syncBlockProvider");
|
|
247
289
|
var _referenceSyncBlockStoreManager = require("./store-manager/referenceSyncBlockStoreManager");
|
|
290
|
+
var _syncBlockInMemorySessionCache = require("./store-manager/syncBlockInMemorySessionCache");
|
|
248
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");
|
|
249
295
|
var _resolveSyncBlockInstance = require("./utils/resolveSyncBlockInstance");
|
|
250
296
|
var _resourceId = require("./utils/resourceId");
|
|
251
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,
|
|
@@ -22,12 +22,13 @@ var _experienceTracking = require("../utils/experienceTracking");
|
|
|
22
22
|
var _resolveSyncBlockInstance = require("../utils/resolveSyncBlockInstance");
|
|
23
23
|
var _resourceId = require("../utils/resourceId");
|
|
24
24
|
var _utils = require("../utils/utils");
|
|
25
|
+
var _syncBlockInMemorySessionCache = require("./syncBlockInMemorySessionCache");
|
|
25
26
|
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; }
|
|
26
27
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
27
28
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
|
|
28
29
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
29
30
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
30
|
-
var
|
|
31
|
+
var CACHE_KEY_PREFIX = 'sync-block-data-';
|
|
31
32
|
|
|
32
33
|
// A store manager responsible for the lifecycle and state management of reference sync blocks in an editor instance.
|
|
33
34
|
// Designed to manage local in-memory state and synchronize with an external data provider.
|
|
@@ -85,8 +86,8 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
85
86
|
this.subscriptionChangeListeners = new Set();
|
|
86
87
|
this.newlyAddedSyncBlocks = new Set();
|
|
87
88
|
|
|
88
|
-
// The provider might have SSR data cache already set, so we need to update the cache in session storage
|
|
89
|
-
this.
|
|
89
|
+
// The provider might have SSR data cache already set, so we need to update the cache in session memory storage
|
|
90
|
+
this.setSSRDataInSessionCache((_this$dataProvider = this.dataProvider) === null || _this$dataProvider === void 0 ? void 0 : _this$dataProvider.getNodeDataCacheKeys());
|
|
90
91
|
}
|
|
91
92
|
|
|
92
93
|
/**
|
|
@@ -225,52 +226,32 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
225
226
|
value: function getInitialSyncBlockData(resourceId) {
|
|
226
227
|
var _this$dataProvider2;
|
|
227
228
|
var syncBlockNode = (0, _utils.createSyncBlockNode)('', resourceId);
|
|
228
|
-
var
|
|
229
|
-
if (
|
|
230
|
-
return
|
|
229
|
+
var providerData = (_this$dataProvider2 = this.dataProvider) === null || _this$dataProvider2 === void 0 || (_this$dataProvider2 = _this$dataProvider2.getNodeDataFromCache(syncBlockNode)) === null || _this$dataProvider2 === void 0 ? void 0 : _this$dataProvider2.data;
|
|
230
|
+
if (providerData) {
|
|
231
|
+
return providerData;
|
|
231
232
|
}
|
|
232
|
-
|
|
233
|
-
var sessionData = this.getSyncBlockDataFromSessionStorage(resourceId);
|
|
234
|
-
if (sessionData) {
|
|
235
|
-
return sessionData;
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
return undefined;
|
|
233
|
+
return this.getFromSessionCache(resourceId);
|
|
239
234
|
}
|
|
240
235
|
}, {
|
|
241
|
-
key: "
|
|
242
|
-
value: function
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
sessionStorage.setItem("".concat(SESSION_STORAGE_KEY_PREFIX).concat(resourceId), JSON.stringify(latestData));
|
|
247
|
-
}
|
|
248
|
-
} catch (error) {
|
|
249
|
-
(0, _monitoring.logException)(error, {
|
|
250
|
-
location: 'editor-synced-block-provider/referenceSyncBlockStoreManager/updateCacheInSessionStorage'
|
|
251
|
-
});
|
|
236
|
+
key: "updateSessionCache",
|
|
237
|
+
value: function updateSessionCache(resourceId) {
|
|
238
|
+
var latestData = this.getFromCache(resourceId);
|
|
239
|
+
if (latestData) {
|
|
240
|
+
_syncBlockInMemorySessionCache.syncBlockInMemorySessionCache.setItem("".concat(CACHE_KEY_PREFIX).concat(resourceId), JSON.stringify(latestData));
|
|
252
241
|
}
|
|
253
242
|
}
|
|
254
243
|
}, {
|
|
255
|
-
key: "
|
|
256
|
-
value: function
|
|
257
|
-
var sessionData = null;
|
|
258
|
-
try {
|
|
259
|
-
sessionData = sessionStorage.getItem("".concat(SESSION_STORAGE_KEY_PREFIX).concat(resourceId));
|
|
260
|
-
} catch (error) {
|
|
261
|
-
(0, _monitoring.logException)(error, {
|
|
262
|
-
location: 'editor-synced-block-provider/referenceSyncBlockStoreManager/getSyncBlockDataFromSessionStorage'
|
|
263
|
-
});
|
|
264
|
-
return undefined;
|
|
265
|
-
}
|
|
266
|
-
if (!sessionData) {
|
|
267
|
-
return undefined;
|
|
268
|
-
}
|
|
244
|
+
key: "getFromSessionCache",
|
|
245
|
+
value: function getFromSessionCache(resourceId) {
|
|
269
246
|
try {
|
|
270
|
-
|
|
247
|
+
var raw = _syncBlockInMemorySessionCache.syncBlockInMemorySessionCache.getItem("".concat(CACHE_KEY_PREFIX).concat(resourceId));
|
|
248
|
+
if (!raw) {
|
|
249
|
+
return undefined;
|
|
250
|
+
}
|
|
251
|
+
return JSON.parse(raw);
|
|
271
252
|
} catch (error) {
|
|
272
253
|
(0, _monitoring.logException)(error, {
|
|
273
|
-
location: 'editor-synced-block-provider/referenceSyncBlockStoreManager/
|
|
254
|
+
location: 'editor-synced-block-provider/referenceSyncBlockStoreManager/getFromSessionCache'
|
|
274
255
|
});
|
|
275
256
|
return undefined;
|
|
276
257
|
}
|
|
@@ -846,7 +827,7 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
846
827
|
});
|
|
847
828
|
}
|
|
848
829
|
if ((0, _platformFeatureFlags.fg)('platform_synced_block_patch_3')) {
|
|
849
|
-
this.
|
|
830
|
+
this.updateSessionCache(resourceId);
|
|
850
831
|
}
|
|
851
832
|
}
|
|
852
833
|
}
|
|
@@ -891,14 +872,14 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
891
872
|
}
|
|
892
873
|
}
|
|
893
874
|
}, {
|
|
894
|
-
key: "
|
|
895
|
-
value: function
|
|
875
|
+
key: "setSSRDataInSessionCache",
|
|
876
|
+
value: function setSSRDataInSessionCache(resourceIds) {
|
|
896
877
|
var _this0 = this;
|
|
897
878
|
if (!resourceIds || resourceIds.length === 0) {
|
|
898
879
|
return;
|
|
899
880
|
}
|
|
900
881
|
resourceIds.forEach(function (resourceId) {
|
|
901
|
-
_this0.
|
|
882
|
+
_this0.updateSessionCache(resourceId);
|
|
902
883
|
});
|
|
903
884
|
}
|
|
904
885
|
}, {
|
|
@@ -929,8 +910,6 @@ var ReferenceSyncBlockStoreManager = exports.ReferenceSyncBlockStoreManager = /*
|
|
|
929
910
|
this.notifySubscriptionChangeListeners();
|
|
930
911
|
}
|
|
931
912
|
var syncBlockNode = (0, _utils.createSyncBlockNode)(localId, resourceId);
|
|
932
|
-
|
|
933
|
-
// call the callback immediately if we have cached data
|
|
934
913
|
var cachedData = (_this$dataProvider7 = this.dataProvider) === null || _this$dataProvider7 === void 0 || (_this$dataProvider7 = _this$dataProvider7.getNodeDataFromCache(syncBlockNode)) === null || _this$dataProvider7 === void 0 ? void 0 : _this$dataProvider7.data;
|
|
935
914
|
if (cachedData) {
|
|
936
915
|
callback(cachedData);
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.syncBlockInMemorySessionCache = exports.SyncBlockInMemorySessionCache = void 0;
|
|
8
|
+
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
|
|
9
|
+
var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
|
|
10
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
11
|
+
/**
|
|
12
|
+
* In-memory session cache for sync block data with size-based LRU eviction.
|
|
13
|
+
*
|
|
14
|
+
* Backed by a plain Map so that potentially private ADF content is never
|
|
15
|
+
* written to any browser-persistent storage (sessionStorage, localStorage,
|
|
16
|
+
* IndexedDB). The module-level singleton survives SPA transitions (no full
|
|
17
|
+
* page reload) and is naturally cleared on hard navigation or tab close.
|
|
18
|
+
*
|
|
19
|
+
* Uses JavaScript Map's insertion-order guarantee to implement LRU:
|
|
20
|
+
* on every read or write the accessed entry is moved to the end of the
|
|
21
|
+
* iteration order; when total cached size exceeds `maxSize`, the oldest
|
|
22
|
+
* (least-recently-used) entries are evicted first.
|
|
23
|
+
*/
|
|
24
|
+
var SyncBlockInMemorySessionCache = exports.SyncBlockInMemorySessionCache = /*#__PURE__*/function () {
|
|
25
|
+
function SyncBlockInMemorySessionCache() {
|
|
26
|
+
var maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5 * 1024 * 1024;
|
|
27
|
+
(0, _classCallCheck2.default)(this, SyncBlockInMemorySessionCache);
|
|
28
|
+
(0, _defineProperty2.default)(this, "store", new Map());
|
|
29
|
+
(0, _defineProperty2.default)(this, "currentSize", 0);
|
|
30
|
+
this.maxSize = maxSize;
|
|
31
|
+
}
|
|
32
|
+
return (0, _createClass2.default)(SyncBlockInMemorySessionCache, [{
|
|
33
|
+
key: "getItem",
|
|
34
|
+
value: function getItem(key) {
|
|
35
|
+
var value = this.store.get(key);
|
|
36
|
+
if (value === undefined) {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
this.store.delete(key);
|
|
40
|
+
this.store.set(key, value);
|
|
41
|
+
return value;
|
|
42
|
+
}
|
|
43
|
+
}, {
|
|
44
|
+
key: "setItem",
|
|
45
|
+
value: function setItem(key, value) {
|
|
46
|
+
var existing = this.store.get(key);
|
|
47
|
+
if (existing !== undefined) {
|
|
48
|
+
this.currentSize -= existing.length;
|
|
49
|
+
this.store.delete(key);
|
|
50
|
+
}
|
|
51
|
+
this.store.set(key, value);
|
|
52
|
+
this.currentSize += value.length;
|
|
53
|
+
while (this.currentSize > this.maxSize && this.store.size > 1) {
|
|
54
|
+
var oldestKey = this.store.keys().next().value;
|
|
55
|
+
if (oldestKey !== undefined) {
|
|
56
|
+
var oldestValue = this.store.get(oldestKey);
|
|
57
|
+
if (oldestValue !== undefined) {
|
|
58
|
+
this.currentSize -= oldestValue.length;
|
|
59
|
+
}
|
|
60
|
+
this.store.delete(oldestKey);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}, {
|
|
65
|
+
key: "removeItem",
|
|
66
|
+
value: function removeItem(key) {
|
|
67
|
+
var value = this.store.get(key);
|
|
68
|
+
if (value !== undefined) {
|
|
69
|
+
this.currentSize -= value.length;
|
|
70
|
+
this.store.delete(key);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}]);
|
|
74
|
+
}();
|
|
75
|
+
var syncBlockInMemorySessionCache = exports.syncBlockInMemorySessionCache = new SyncBlockInMemorySessionCache();
|
|
@@ -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;
|