event loopテスト (takker99/emoji-completionで試すevent loop設計)
event loopだけテストしてみる
2022-03-22 17:23:27 一通り確認できた
code:sh
code:test.ts
/// <reference no-default-lib="true"/>
/// <reference lib="esnext"/>
/// <reference lib="dom" />
import {
useStatusBar,
caret,
getCharDOM,
getText,
getInternalLink,
textInput,
cursor,
} from "../scrapbox-userscript-std/dom.ts";
import { promisify, sleep } from "../async-lib/mod.ts";
const { render, dispose } = useStatusBar();
maxQueued: 0,
});
maxQueued: 1,
});
maxQueued: 1,
});
textInput()!.addEventListener("input", (e) => {
if (e.isComposing) return;
handleStart();
});
const forceStartCompletion = () => handleStart();
const observer = new MutationObserver(() => handleCompletioning({ type: "cursormove" }));
const handleInput = () =>
handleCompletioning({ type: "textinput" });
const canStartCompletion = (): Promise<string | void> => {
const { line, char } = caret().position;
const charDOM = getCharDOM(line, char);
if (!charDOM) return Promise.resolve();
const link = getInternalLink(charDOM);
if (!link) return Promise.resolve();
return Promise.resolve(getText(link) ?? "");
};
let completioning = false;
(async () => {
while (true) {
render(
{ type: "text", text: "ready for search" },
);
await listenStart();
try {
const initialParams = await canStartCompletion();
if (!initialParams) continue;
orderSearch(initialParams);
completioning = true;
render(
{ type: "text", text: "completion mode" },
);
textInput()!.addEventListener(
"input",
handleInput,
);
observer.observe(cursor()!, { attributes: true });
try {
while (true) {
const data = await listenCompletioning();
if (
data.type === "cursormove" ||
data.type === "textinput"
) {
const param = await canStartCompletion();
if (!param) break;
orderSearch(param);
continue;
}
if (data.type === "confirm") {
await data.callback();
}
break;
}
} catch (e) {
throw e;
} finally {
textInput()!.removeEventListener(
"input",
handleInput,
);
observer.disconnect();
}
} catch (e) {
console.error(e);
} finally {
completioning = false;
}
}
})();
(async () => {
while (true) {
const params = await waitForOrder();
if (!completioning) continue;
const { render, dispose } = useStatusBar();
render(
{ type: "spinner" },
{ type: "text", text: searching for "${params}" },
);
await sleep(2000);
dispose();
}
})();