@atlaskit/editor-synced-block-provider 3.31.0 → 3.31.2

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 (32) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/dist/cjs/store-manager/referenceSyncBlockStoreManager.js +117 -9
  3. package/dist/cjs/store-manager/sourceSyncBlockStoreManager.js +16 -0
  4. package/dist/cjs/store-manager/syncBlockBatchFetcher.js +76 -0
  5. package/dist/cjs/store-manager/syncBlockInMemorySessionCache.js +26 -0
  6. package/dist/cjs/store-manager/syncBlockProviderFactoryManager.js +175 -0
  7. package/dist/cjs/store-manager/syncBlockSubscriptionManager.js +198 -0
  8. package/dist/es2019/store-manager/referenceSyncBlockStoreManager.js +93 -9
  9. package/dist/es2019/store-manager/sourceSyncBlockStoreManager.js +12 -0
  10. package/dist/es2019/store-manager/syncBlockBatchFetcher.js +56 -0
  11. package/dist/es2019/store-manager/syncBlockInMemorySessionCache.js +24 -0
  12. package/dist/es2019/store-manager/syncBlockProviderFactoryManager.js +158 -0
  13. package/dist/es2019/store-manager/syncBlockSubscriptionManager.js +136 -0
  14. package/dist/esm/store-manager/referenceSyncBlockStoreManager.js +117 -9
  15. package/dist/esm/store-manager/sourceSyncBlockStoreManager.js +16 -0
  16. package/dist/esm/store-manager/syncBlockBatchFetcher.js +69 -0
  17. package/dist/esm/store-manager/syncBlockInMemorySessionCache.js +26 -0
  18. package/dist/esm/store-manager/syncBlockProviderFactoryManager.js +168 -0
  19. package/dist/esm/store-manager/syncBlockSubscriptionManager.js +191 -0
  20. package/dist/types/store-manager/referenceSyncBlockStoreManager.d.ts +3 -0
  21. package/dist/types/store-manager/sourceSyncBlockStoreManager.d.ts +2 -0
  22. package/dist/types/store-manager/syncBlockBatchFetcher.d.ts +25 -0
  23. package/dist/types/store-manager/syncBlockInMemorySessionCache.d.ts +18 -0
  24. package/dist/types/store-manager/syncBlockProviderFactoryManager.d.ts +25 -0
  25. package/dist/types/store-manager/syncBlockSubscriptionManager.d.ts +38 -0
  26. package/dist/types-ts4.5/store-manager/referenceSyncBlockStoreManager.d.ts +3 -0
  27. package/dist/types-ts4.5/store-manager/sourceSyncBlockStoreManager.d.ts +2 -0
  28. package/dist/types-ts4.5/store-manager/syncBlockBatchFetcher.d.ts +25 -0
  29. package/dist/types-ts4.5/store-manager/syncBlockInMemorySessionCache.d.ts +18 -0
  30. package/dist/types-ts4.5/store-manager/syncBlockProviderFactoryManager.d.ts +25 -0
  31. package/dist/types-ts4.5/store-manager/syncBlockSubscriptionManager.d.ts +38 -0
  32. package/package.json +5 -2
@@ -15,6 +15,13 @@ import _defineProperty from "@babel/runtime/helpers/defineProperty";
15
15
  * (least-recently-used) entries are evicted first.
16
16
  */
17
17
  export var SyncBlockInMemorySessionCache = /*#__PURE__*/function () {
18
+ /**
19
+ * Maximum total size of all cached values, measured in **UTF-16 code
20
+ * units** (i.e. `String.prototype.length`), not bytes. For ASCII-only
21
+ * content the two are equivalent; for content with characters outside
22
+ * the BMP each surrogate pair counts as 2.
23
+ */
24
+
18
25
  function SyncBlockInMemorySessionCache() {
19
26
  var maxSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 5 * 1024 * 1024;
20
27
  _classCallCheck(this, SyncBlockInMemorySessionCache);
@@ -22,6 +29,14 @@ export var SyncBlockInMemorySessionCache = /*#__PURE__*/function () {
22
29
  _defineProperty(this, "currentSize", 0);
23
30
  this.maxSize = maxSize;
24
31
  }
32
+
33
+ /**
34
+ * Retrieves a cached value by key.
35
+ *
36
+ * **Side-effect:** promotes the entry to the most-recently-used
37
+ * position by re-inserting it at the end of the underlying Map's
38
+ * iteration order.
39
+ */
25
40
  return _createClass(SyncBlockInMemorySessionCache, [{
26
41
  key: "getItem",
27
42
  value: function getItem(key) {
@@ -63,6 +78,17 @@ export var SyncBlockInMemorySessionCache = /*#__PURE__*/function () {
63
78
  this.store.delete(key);
64
79
  }
65
80
  }
81
+
82
+ /**
83
+ * Removes all entries from the cache and resets the tracked size to zero.
84
+ * Useful for cleaning up the singleton on SPA navigation boundaries.
85
+ */
86
+ }, {
87
+ key: "clear",
88
+ value: function clear() {
89
+ this.store.clear();
90
+ this.currentSize = 0;
91
+ }
66
92
  }]);
67
93
  }();
68
94
  export var syncBlockInMemorySessionCache = new SyncBlockInMemorySessionCache();
@@ -0,0 +1,168 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/createClass";
3
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ import { logException } from '@atlaskit/editor-common/monitoring';
5
+ import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
6
+ import { fetchErrorPayload } from '../utils/errorHandling';
7
+ import { parseResourceId } from '../utils/resourceId';
8
+ /**
9
+ * Manages creation and caching of ProviderFactory instances used to
10
+ * render synced block content (media, emoji, smart links, etc.).
11
+ */
12
+ export var SyncBlockProviderFactoryManager = /*#__PURE__*/function () {
13
+ function SyncBlockProviderFactoryManager(deps) {
14
+ _classCallCheck(this, SyncBlockProviderFactoryManager);
15
+ _defineProperty(this, "providerFactories", new Map());
16
+ this.deps = deps;
17
+ }
18
+ return _createClass(SyncBlockProviderFactoryManager, [{
19
+ key: "getProviderFactory",
20
+ value: function getProviderFactory(resourceId) {
21
+ var dataProvider = this.deps.getDataProvider();
22
+ if (!dataProvider) {
23
+ var _this$deps$getFireAna;
24
+ var error = new Error('Data provider not set');
25
+ logException(error, {
26
+ location: 'editor-synced-block-provider/syncBlockProviderFactoryManager'
27
+ });
28
+ (_this$deps$getFireAna = this.deps.getFireAnalyticsEvent()) === null || _this$deps$getFireAna === void 0 || _this$deps$getFireAna(fetchErrorPayload(error.message));
29
+ return undefined;
30
+ }
31
+ var _dataProvider$getSync = dataProvider.getSyncedBlockRendererProviderOptions(),
32
+ parentDataProviders = _dataProvider$getSync.parentDataProviders,
33
+ providerCreator = _dataProvider$getSync.providerCreator;
34
+ var providerFactory = this.providerFactories.get(resourceId);
35
+ if (!providerFactory) {
36
+ providerFactory = ProviderFactory.create({
37
+ mentionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mentionProvider,
38
+ profilecardProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.profilecardProvider,
39
+ taskDecisionProvider: parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.taskDecisionProvider
40
+ });
41
+ this.providerFactories.set(resourceId, providerFactory);
42
+ } else {
43
+ if (parentDataProviders !== null && parentDataProviders !== void 0 && parentDataProviders.mentionProvider) {
44
+ providerFactory.setProvider('mentionProvider', parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.mentionProvider);
45
+ }
46
+ if (parentDataProviders !== null && parentDataProviders !== void 0 && parentDataProviders.profilecardProvider) {
47
+ providerFactory.setProvider('profilecardProvider', parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.profilecardProvider);
48
+ }
49
+ if (parentDataProviders !== null && parentDataProviders !== void 0 && parentDataProviders.taskDecisionProvider) {
50
+ providerFactory.setProvider('taskDecisionProvider', parentDataProviders === null || parentDataProviders === void 0 ? void 0 : parentDataProviders.taskDecisionProvider);
51
+ }
52
+ }
53
+ if (providerCreator) {
54
+ try {
55
+ this.retrieveDynamicProviders(resourceId, providerFactory, providerCreator);
56
+ } catch (error) {
57
+ var _this$deps$getFireAna2;
58
+ logException(error, {
59
+ location: 'editor-synced-block-provider/syncBlockProviderFactoryManager'
60
+ });
61
+ (_this$deps$getFireAna2 = this.deps.getFireAnalyticsEvent()) === null || _this$deps$getFireAna2 === void 0 || _this$deps$getFireAna2(fetchErrorPayload(error.message, resourceId));
62
+ }
63
+ }
64
+ return providerFactory;
65
+ }
66
+ }, {
67
+ key: "getSSRProviders",
68
+ value: function getSSRProviders(resourceId) {
69
+ var dataProvider = this.deps.getDataProvider();
70
+ if (!dataProvider) {
71
+ return null;
72
+ }
73
+ var _dataProvider$getSync2 = dataProvider.getSyncedBlockRendererProviderOptions(),
74
+ providerCreator = _dataProvider$getSync2.providerCreator;
75
+ if (!(providerCreator !== null && providerCreator !== void 0 && providerCreator.createSSRMediaProvider)) {
76
+ return null;
77
+ }
78
+ var parsedResourceId = parseResourceId(resourceId);
79
+ if (!parsedResourceId) {
80
+ return null;
81
+ }
82
+ var contentId = parsedResourceId.contentId,
83
+ contentProduct = parsedResourceId.product;
84
+ try {
85
+ var mediaProvider = providerCreator.createSSRMediaProvider({
86
+ contentId: contentId,
87
+ contentProduct: contentProduct
88
+ });
89
+ if (mediaProvider) {
90
+ return {
91
+ media: mediaProvider
92
+ };
93
+ }
94
+ } catch (error) {
95
+ logException(error, {
96
+ location: 'editor-synced-block-provider/syncBlockProviderFactoryManager'
97
+ });
98
+ }
99
+ return null;
100
+ }
101
+ }, {
102
+ key: "deleteFactory",
103
+ value: function deleteFactory(resourceId) {
104
+ this.providerFactories.delete(resourceId);
105
+ }
106
+ }, {
107
+ key: "destroy",
108
+ value: function destroy() {
109
+ this.providerFactories.forEach(function (pf) {
110
+ return pf.destroy();
111
+ });
112
+ this.providerFactories.clear();
113
+ }
114
+ }, {
115
+ key: "retrieveDynamicProviders",
116
+ value: function retrieveDynamicProviders(resourceId, providerFactory, providerCreator) {
117
+ var dataProvider = this.deps.getDataProvider();
118
+ if (!dataProvider) {
119
+ throw new Error('Data provider not set');
120
+ }
121
+ var hasMediaProvider = providerFactory.hasProvider('mediaProvider');
122
+ var hasEmojiProvider = providerFactory.hasProvider('emojiProvider');
123
+ var hasCardProvider = providerFactory.hasProvider('cardProvider');
124
+ if (hasMediaProvider && hasEmojiProvider && hasCardProvider) {
125
+ return;
126
+ }
127
+ var syncBlock = this.deps.getFromCache(resourceId);
128
+ if (!(syncBlock !== null && syncBlock !== void 0 && syncBlock.data)) {
129
+ return;
130
+ }
131
+ if (!syncBlock.data.sourceAri || !syncBlock.data.product) {
132
+ var _this$deps$getFireAna3;
133
+ (_this$deps$getFireAna3 = this.deps.getFireAnalyticsEvent()) === null || _this$deps$getFireAna3 === void 0 || _this$deps$getFireAna3(fetchErrorPayload('Sync block source ari or product not found'));
134
+ return;
135
+ }
136
+ var parentInfo = dataProvider.retrieveSyncBlockParentInfo(syncBlock.data.sourceAri, syncBlock.data.product);
137
+ if (!parentInfo) {
138
+ throw new Error('Unable to retrieve sync block parent info');
139
+ }
140
+ var contentId = parentInfo.contentId,
141
+ contentProduct = parentInfo.contentProduct;
142
+ if (!hasMediaProvider && providerCreator.createMediaProvider && contentId && contentProduct) {
143
+ var mediaProvider = providerCreator.createMediaProvider({
144
+ contentProduct: contentProduct,
145
+ contentId: contentId
146
+ });
147
+ if (mediaProvider) {
148
+ providerFactory.setProvider('mediaProvider', mediaProvider);
149
+ }
150
+ }
151
+ if (!hasEmojiProvider && providerCreator.createEmojiProvider && contentId && contentProduct) {
152
+ var emojiProvider = providerCreator.createEmojiProvider({
153
+ contentProduct: contentProduct,
154
+ contentId: contentId
155
+ });
156
+ if (emojiProvider) {
157
+ providerFactory.setProvider('emojiProvider', emojiProvider);
158
+ }
159
+ }
160
+ if (!hasCardProvider && providerCreator.createSmartLinkProvider) {
161
+ var smartLinkProvider = providerCreator.createSmartLinkProvider();
162
+ if (smartLinkProvider) {
163
+ providerFactory.setProvider('cardProvider', smartLinkProvider);
164
+ }
165
+ }
166
+ }
167
+ }]);
168
+ }();
@@ -0,0 +1,191 @@
1
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
+ import _createClass from "@babel/runtime/helpers/createClass";
3
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
4
+ 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; } } }; }
5
+ 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; } }
6
+ 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; }
7
+ import { logException } from '@atlaskit/editor-common/monitoring';
8
+ import { fg } from '@atlaskit/platform-feature-flags';
9
+ import { fetchErrorPayload, fetchSuccessPayload } from '../utils/errorHandling';
10
+ import { resolveSyncBlockInstance } from '../utils/resolveSyncBlockInstance';
11
+ /**
12
+ * Manages the lifecycle of GraphQL WebSocket subscriptions for sync block
13
+ * real-time updates, and provides a listener API so React components can
14
+ * react when the set of subscribed resource IDs changes.
15
+ */
16
+ export var SyncBlockSubscriptionManager = /*#__PURE__*/function () {
17
+ function SyncBlockSubscriptionManager(deps) {
18
+ _classCallCheck(this, SyncBlockSubscriptionManager);
19
+ _defineProperty(this, "graphqlSubscriptions", new Map());
20
+ _defineProperty(this, "subscriptionChangeListeners", new Set());
21
+ _defineProperty(this, "useRealTimeSubscriptions", false);
22
+ this.deps = deps;
23
+ }
24
+ return _createClass(SyncBlockSubscriptionManager, [{
25
+ key: "setRealTimeSubscriptionsEnabled",
26
+ value: function setRealTimeSubscriptionsEnabled(enabled) {
27
+ if (this.useRealTimeSubscriptions === enabled) {
28
+ return;
29
+ }
30
+ this.useRealTimeSubscriptions = enabled;
31
+ if (enabled) {
32
+ this.setupSubscriptionsForAllBlocks();
33
+ } else {
34
+ this.cleanupAll();
35
+ }
36
+ }
37
+ }, {
38
+ key: "isRealTimeSubscriptionsEnabled",
39
+ value: function isRealTimeSubscriptionsEnabled() {
40
+ return this.useRealTimeSubscriptions;
41
+ }
42
+ }, {
43
+ key: "getSubscribedResourceIds",
44
+ value: function getSubscribedResourceIds() {
45
+ return Array.from(this.deps.getSubscriptions().keys());
46
+ }
47
+ }, {
48
+ key: "onSubscriptionsChanged",
49
+ value: function onSubscriptionsChanged(listener) {
50
+ var _this = this;
51
+ this.subscriptionChangeListeners.add(listener);
52
+ return function () {
53
+ _this.subscriptionChangeListeners.delete(listener);
54
+ };
55
+ }
56
+ }, {
57
+ key: "notifySubscriptionChangeListeners",
58
+ value: function notifySubscriptionChangeListeners() {
59
+ var _this2 = this;
60
+ this.subscriptionChangeListeners.forEach(function (listener) {
61
+ try {
62
+ listener();
63
+ } catch (error) {
64
+ var _this2$deps$getFireAn;
65
+ logException(error, {
66
+ location: 'editor-synced-block-provider/syncBlockSubscriptionManager/notifySubscriptionChangeListeners'
67
+ });
68
+ (_this2$deps$getFireAn = _this2.deps.getFireAnalyticsEvent()) === null || _this2$deps$getFireAn === void 0 || _this2$deps$getFireAn(fetchErrorPayload(error.message));
69
+ }
70
+ });
71
+ }
72
+ }, {
73
+ key: "handleSubscriptionUpdate",
74
+ value: function handleSubscriptionUpdate(syncBlockInstance) {
75
+ if (!syncBlockInstance.resourceId) {
76
+ return;
77
+ }
78
+ var existing = this.deps.getFromCache(syncBlockInstance.resourceId);
79
+ var resolved = existing ? resolveSyncBlockInstance(existing, syncBlockInstance) : syncBlockInstance;
80
+ this.deps.updateCache(resolved);
81
+ if (!syncBlockInstance.error) {
82
+ this.deps.fetchSyncBlockSourceInfo(resolved.resourceId);
83
+ }
84
+ }
85
+ }, {
86
+ key: "setupSubscription",
87
+ value: function setupSubscription(resourceId) {
88
+ var _this3 = this;
89
+ if (this.graphqlSubscriptions.has(resourceId)) {
90
+ return;
91
+ }
92
+ var dataProvider = this.deps.getDataProvider();
93
+ if (!(dataProvider !== null && dataProvider !== void 0 && dataProvider.subscribeToBlockUpdates)) {
94
+ return;
95
+ }
96
+ var unsubscribe = dataProvider.subscribeToBlockUpdates(resourceId, function (syncBlockInstance) {
97
+ _this3.handleGraphQLUpdate(syncBlockInstance);
98
+ }, function (error) {
99
+ var _this3$deps$getFireAn;
100
+ logException(error, {
101
+ location: 'editor-synced-block-provider/syncBlockSubscriptionManager/graphql-subscription'
102
+ });
103
+ (_this3$deps$getFireAn = _this3.deps.getFireAnalyticsEvent()) === null || _this3$deps$getFireAn === void 0 || _this3$deps$getFireAn(fetchErrorPayload(error.message));
104
+ });
105
+ if (unsubscribe) {
106
+ this.graphqlSubscriptions.set(resourceId, unsubscribe);
107
+ }
108
+ }
109
+ }, {
110
+ key: "cleanupSubscription",
111
+ value: function cleanupSubscription(resourceId) {
112
+ var unsubscribe = this.graphqlSubscriptions.get(resourceId);
113
+ if (unsubscribe) {
114
+ unsubscribe();
115
+ this.graphqlSubscriptions.delete(resourceId);
116
+ }
117
+ }
118
+ }, {
119
+ key: "setupSubscriptionsForAllBlocks",
120
+ value: function setupSubscriptionsForAllBlocks() {
121
+ var _iterator = _createForOfIteratorHelper(this.deps.getSubscriptions().keys()),
122
+ _step;
123
+ try {
124
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
125
+ var resourceId = _step.value;
126
+ this.setupSubscription(resourceId);
127
+ }
128
+ } catch (err) {
129
+ _iterator.e(err);
130
+ } finally {
131
+ _iterator.f();
132
+ }
133
+ }
134
+ }, {
135
+ key: "cleanupAll",
136
+ value: function cleanupAll() {
137
+ var _iterator2 = _createForOfIteratorHelper(this.graphqlSubscriptions.values()),
138
+ _step2;
139
+ try {
140
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
141
+ var unsubscribe = _step2.value;
142
+ unsubscribe();
143
+ }
144
+ } catch (err) {
145
+ _iterator2.e(err);
146
+ } finally {
147
+ _iterator2.f();
148
+ }
149
+ this.graphqlSubscriptions.clear();
150
+ }
151
+ }, {
152
+ key: "destroy",
153
+ value: function destroy() {
154
+ this.cleanupAll();
155
+ this.subscriptionChangeListeners.clear();
156
+ this.useRealTimeSubscriptions = false;
157
+ }
158
+ }, {
159
+ key: "shouldUseRealTime",
160
+ value: function shouldUseRealTime() {
161
+ return this.useRealTimeSubscriptions;
162
+ }
163
+ }, {
164
+ key: "handleGraphQLUpdate",
165
+ value: function handleGraphQLUpdate(syncBlockInstance) {
166
+ var _this4 = this;
167
+ if (!syncBlockInstance.resourceId) {
168
+ if (fg('platform_synced_block_patch_5')) {
169
+ return;
170
+ }
171
+ throw new Error('Sync block instance provided to graphql subscription update missing resource id');
172
+ }
173
+ var existing = this.deps.getFromCache(syncBlockInstance.resourceId);
174
+ var resolved = existing ? resolveSyncBlockInstance(existing, syncBlockInstance) : syncBlockInstance;
175
+ this.deps.updateCache(resolved);
176
+ if (!syncBlockInstance.error) {
177
+ var callbacks = this.deps.getSubscriptions().get(syncBlockInstance.resourceId);
178
+ var localIds = callbacks ? Object.keys(callbacks) : [];
179
+ localIds.forEach(function (localId) {
180
+ var _this4$deps$getFireAn, _syncBlockInstance$da;
181
+ (_this4$deps$getFireAn = _this4.deps.getFireAnalyticsEvent()) === null || _this4$deps$getFireAn === void 0 || _this4$deps$getFireAn(fetchSuccessPayload(syncBlockInstance.resourceId, localId, (_syncBlockInstance$da = syncBlockInstance.data) === null || _syncBlockInstance$da === void 0 ? void 0 : _syncBlockInstance$da.product));
182
+ });
183
+ this.deps.fetchSyncBlockSourceInfo(resolved.resourceId);
184
+ } else {
185
+ var _syncBlockInstance$er, _syncBlockInstance$er2, _syncBlockInstance$er3, _this$deps$getFireAna;
186
+ var errorMessage = fg('platform_synced_block_patch_3') ? ((_syncBlockInstance$er = syncBlockInstance.error) === null || _syncBlockInstance$er === void 0 ? void 0 : _syncBlockInstance$er.reason) || ((_syncBlockInstance$er2 = syncBlockInstance.error) === null || _syncBlockInstance$er2 === void 0 ? void 0 : _syncBlockInstance$er2.type) : (_syncBlockInstance$er3 = syncBlockInstance.error) === null || _syncBlockInstance$er3 === void 0 ? void 0 : _syncBlockInstance$er3.type;
187
+ (_this$deps$getFireAna = this.deps.getFireAnalyticsEvent()) === null || _this$deps$getFireAna === void 0 || _this$deps$getFireAna(fetchErrorPayload(errorMessage, syncBlockInstance.resourceId));
188
+ }
189
+ }
190
+ }]);
191
+ }();
@@ -27,6 +27,9 @@ export declare class ReferenceSyncBlockStoreManager {
27
27
  fetchExperience: Experience | undefined;
28
28
  private fetchSourceInfoExperience;
29
29
  private saveExperience;
30
+ private _subscriptionManager?;
31
+ private _providerFactoryManager?;
32
+ private _batchFetcher?;
30
33
  private pendingFetchRequests;
31
34
  private scheduledBatchFetch;
32
35
  constructor(dataProvider?: SyncBlockDataProviderInterface);
@@ -10,6 +10,7 @@ export declare class SourceSyncBlockStoreManager {
10
10
  private dataProvider?;
11
11
  private fireAnalyticsEvent?;
12
12
  private syncBlockCache;
13
+ private hasReceivedContentChange;
13
14
  private confirmationCallback?;
14
15
  private deletionRetryInfo?;
15
16
  private creationCompletionCallbacks;
@@ -31,6 +32,7 @@ export declare class SourceSyncBlockStoreManager {
31
32
  * @returns true if saving all nodes successfully, false if fail to save some/all nodes
32
33
  */
33
34
  flush(): Promise<boolean>;
35
+ hasUnsavedChanges(): boolean;
34
36
  isPendingCreation(resourceId: ResourceId): boolean;
35
37
  /**
36
38
  * Fires callback to insert node (if creation is successful) and clears pending creation data
@@ -0,0 +1,25 @@
1
+ import { type RendererSyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
2
+ import type { ResourceId, BlockInstanceId, SyncBlockNode } from '../common/types';
3
+ import type { SubscriptionCallback } from '../providers/types';
4
+ export interface SyncBlockBatchFetcherDeps {
5
+ fetchSyncBlocksData: (nodes: SyncBlockNode[]) => Promise<void>;
6
+ getFireAnalyticsEvent: () => ((payload: RendererSyncBlockEventPayload) => void) | undefined;
7
+ getSubscriptions: () => Map<ResourceId, {
8
+ [localId: BlockInstanceId]: SubscriptionCallback;
9
+ }>;
10
+ }
11
+ /**
12
+ * Handles debounced batch-fetching of sync block data via `raf-schd`.
13
+ * Accumulates resource IDs and flushes them in a single fetch per
14
+ * animation frame.
15
+ */
16
+ export declare class SyncBlockBatchFetcher {
17
+ private deps;
18
+ private pendingFetchRequests;
19
+ private scheduledBatchFetch;
20
+ constructor(deps: SyncBlockBatchFetcherDeps);
21
+ queueFetch(resourceId: string): void;
22
+ cancel(): void;
23
+ clearPending(): void;
24
+ destroy(): void;
25
+ }
@@ -14,10 +14,28 @@
14
14
  export declare class SyncBlockInMemorySessionCache {
15
15
  private store;
16
16
  private currentSize;
17
+ /**
18
+ * Maximum total size of all cached values, measured in **UTF-16 code
19
+ * units** (i.e. `String.prototype.length`), not bytes. For ASCII-only
20
+ * content the two are equivalent; for content with characters outside
21
+ * the BMP each surrogate pair counts as 2.
22
+ */
17
23
  private maxSize;
18
24
  constructor(maxSize?: number);
25
+ /**
26
+ * Retrieves a cached value by key.
27
+ *
28
+ * **Side-effect:** promotes the entry to the most-recently-used
29
+ * position by re-inserting it at the end of the underlying Map's
30
+ * iteration order.
31
+ */
19
32
  getItem(key: string): string | null;
20
33
  setItem(key: string, value: string): void;
21
34
  removeItem(key: string): void;
35
+ /**
36
+ * Removes all entries from the cache and resets the tracked size to zero.
37
+ * Useful for cleaning up the singleton on SPA navigation boundaries.
38
+ */
39
+ clear(): void;
22
40
  }
23
41
  export declare const syncBlockInMemorySessionCache: SyncBlockInMemorySessionCache;
@@ -0,0 +1,25 @@
1
+ import { type RendererSyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
2
+ import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
3
+ import type { ResourceId } from '../common/types';
4
+ import type { SyncBlockInstance, SyncBlockDataProviderInterface } from '../providers/types';
5
+ export interface SyncBlockProviderFactoryManagerDeps {
6
+ getDataProvider: () => SyncBlockDataProviderInterface | undefined;
7
+ getFireAnalyticsEvent: () => ((payload: RendererSyncBlockEventPayload) => void) | undefined;
8
+ getFromCache: (resourceId: ResourceId) => SyncBlockInstance | undefined;
9
+ }
10
+ /**
11
+ * Manages creation and caching of ProviderFactory instances used to
12
+ * render synced block content (media, emoji, smart links, etc.).
13
+ */
14
+ export declare class SyncBlockProviderFactoryManager {
15
+ private deps;
16
+ private providerFactories;
17
+ constructor(deps: SyncBlockProviderFactoryManagerDeps);
18
+ getProviderFactory(resourceId: ResourceId): ProviderFactory | undefined;
19
+ getSSRProviders(resourceId: ResourceId): {
20
+ media: import("@atlaskit/editor-common/provider-factory").MediaProvider;
21
+ } | null;
22
+ deleteFactory(resourceId: ResourceId): void;
23
+ destroy(): void;
24
+ private retrieveDynamicProviders;
25
+ }
@@ -0,0 +1,38 @@
1
+ import { type RendererSyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
2
+ import type { ResourceId, BlockInstanceId } from '../common/types';
3
+ import type { SyncBlockInstance, SubscriptionCallback, SyncBlockDataProviderInterface, SyncBlockSourceInfo } from '../providers/types';
4
+ export interface SyncBlockSubscriptionManagerDeps {
5
+ fetchSyncBlockSourceInfo: (resourceId: ResourceId) => Promise<SyncBlockSourceInfo | undefined>;
6
+ getDataProvider: () => SyncBlockDataProviderInterface | undefined;
7
+ getFireAnalyticsEvent: () => ((payload: RendererSyncBlockEventPayload) => void) | undefined;
8
+ getFromCache: (resourceId: ResourceId) => SyncBlockInstance | undefined;
9
+ getSubscriptions: () => Map<ResourceId, {
10
+ [localId: BlockInstanceId]: SubscriptionCallback;
11
+ }>;
12
+ updateCache: (syncBlockInstance: SyncBlockInstance) => void;
13
+ }
14
+ /**
15
+ * Manages the lifecycle of GraphQL WebSocket subscriptions for sync block
16
+ * real-time updates, and provides a listener API so React components can
17
+ * react when the set of subscribed resource IDs changes.
18
+ */
19
+ export declare class SyncBlockSubscriptionManager {
20
+ private deps;
21
+ private graphqlSubscriptions;
22
+ private subscriptionChangeListeners;
23
+ private useRealTimeSubscriptions;
24
+ constructor(deps: SyncBlockSubscriptionManagerDeps);
25
+ setRealTimeSubscriptionsEnabled(enabled: boolean): void;
26
+ isRealTimeSubscriptionsEnabled(): boolean;
27
+ getSubscribedResourceIds(): ResourceId[];
28
+ onSubscriptionsChanged(listener: () => void): () => void;
29
+ notifySubscriptionChangeListeners(): void;
30
+ handleSubscriptionUpdate(syncBlockInstance: SyncBlockInstance): void;
31
+ setupSubscription(resourceId: ResourceId): void;
32
+ cleanupSubscription(resourceId: ResourceId): void;
33
+ setupSubscriptionsForAllBlocks(): void;
34
+ cleanupAll(): void;
35
+ destroy(): void;
36
+ shouldUseRealTime(): boolean;
37
+ private handleGraphQLUpdate;
38
+ }
@@ -27,6 +27,9 @@ export declare class ReferenceSyncBlockStoreManager {
27
27
  fetchExperience: Experience | undefined;
28
28
  private fetchSourceInfoExperience;
29
29
  private saveExperience;
30
+ private _subscriptionManager?;
31
+ private _providerFactoryManager?;
32
+ private _batchFetcher?;
30
33
  private pendingFetchRequests;
31
34
  private scheduledBatchFetch;
32
35
  constructor(dataProvider?: SyncBlockDataProviderInterface);
@@ -10,6 +10,7 @@ export declare class SourceSyncBlockStoreManager {
10
10
  private dataProvider?;
11
11
  private fireAnalyticsEvent?;
12
12
  private syncBlockCache;
13
+ private hasReceivedContentChange;
13
14
  private confirmationCallback?;
14
15
  private deletionRetryInfo?;
15
16
  private creationCompletionCallbacks;
@@ -31,6 +32,7 @@ export declare class SourceSyncBlockStoreManager {
31
32
  * @returns true if saving all nodes successfully, false if fail to save some/all nodes
32
33
  */
33
34
  flush(): Promise<boolean>;
35
+ hasUnsavedChanges(): boolean;
34
36
  isPendingCreation(resourceId: ResourceId): boolean;
35
37
  /**
36
38
  * Fires callback to insert node (if creation is successful) and clears pending creation data
@@ -0,0 +1,25 @@
1
+ import { type RendererSyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
2
+ import type { ResourceId, BlockInstanceId, SyncBlockNode } from '../common/types';
3
+ import type { SubscriptionCallback } from '../providers/types';
4
+ export interface SyncBlockBatchFetcherDeps {
5
+ fetchSyncBlocksData: (nodes: SyncBlockNode[]) => Promise<void>;
6
+ getFireAnalyticsEvent: () => ((payload: RendererSyncBlockEventPayload) => void) | undefined;
7
+ getSubscriptions: () => Map<ResourceId, {
8
+ [localId: BlockInstanceId]: SubscriptionCallback;
9
+ }>;
10
+ }
11
+ /**
12
+ * Handles debounced batch-fetching of sync block data via `raf-schd`.
13
+ * Accumulates resource IDs and flushes them in a single fetch per
14
+ * animation frame.
15
+ */
16
+ export declare class SyncBlockBatchFetcher {
17
+ private deps;
18
+ private pendingFetchRequests;
19
+ private scheduledBatchFetch;
20
+ constructor(deps: SyncBlockBatchFetcherDeps);
21
+ queueFetch(resourceId: string): void;
22
+ cancel(): void;
23
+ clearPending(): void;
24
+ destroy(): void;
25
+ }
@@ -14,10 +14,28 @@
14
14
  export declare class SyncBlockInMemorySessionCache {
15
15
  private store;
16
16
  private currentSize;
17
+ /**
18
+ * Maximum total size of all cached values, measured in **UTF-16 code
19
+ * units** (i.e. `String.prototype.length`), not bytes. For ASCII-only
20
+ * content the two are equivalent; for content with characters outside
21
+ * the BMP each surrogate pair counts as 2.
22
+ */
17
23
  private maxSize;
18
24
  constructor(maxSize?: number);
25
+ /**
26
+ * Retrieves a cached value by key.
27
+ *
28
+ * **Side-effect:** promotes the entry to the most-recently-used
29
+ * position by re-inserting it at the end of the underlying Map's
30
+ * iteration order.
31
+ */
19
32
  getItem(key: string): string | null;
20
33
  setItem(key: string, value: string): void;
21
34
  removeItem(key: string): void;
35
+ /**
36
+ * Removes all entries from the cache and resets the tracked size to zero.
37
+ * Useful for cleaning up the singleton on SPA navigation boundaries.
38
+ */
39
+ clear(): void;
22
40
  }
23
41
  export declare const syncBlockInMemorySessionCache: SyncBlockInMemorySessionCache;
@@ -0,0 +1,25 @@
1
+ import { type RendererSyncBlockEventPayload } from '@atlaskit/editor-common/analytics';
2
+ import { ProviderFactory } from '@atlaskit/editor-common/provider-factory';
3
+ import type { ResourceId } from '../common/types';
4
+ import type { SyncBlockInstance, SyncBlockDataProviderInterface } from '../providers/types';
5
+ export interface SyncBlockProviderFactoryManagerDeps {
6
+ getDataProvider: () => SyncBlockDataProviderInterface | undefined;
7
+ getFireAnalyticsEvent: () => ((payload: RendererSyncBlockEventPayload) => void) | undefined;
8
+ getFromCache: (resourceId: ResourceId) => SyncBlockInstance | undefined;
9
+ }
10
+ /**
11
+ * Manages creation and caching of ProviderFactory instances used to
12
+ * render synced block content (media, emoji, smart links, etc.).
13
+ */
14
+ export declare class SyncBlockProviderFactoryManager {
15
+ private deps;
16
+ private providerFactories;
17
+ constructor(deps: SyncBlockProviderFactoryManagerDeps);
18
+ getProviderFactory(resourceId: ResourceId): ProviderFactory | undefined;
19
+ getSSRProviders(resourceId: ResourceId): {
20
+ media: import("@atlaskit/editor-common/provider-factory").MediaProvider;
21
+ } | null;
22
+ deleteFactory(resourceId: ResourceId): void;
23
+ destroy(): void;
24
+ private retrieveDynamicProviders;
25
+ }