remoteclient

This commit is contained in:
CoolElectronics 2024-03-02 15:28:10 -05:00
parent 95c4c25cbc
commit a5b462f696
No known key found for this signature in database
GPG key ID: F63593D168636C50
9 changed files with 436 additions and 17 deletions

View file

@ -0,0 +1,13 @@
/// <reference lib="webworker" />
import { BareHeaders, BareTransport, TransferrableResponse } from './BareTypes';
export declare function registerRemoteListener(channel: ServiceWorker): void;
export default class RemoteTransport implements BareTransport {
canstart: boolean;
ready: boolean;
promises: Map<string, (data: any) => void>;
constructor();
init(): Promise<void>;
meta(): Promise<void>;
request(remote: URL, method: string, body: BodyInit | null, headers: BareHeaders, signal: AbortSignal | undefined): Promise<TransferrableResponse>;
connect(url: URL, origin: string, protocols: string[], requestHeaders: BareHeaders, onopen: (protocol: string) => void, onmessage: (data: Blob | ArrayBuffer | string) => void, onclose: (code: number, reason: string) => void, onerror: (error: string) => void): (data: Blob | ArrayBuffer | string) => void;
}

169
dist/bare.cjs vendored
View file

@ -1,8 +1,8 @@
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BareMux = {}));
})(this, (function (exports) { 'use strict';
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('uuid')) :
typeof define === 'function' && define.amd ? define(['exports', 'uuid'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BareMux = {}, global.uuid));
})(this, (function (exports, uuid) { 'use strict';
const maxRedirects = 20;
@ -22,7 +22,162 @@
OPEN: WebSocket.OPEN,
};
self.BCC_VERSION = "3.0.2";
/// <reference lib="WebWorker" />
function registerRemoteListener(channel) {
navigator.serviceWorker.addEventListener("message", async ({ data }) => {
if (data.type === "request") {
const { remote, method, body, headers } = data;
let response = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined);
let transferred = [];
if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) {
transferred.push(response.body);
}
response.id = data.id;
response.type = "response";
channel.postMessage(response, transferred);
}
});
}
let remote;
if ("ServiceWorkerGlobalScope" in self) {
addEventListener("message", async ({ data }) => {
if (data.type === "response") {
let resolve = remote.promises.get(data.id);
if (resolve) {
resolve(data);
remote.promises.delete(data.id);
}
}
});
}
class RemoteTransport {
canstart = true;
ready = false;
promises = new Map();
constructor() {
if (!("ServiceWorkerGlobalScope" in self)) {
throw new TypeError("Attempt to construct RemoteClient from outside a service worker");
}
}
async init() {
remote = this;
this.ready = true;
}
async meta() { }
async request(remote, method, body, headers, signal) {
let id = uuid.v4();
const clients = await self.clients.matchAll();
if (clients.length < 1)
throw new Error("no available clients");
for (const client of clients) {
client.postMessage({
type: "request",
id,
remote: remote.toString(),
method,
body,
headers
});
}
return await new Promise((resolve, reject) => {
this.promises.set(id, resolve);
});
}
connect(url, origin, protocols, requestHeaders, onopen, onmessage, onclose, onerror) {
throw "why are you calling connect from remoteclient";
}
}
//
// declare const self: ServiceWorkerGlobalScope;
// export default class RemoteClient extends Client {
// static singleton: RemoteClient;
// private callbacks: Record<string, (message: Record<string, any>) => void> = {};
//
// private uid = uuid();
// constructor() {
// if (RemoteClient.singleton) return RemoteClient.singleton;
// super();
// // this should be fine
// // if (!("ServiceWorkerGlobalScope" in self)) {
// // throw new TypeError("Attempt to construct RemoteClient from outside a service worker")
// // }
//
// addEventListener("message", (event) => {
// if (event.data.__remote_target === this.uid) {
// const callback = this.callbacks[event.data.__remote_id];
// callback(event.data.__remote_value);
// }
// });
//
// RemoteClient.singleton = this;
// }
//
// async send(message: Record<string, any>, id?: string) {
// const clients = await self.clients.matchAll();
// if (clients.length < 1)
// throw new Error("no available clients");
//
// for (const client of clients) {
// client.postMessage({
// __remote_target: this.uid,
// __remote_id: id,
// __remote_value: message
// })
// }
//
// }
//
// async sendWithResponse(message: Record<string, any>): Promise<any> {
// const id = uuid();
// return new Promise((resolve) => {
// this.callbacks[id] = resolve;
// this.send(message, id);
// });
// }
//
// connect(
// ...args: any
// ) {
// throw "why are you calling connect from remoteclient"
// }
// async request(
// method: BareMethod,
// requestHeaders: BareHeaders,
// body: BodyInit | null,
// remote: URL,
// cache: BareCache | undefined,
// duplex: string | undefined,
// signal: AbortSignal | undefined
// ): Promise<BareResponse> {
//
// const response = await this.sendWithResponse({
// type: "request",
// options: {
// method,
// requestHeaders,
// body,
// remote: remote.toString(),
// },
// });
// // const readResponse = await this.readBareResponse(response);
//
// const result: Response & Partial<BareResponse> = new Response(
// statusEmpty.includes(response.status!) ? undefined : response.body,
// {
// status: response.status,
// statusText: response.statusText ?? undefined,
// headers: new Headers(response.headers as HeadersInit),
// }
// );
//
// result.rawHeaders = response.rawHeaders;
// result.rawResponse = response;
//
// return result as BareResponse;
// }
// }
self.BCC_VERSION = "3.0.4";
console.warn("BCC_VERSION: " + self.BCC_VERSION);
class Switcher {
active = null;
@ -32,7 +187,7 @@
console.log(type, data, "ServiceWorker" in globalThis);
switch (type) {
case "setremote":
// this.active = new RemoteClient
this.active = new RemoteTransport;
break;
case "set":
const { name, config } = data;
@ -181,7 +336,6 @@
if (socket.binaryType === "arraybuffer") {
payload = await payload.arrayBuffer();
Object.setPrototypeOf(payload, arrayBufferImpl);
console.log(payload);
}
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
}
@ -339,6 +493,7 @@
exports.default = BareClient;
exports.findSwitcher = findSwitcher;
exports.maxRedirects = maxRedirects;
exports.registerRemoteListener = registerRemoteListener;
Object.defineProperty(exports, '__esModule', { value: true });

2
dist/bare.cjs.map vendored

File diff suppressed because one or more lines are too long

1
dist/index.d.ts vendored
View file

@ -1,5 +1,6 @@
export * from './BareTypes';
export * from './BareClient';
export * from './Switcher';
export * from './RemoteClient';
export { BareClient as default } from './BareClient';
export { WebSocketFields } from "./snapshot";

164
dist/index.js vendored
View file

@ -1,3 +1,5 @@
import { v4 } from 'uuid';
const maxRedirects = 20;
// The user likely has overwritten all networking functions after importing bare-client
@ -16,7 +18,162 @@ const WebSocketFields = {
OPEN: WebSocket.OPEN,
};
self.BCC_VERSION = "3.0.2";
/// <reference lib="WebWorker" />
function registerRemoteListener(channel) {
navigator.serviceWorker.addEventListener("message", async ({ data }) => {
if (data.type === "request") {
const { remote, method, body, headers } = data;
let response = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined);
let transferred = [];
if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) {
transferred.push(response.body);
}
response.id = data.id;
response.type = "response";
channel.postMessage(response, transferred);
}
});
}
let remote;
if ("ServiceWorkerGlobalScope" in self) {
addEventListener("message", async ({ data }) => {
if (data.type === "response") {
let resolve = remote.promises.get(data.id);
if (resolve) {
resolve(data);
remote.promises.delete(data.id);
}
}
});
}
class RemoteTransport {
canstart = true;
ready = false;
promises = new Map();
constructor() {
if (!("ServiceWorkerGlobalScope" in self)) {
throw new TypeError("Attempt to construct RemoteClient from outside a service worker");
}
}
async init() {
remote = this;
this.ready = true;
}
async meta() { }
async request(remote, method, body, headers, signal) {
let id = v4();
const clients = await self.clients.matchAll();
if (clients.length < 1)
throw new Error("no available clients");
for (const client of clients) {
client.postMessage({
type: "request",
id,
remote: remote.toString(),
method,
body,
headers
});
}
return await new Promise((resolve, reject) => {
this.promises.set(id, resolve);
});
}
connect(url, origin, protocols, requestHeaders, onopen, onmessage, onclose, onerror) {
throw "why are you calling connect from remoteclient";
}
}
//
// declare const self: ServiceWorkerGlobalScope;
// export default class RemoteClient extends Client {
// static singleton: RemoteClient;
// private callbacks: Record<string, (message: Record<string, any>) => void> = {};
//
// private uid = uuid();
// constructor() {
// if (RemoteClient.singleton) return RemoteClient.singleton;
// super();
// // this should be fine
// // if (!("ServiceWorkerGlobalScope" in self)) {
// // throw new TypeError("Attempt to construct RemoteClient from outside a service worker")
// // }
//
// addEventListener("message", (event) => {
// if (event.data.__remote_target === this.uid) {
// const callback = this.callbacks[event.data.__remote_id];
// callback(event.data.__remote_value);
// }
// });
//
// RemoteClient.singleton = this;
// }
//
// async send(message: Record<string, any>, id?: string) {
// const clients = await self.clients.matchAll();
// if (clients.length < 1)
// throw new Error("no available clients");
//
// for (const client of clients) {
// client.postMessage({
// __remote_target: this.uid,
// __remote_id: id,
// __remote_value: message
// })
// }
//
// }
//
// async sendWithResponse(message: Record<string, any>): Promise<any> {
// const id = uuid();
// return new Promise((resolve) => {
// this.callbacks[id] = resolve;
// this.send(message, id);
// });
// }
//
// connect(
// ...args: any
// ) {
// throw "why are you calling connect from remoteclient"
// }
// async request(
// method: BareMethod,
// requestHeaders: BareHeaders,
// body: BodyInit | null,
// remote: URL,
// cache: BareCache | undefined,
// duplex: string | undefined,
// signal: AbortSignal | undefined
// ): Promise<BareResponse> {
//
// const response = await this.sendWithResponse({
// type: "request",
// options: {
// method,
// requestHeaders,
// body,
// remote: remote.toString(),
// },
// });
// // const readResponse = await this.readBareResponse(response);
//
// const result: Response & Partial<BareResponse> = new Response(
// statusEmpty.includes(response.status!) ? undefined : response.body,
// {
// status: response.status,
// statusText: response.statusText ?? undefined,
// headers: new Headers(response.headers as HeadersInit),
// }
// );
//
// result.rawHeaders = response.rawHeaders;
// result.rawResponse = response;
//
// return result as BareResponse;
// }
// }
self.BCC_VERSION = "3.0.4";
console.warn("BCC_VERSION: " + self.BCC_VERSION);
class Switcher {
active = null;
@ -26,7 +183,7 @@ class Switcher {
console.log(type, data, "ServiceWorker" in globalThis);
switch (type) {
case "setremote":
// this.active = new RemoteClient
this.active = new RemoteTransport;
break;
case "set":
const { name, config } = data;
@ -175,7 +332,6 @@ class BareClient {
if (socket.binaryType === "arraybuffer") {
payload = await payload.arrayBuffer();
Object.setPrototypeOf(payload, arrayBufferImpl);
console.log(payload);
}
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
}
@ -326,5 +482,5 @@ class BareClient {
}
}
export { BareClient, SetSingletonTransport, SetTransport, WebSocketFields, BareClient as default, findSwitcher, maxRedirects };
export { BareClient, SetSingletonTransport, SetTransport, WebSocketFields, BareClient as default, findSwitcher, maxRedirects, registerRemoteListener };
//# sourceMappingURL=index.js.map

2
dist/index.js.map vendored

File diff suppressed because one or more lines are too long

View file

@ -1,5 +1,97 @@
// /// <reference lib="WebWorker" />
// import { v4 as uuid } from 'uuid';
/// <reference lib="WebWorker" />
import { v4 as uuid } from 'uuid';
import { BareHeaders, BareTransport, TransferrableResponse } from './BareTypes';
import { findSwitcher } from './Switcher';
export function registerRemoteListener(channel: ServiceWorker) {
(navigator as any).serviceWorker.addEventListener("message", async ({ data }) => {
if (data.type === "request") {
const { remote, method, body, headers } = data;
let response: any = await findSwitcher().active?.request(new URL(remote), method, body, headers, undefined)!;
let transferred: any = [];
if (response.body instanceof ArrayBuffer || response.body instanceof Blob || response.body instanceof ReadableStream) {
transferred.push(response.body);
}
response.id = data.id;
response.type = "response";
channel.postMessage(response, transferred);
}
});
}
declare var self: ServiceWorkerGlobalScope;
let remote: RemoteTransport;
if ("ServiceWorkerGlobalScope" in self) {
addEventListener("message", async ({ data }) => {
if (data.type === "response") {
let resolve = remote.promises.get(data.id);
if (resolve) {
resolve(data);
remote.promises.delete(data.id);
}
}
});
}
export default class RemoteTransport implements BareTransport {
canstart = true;
ready = false;
promises = new Map<string, (data: any) => void>();
constructor() {
if (!("ServiceWorkerGlobalScope" in self)) {
throw new TypeError("Attempt to construct RemoteClient from outside a service worker")
}
}
async init() {
remote = this;
this.ready = true;
}
async meta() { }
async request(
remote: URL,
method: string,
body: BodyInit | null,
headers: BareHeaders,
signal: AbortSignal | undefined
): Promise<TransferrableResponse> {
let id = uuid();
const clients = await self.clients.matchAll();
if (clients.length < 1)
throw new Error("no available clients");
for (const client of clients) {
client.postMessage({
type: "request",
id,
remote: remote.toString(),
method,
body,
headers
});
}
return await new Promise((resolve, reject) => {
this.promises.set(id, resolve);
});
}
connect(
url: URL,
origin: string,
protocols: string[],
requestHeaders: BareHeaders,
onopen: (protocol: string) => void,
onmessage: (data: Blob | ArrayBuffer | string) => void,
onclose: (code: number, reason: string) => void,
onerror: (error: string) => void
): (data: Blob | ArrayBuffer | string) => void {
throw "why are you calling connect from remoteclient"
}
}
//
// declare const self: ServiceWorkerGlobalScope;
// export default class RemoteClient extends Client {

View file

@ -1,6 +1,7 @@
import { BareTransport } from "./BareTypes";
import RemoteTransport from "./RemoteClient";
self.BCC_VERSION = "3.0.2";
self.BCC_VERSION = "3.0.4";
console.warn("BCC_VERSION: " + self.BCC_VERSION);
declare global {
@ -31,7 +32,7 @@ class Switcher {
console.log(type, data, "ServiceWorker" in globalThis);
switch (type) {
case "setremote":
// this.active = new RemoteClient
this.active = new RemoteTransport
break;
case "set":
const { name, config } = data;

View file

@ -1,5 +1,6 @@
export * from './BareTypes';
export * from './BareClient';
export * from './Switcher';
export * from './RemoteClient';
export { BareClient as default } from './BareClient';
export { WebSocketFields } from "./snapshot";