Skip to content

Commit

Permalink
feat: add kernel mode with isolation by default (microsoft#6520)
Browse files Browse the repository at this point in the history
* feat: add kernel mode with isolation by default

* Change files

* chore: fix change file

* chore: slight kernel mode valid value change

Co-authored-by: EisenbergEffect <roeisenb@microsoft.com>
  • Loading branch information
EisenbergEffect and EisenbergEffect authored Nov 17, 2022
1 parent 5c7ff39 commit e576aa7
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
{
"type": "prerelease",
"comment": "feat: add kernel mode with isolation by default",
"packageName": "@microsoft/fast-element",
"email": "roeisenb@microsoft.com",
"dependentChangeType": "prerelease"
}
60 changes: 54 additions & 6 deletions packages/web-components/fast-element/src/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,17 +90,65 @@ export interface FASTGlobal {
addMessages(messages: Record<number, string>): void;
}

let kernelMode;
const kernelAttr = "fast-kernel";

try {
if (document.currentScript) {
kernelMode = document.currentScript.getAttribute(kernelAttr);
} else {
const scripts = document.getElementsByTagName("script");
const currentScript = scripts[scripts.length - 1];
kernelMode = currentScript.getAttribute(kernelAttr);
}
} catch (e) {
kernelMode = "isolate";
}

/**
* Core services shared across FAST instances.
* Core services that can be shared across FAST instances.
* @internal
*/
export const enum KernelServiceId {
updateQueue = 1,
observable = 2,
contextEvent = 3,
elementRegistry = 4,
type KernelServiceId = {
readonly updateQueue: string | number;
readonly observable: string | number;
readonly contextEvent: string | number;
readonly elementRegistry: string | number;
};

let KernelServiceId: KernelServiceId;

switch (kernelMode) {
case "share": // share the kernel across major versions
KernelServiceId = Object.freeze({
updateQueue: 1,
observable: 2,
contextEvent: 3,
elementRegistry: 4,
});
break;
case "share-v2": // only share the kernel with other v2 instances
KernelServiceId = Object.freeze({
updateQueue: 1.2,
observable: 2.2,
contextEvent: 3.2,
elementRegistry: 4.2,
});
break;
default:
// fully isolate the kernel from all other FAST instances
const postfix = `-${Math.random().toString(36).substring(2, 8)}`;
KernelServiceId = Object.freeze({
updateQueue: `1.2${postfix}`,
observable: `2.2${postfix}`,
contextEvent: `3.2${postfix}`,
elementRegistry: `4.2${postfix}`,
});
break;
}

export { KernelServiceId };

/**
* A node that can be targeted by styles.
* @public
Expand Down

0 comments on commit e576aa7

Please sign in to comment.