init = async (event) => {
		if (bThrottled) {
			return;
		}
		bThrottled = true;

		setTimeout(() => {
			bThrottled = false;
		}, 300);

		const aControlTree = [];
		const docs = {};
		const oLabelMap = new Map();

		let oTargetElement;
		if (event) {
			oTargetElement = event.type === "focusin" ? event.target : event.relatedTarget;
		}
		oTargetElement ??= document.activeElement;

		const oTargetControl = Element.closestTo(oTargetElement);

		// get generic key interactions from sap.ui.core
		const oCoreXML = await loadInteractionXMLFor(null, "sap.ui.core");
		if (oCoreXML) {
			const oResourceBundle = Library.getResourceBundleFor("sap.ui.core");
			const sLabel = oResourceBundle.getText("Generic.Keyboard.Interaction.Text");
			docs["sap.ui.core.Control"] = {
				"interactions": getInteractions("sap.ui.core.Control", oCoreXML)
			};
			oLabelMap.set(sLabel, {
				"index": -1,
				"class": "sap.ui.core.Control",
				"label": sLabel,
				"interactions": [{
					"$ref": `docs/sap.ui.core.Control/interactions`
				}]
			});
		}

		let oCurrent = oTargetControl;
		while (oCurrent) {
			aControlTree.push(oCurrent);
			oCurrent = oCurrent.getParent();
		}

		for (let i = 0; i < aControlTree.length; i++) {
			const oControl = aControlTree[i];
			const sControlName = oControl.getMetadata().getName();

			// get command infos
			const aInteractions = getCommandInfosFor(oControl);

			// get interactions from interaction documentation
			const oInteractionXML = await loadInteractionXMLFor(oControl);
			const aDocs = oInteractionXML ? getInteractions(sControlName, oInteractionXML) : [];

			if (!aInteractions.length && !aDocs.length) {
				// no commands and no interaction documentation
				continue;
			}

			const sClassName = oControl.getMetadata().getName();
			if (aDocs.length > 0) {
				docs[sClassName] = {
					"interactions": aDocs
				};
				aInteractions.push({
					"$ref": `docs/${sClassName}/interactions`
				});
			}

			const sLabel = getLabelFor(oControl, oInteractionXML);
			if (!oLabelMap.has(sLabel)) {
				oLabelMap.set(sLabel, { interactions: [], label: sLabel });
			}

			const oMapEntry = oLabelMap.get(sLabel);
			oMapEntry.index = i;
			oMapEntry.id = oControl.getId();
			oMapEntry.class = sClassName;
			oMapEntry.interactions.unshift(...aInteractions.reverse());
		}

		// Update protocol with gathered elements and documentation
		oProtocol.elements = Array.from(oLabelMap.values())
			.sort((a, b) => {
				return a.index - b.index;
			})
			.map((oEntry) => {
				delete oEntry.index;
				return oEntry;
			});

		oProtocol.docs = docs;

		// Send protocol
		oCurrentPort?.postMessage(JSON.parse(JSON.stringify({
			service: POST_MESSAGE_ENDPOINT_UPDATE,
			type: "request",
			payload: { ...oProtocol }
		})));
	}
Initializes the keyboard interaction information gathering.
@param  {Event} event The 'focusin' or 'focusout' event triggering the initialization.