mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-05-29 13:31:27 +02:00
aba07c27b8
Co-authored-by: Fabian-Lars <fabianlars@fabianlars.de> Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: FabianLars <fabianlars@fabianlars.de> Co-authored-by: FabianLars <FabianLars@users.noreply.github.com> Co-authored-by: Alexandre Dang <124160233+vdang-crabnebula@users.noreply.github.com> Co-authored-by: Ludea <ludovicw35@hotmail.com> Co-authored-by: Amr Bashir <amr.bashir2015@gmail.com> Co-authored-by: Duke Jones <104690+dukejones@users.noreply.github.com> Co-authored-by: NaokiM03 <37442712+NaokiM03@users.noreply.github.com> Co-authored-by: Thibault <thibault_poisson@orange.fr> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: David Blythe <49919035+writeDavid@users.noreply.github.com> Co-authored-by: Lucas Nogueira <lucas@tauri.studio> fix(stronghold): change wrong argument name for `remove` (#422) fix(window-state): correctly set decoration state if no saved state exists, fixes #421 (#424) fix(stronghold): return null if there is no record (#129) fix(window-state): propagate promise (#435) closes #432 fix(window-state): manual default implentation (#425) fix(window-state): manual default implentation, closes #421 fix(deps): update rust crate iota-crypto to 0.21 (#438) fix readme example (#447) fix: handle recursive directory correctly (#455) fix(deps): update rust crate sqlx to 0.7. plugin-sql msrv is now 1.65 (#464) fix(persisted-scope): separately save asset protocol patterns (#459) fix(deps): update rust crate iota-crypto to 0.22 (#475) fix(deps): update tauri monorepo to v1.4.0 (#482) resolve to v15.1.0 (#489) fix(deps): update rust crate iota-crypto to 0.23 (#495)
88 lines
2.2 KiB
TypeScript
88 lines
2.2 KiB
TypeScript
// Copyright 2019-2023 Tauri Programme within The Commons Conservancy
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
declare global {
|
|
interface Window {
|
|
__TAURI_INVOKE__: <T>(cmd: string, args?: unknown) => Promise<T>;
|
|
__TAURI__: {
|
|
transformCallback: <T>(cb: (payload: T) => void) => number;
|
|
};
|
|
}
|
|
}
|
|
|
|
export interface MessageKind<T, D> {
|
|
type: T;
|
|
data: D;
|
|
}
|
|
|
|
export interface CloseFrame {
|
|
code: number;
|
|
reason: string;
|
|
}
|
|
|
|
export type Message =
|
|
| MessageKind<"Text", string>
|
|
| MessageKind<"Binary", number[]>
|
|
| MessageKind<"Ping", number[]>
|
|
| MessageKind<"Pong", number[]>
|
|
| MessageKind<"Close", CloseFrame | null>;
|
|
|
|
export default class WebSocket {
|
|
id: number;
|
|
private readonly listeners: Array<(arg: Message) => void>;
|
|
|
|
constructor(id: number, listeners: Array<(arg: Message) => void>) {
|
|
this.id = id;
|
|
this.listeners = listeners;
|
|
}
|
|
|
|
static async connect(url: string, options?: unknown): Promise<WebSocket> {
|
|
const listeners: Array<(arg: Message) => void> = [];
|
|
const handler = (message: Message): void => {
|
|
listeners.forEach((l) => l(message));
|
|
};
|
|
|
|
return await window
|
|
.__TAURI_INVOKE__<number>("plugin:websocket|connect", {
|
|
url,
|
|
callbackFunction: window.__TAURI__.transformCallback(handler),
|
|
options,
|
|
})
|
|
.then((id) => new WebSocket(id, listeners));
|
|
}
|
|
|
|
addListener(cb: (arg: Message) => void): void {
|
|
this.listeners.push(cb);
|
|
}
|
|
|
|
async send(message: Message | string | number[]): Promise<void> {
|
|
let m: Message;
|
|
if (typeof message === "string") {
|
|
m = { type: "Text", data: message };
|
|
} else if (typeof message === "object" && "type" in message) {
|
|
m = message;
|
|
} else if (Array.isArray(message)) {
|
|
m = { type: "Binary", data: message };
|
|
} else {
|
|
throw new Error(
|
|
"invalid `message` type, expected a `{ type: string, data: any }` object, a string or a numeric array",
|
|
);
|
|
}
|
|
return await window.__TAURI_INVOKE__("plugin:websocket|send", {
|
|
id: this.id,
|
|
message: m,
|
|
});
|
|
}
|
|
|
|
async disconnect(): Promise<void> {
|
|
return await this.send({
|
|
type: "Close",
|
|
data: {
|
|
code: 1000,
|
|
reason: "Disconnected by client",
|
|
},
|
|
});
|
|
}
|
|
}
|