簡単WebSocket Promise wrapper
さっと試したい時に使う
2021-09-27
2021-09-20
22:03:37 そもそも、WebSocketで発生するerrorはthrowされるのだろうか?それともすべて error
eventとしてcallbackが呼び出されるのだろうか?
どっちだかわからん
21:32:59 Githubに移しておこうかな
21:32:35 接続開始時以外errorをcatchできていないのはよくないな
直そう
21:36:18 不必要にPromiseがネストされているのもよくない
外側のpromiseはasync-awaitで書き換えられるはず
無理だった
open
eventのcallbackでresolveしないといけない
vim+Denoで書いた
mod.tstype Return = {
close: () => Promise<Event | undefined>;
send: (data: string | ArrayBufferLike | Blob | ArrayBufferView) => void;
receive(): AsyncGenerator<MessageEvent>;
};
export function createWS(url: string, protcols?: string | string[]) {
return new Promise<Return>((resolve, reject) => {
const socket = new WebSocket(url, protcols);
const once = (
type: keyof WebSocketEventMap,
callback: (event?: Event | MessageEvent | CloseEvent) => void,
) => {
const wrapper = (e: Event | MessageEvent | CloseEvent) => {
callback(e);
socket.removeEventListener(type, wrapper);
};
socket.addEventListener(type, wrapper);
};
once("error", reject);
once("open", () =>
resolve({
close: () =>
new Promise((res) => {
socket.close();
once("close", (e) => res(e));
}),
send: (data) => {
socket.send(data);
},
receive: async function* () {
while (true) {
const response = await new Promise((res) =>
once("message", (e) => res(e))
);
yield response as MessageEvent;
}
},
}));
});
}
2021-09-20 21:45:39 直したやつ
browser用
mod.jsfunction v(o,i){return new Promise((a,c)=>{let t=new WebSocket(o,i),r=(e,s)=>{let n=p=>{s(p),t.removeEventListener(e,n)};t.addEventListener(e,n)};r("error",c),r("open",()=>a({close:()=>new Promise(e=>{t.close(),r("close",s=>e(s))}),send:e=>{t.send(e)},receive:async function*(){for(;;)yield await new Promise(s=>r("message",n=>s(n)))}}))})}export{v as createWS};