Skip to content

Commit 9d3f506

Browse files
committed
fix collaboration extension issue
1 parent 294b47f commit 9d3f506

2 files changed

Lines changed: 39 additions & 3 deletions

File tree

src/addons/addons/collaboration/helpers/helper.js

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,39 @@ export function hydrateTargetFromYjs(targetId) {
659659
if (ySounds) applyYjsSoundsToTarget(target, ySounds);
660660
}
661661

662+
export function reconcileExtensionsToYjs() {
663+
const vm = constants.mutableRefs.vm;
664+
const sharedExtensions = constants.mutableRefs.sharedExtensions;
665+
if (!vm || !sharedExtensions || !constants.mutableRefs.ydoc) return;
666+
667+
const extensionManager = vm.extensionManager;
668+
if (!extensionManager || !extensionManager._loadedExtensions) return;
669+
const extensionURLs = (typeof extensionManager.getExtensionURLs === 'function') ?
670+
extensionManager.getExtensionURLs() : {};
671+
672+
const knownNames = new Set();
673+
sharedExtensions.toArray().forEach(ext => {
674+
const extObj = (typeof ext.toJSON === 'function') ? ext.toJSON() : ext;
675+
if (typeof extObj === 'string') {
676+
knownNames.add(extObj);
677+
} else if (extObj && extObj.name) {
678+
knownNames.add(extObj.name);
679+
}
680+
});
681+
682+
const missing = [];
683+
for (const id of extensionManager._loadedExtensions.keys()) {
684+
if (!knownNames.has(id)) {
685+
missing.push({ URL: extensionURLs[id] || id, name: id });
686+
}
687+
}
688+
if (missing.length === 0) return;
689+
690+
constants.mutableRefs.ydoc.transact(() => {
691+
constants.mutableRefs.sharedExtensions.push(missing);
692+
}, constants.LOCAL_EVENT_SYNC_ORIGIN);
693+
}
694+
662695
export function performInitialSync() {
663696
const vm = constants.mutableRefs.vm;
664697
const Blockly = constants.mutableRefs.BlocklyInstance;

src/addons/addons/collaboration/userscript.js

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,8 @@ function attachYjsProvider() {
584584
const ySpriteArray = targets.map(target => helper.serializeSpriteForYjs(target));
585585
sharedSprites.insert(0, ySpriteArray);
586586
}, constants.LOCAL_EVENT_SYNC_ORIGIN);
587+
588+
helper.reconcileExtensionsToYjs();
587589
}, 100);
588590
};
589591

@@ -637,8 +639,6 @@ function attachYjsProvider() {
637639
};
638640

639641
const handleExtensionAdded = (extension) => {
640-
if (constants.mutableRefs.BlocklyInstance?.Events.getGroup() === 'yjs-remote-sync') return;
641-
642642
constants.mutableRefs.ydoc.transact(() => {
643643
const currentExts = constants.mutableRefs.sharedExtensions.toArray();
644644
const alreadyExists = currentExts.some(ext => {
@@ -650,6 +650,8 @@ function attachYjsProvider() {
650650
constants.mutableRefs.sharedExtensions.push([extension]);
651651
}
652652
}, constants.LOCAL_EVENT_SYNC_ORIGIN);
653+
654+
setTimeout(() => helper.reconcileExtensionsToYjs(), 0);
653655
};
654656

655657
constants.mutableRefs.vm.on('TARGET_BLOCKS_CHANGED', handleTargetBlocksChanged);
@@ -676,6 +678,7 @@ function attachYjsProvider() {
676678
collabUI.hideSyncingPopup();
677679
timeout.resetInactivityTimers();
678680
constants.mutableRefs.isInitialRoomSync = false;
681+
helper.reconcileExtensionsToYjs();
679682
setTimeout(() => {
680683
constants.mutableRefs.vm?.emitTargetsUpdate(false);
681684
}, 500);
@@ -901,7 +904,7 @@ function attachYjsProvider() {
901904
constants.mutableRefs.vm.removeListener('TARGETS_INDEX_CHANGED', handleTargetsIndexChanged);
902905
constants.mutableRefs.vm.removeListener('ADD_SPRITE', handleAddSprite);
903906
constants.mutableRefs.vm.removeListener('DELETE_SPRITE', handleDeleteSprite);
904-
constants.mutableRefs.vm.removeListener('EXTENSION_ADDED', handleExtensionAdded);
907+
constants.mutableRefs.vm.removeListener('COLLABORATION_EXTENSION_ADDED', handleExtensionAdded);
905908

906909
collabUI.clearLocalChatMessage();
907910
timeout.clearInactivityTimers();

0 commit comments

Comments
 (0)