mirror of
https://github.com/tauri-apps/plugins-workspace.git
synced 2026-06-08 14:03:53 +02:00
initial commit
This commit is contained in:
Executable
+71
@@ -0,0 +1,71 @@
|
||||
import { invoke, transformCallback } from '@tauri-apps/api/tauri'
|
||||
|
||||
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 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?: any): Promise<WebSocket> {
|
||||
const listeners: Array<(arg: Message) => void> = []
|
||||
const handler = (message: Message) => {
|
||||
listeners.forEach(l => l(message))
|
||||
}
|
||||
|
||||
return invoke<number>('plugin:websocket|connect', {
|
||||
url,
|
||||
callbackFunction: transformCallback(handler),
|
||||
options
|
||||
}).then(id => new WebSocket(id, listeners))
|
||||
}
|
||||
|
||||
addListener(cb: (arg: Message) => void) {
|
||||
this.listeners.push(cb)
|
||||
}
|
||||
|
||||
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 invoke('plugin:websocket|send', {
|
||||
id: this.id,
|
||||
message: m
|
||||
})
|
||||
}
|
||||
|
||||
disconnect(): Promise<void> {
|
||||
return this.send({
|
||||
type: 'Close', data: {
|
||||
code: 1000,
|
||||
reason: 'Disconnected by client'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
Executable
+20
@@ -0,0 +1,20 @@
|
||||
import resolve from '@rollup/plugin-node-resolve'
|
||||
import { terser } from 'rollup-plugin-terser'
|
||||
import typescript from '@rollup/plugin-typescript'
|
||||
|
||||
export default {
|
||||
input: './webview-src/index.ts',
|
||||
output: {
|
||||
dir: './webview-dist',
|
||||
entryFileNames: '[name].js',
|
||||
format: 'es',
|
||||
exports: 'auto'
|
||||
},
|
||||
plugins: [
|
||||
resolve(),
|
||||
terser(),
|
||||
typescript({
|
||||
tsconfig: './webview-src/tsconfig.json'
|
||||
})
|
||||
]
|
||||
}
|
||||
Executable
+16
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"target": "ES5",
|
||||
"strict": true,
|
||||
"allowJs": true,
|
||||
"esModuleInterop": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"types": ["@types"]
|
||||
},
|
||||
"declaration": true,
|
||||
"declarationDir": "../webview-dist",
|
||||
"rootDir": "./"
|
||||
},
|
||||
"include": ["./"]
|
||||
}
|
||||
Reference in New Issue
Block a user