SugarWs
export class SugarWs extends WebSocket {
// implementation
}
So you can see that this websocket is not complicated extension of original browser's (so and Deno's) websocket.
This package should work in
browser
(so you can import it from npm'ssugar_ws
) as same as inDeno
(so you can import it both from'npm:sugar_ws'
orhttps://deno.land/x/sugar_ws/mod.ts
)
Important improvements:
.once()
this method has the same API as the original.addEventListener()
with only difference that it will auto-remove listener after first call.wait_for(state: 'open' | 'close')
add more simple control over final states of websocket. So you canawait
for open or close and then do your stuff- important to note that this method only waiting for
open
orclose
states but not acting them .wait_for('close').and_close()
syntax sugar for:await sugar_ws.wait_for("close").and_close(); // the same as sugar_ws.close(); await sugar_ws.wait_for("close");
- be careful:
// this is not the same (await sugar_ws.wait_for("close")).close(); // <= should not work // also not work await sugar_ws.wait_for("close"); sugar_ws.close(); // last examples should not work because you started to wait // closing before "close" happen))) // and you blocked next line `.close()` // HOWEVER may be your simply waiting that `.close()` is happen somewhere // so in this situation it's ok to wait for this await sugar_ws.wait_for("close");
- be careful:
.wait_for('open').and_add_listeners_for({ open: () => console.log('hi!'); })
syntax sugar for:await sugar_ws .wait_for("open") .and_add_listeners_for({ first_message: () => console.log("hi!")), }); // the same as sugar_ws.once("message", () => console.log("hi!")); await sugar_ws.wait_for("open"); // in case your websocket is already open - the promise with it will resolved at once but of course // your listeners are not called
- in any case be careful with usage of these methods especially in repeated scenarios... more tests are needed for this feature
- important to note that this method only waiting for
Also improvements, but not so important:
.send_if_open()
will send only if websocket'sreadyState
isOPEN
.on()
alias for original's.addEventListener()
...so this is sugar only
Example of usage:
import { SugarWs } from "https://deno.land/x/sugar_ws/mod.ts";
const ws = await new SugarWs(`ws://localhost:3333`).wait_for("open");
ws.send_if_open("ping");
ws.once(
"message",
({ data }) => console.log("may be FIRST but exactly LAST message:", data),
);
await new Promise<void>((resolve) => setTimeout(resolve, 1000));
await ws.wait_for("close").and_close();
ws.send_if_open("hi!"); // will not send because websocket is already closed
Updates:
2023-11-14:
.wait_for('open')
has sugar return valuePromise<SugarWs> & { on_open(your_cb() => void) => Promise<SugarWs> }
- description:
So you can
await
open
event of websocket and addonopen
callbacks at once. Under the hood your listeners will be added firstly and only thenopen
command will send (if not already sended)const sugar = await new SugarWs("ws://localhost:5432") .wait_for("open") .on_open(() => console.log("hi there!"));
- description:
2023-11-13:
.once()
return() => void
function that will remove listener if it is not already called- description:
to remove simple listeners you should do nothing special - call
.removeEventListener('some-event', your_cb)
but in case with.once()
- you can not getyour_cb
in terms that sugar_ws will listened not exactly for it but for it's replaced version... so if you should remove it you probably can call this new return value, it do it for you
- description:
2023-11-06: add static method
sugarize
to upgrade already existed instance ofWebSocket
toSugarWs
const constructor_sugar = new SugarWs("ws://localhost:3333"); // the same as const from_static_sugar = SugarWs.sugarize( new WebSocket("ws://localhost:3333"), );
2023-11-07:
.send_if_open()
returnboolean
to indicate is message was sen
P.S.
Not enough tested the behavior for situations when
.wait_for(...)
promises started without resolving. For example start wait on open but websocket will never do it. In future the additional under-the-hood protections, may be options should be created to handle or auto-handle such situations.
TODO:
- write more tests
- remove test-code from publish or from dist etc...
- more strictly analyze Deno|Node differences and update publish-artifacts according to them