mirror of
https://github.com/MercuryWorkshop/bare-mux.git
synced 2025-05-16 07:30:01 -04:00
gyatt
This commit is contained in:
parent
86abdca21e
commit
5a5a5debdb
13 changed files with 314 additions and 222 deletions
2
dist/BareClient.d.ts
vendored
2
dist/BareClient.d.ts
vendored
|
@ -56,6 +56,6 @@ export declare class BareClient {
|
||||||
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
|
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
|
||||||
*/
|
*/
|
||||||
constructor();
|
constructor();
|
||||||
createWebSocket(remote: string | URL, protocols: string | string[] | undefined, options: BareWebSocket.Options, origin: string): WebSocket;
|
createWebSocket(remote: string | URL, protocols: string | string[] | undefined, webSocketImpl: WebSocketImpl, requestHeaders: BareHeaders): WebSocket;
|
||||||
fetch(url: string | URL, init?: RequestInit): Promise<BareResponseFetch>;
|
fetch(url: string | URL, init?: RequestInit): Promise<BareResponseFetch>;
|
||||||
}
|
}
|
||||||
|
|
2
dist/BareTypes.d.ts
vendored
2
dist/BareTypes.d.ts
vendored
|
@ -9,7 +9,7 @@ export type TransferrableResponse = {
|
||||||
export interface BareTransport {
|
export interface BareTransport {
|
||||||
init: () => Promise<void>;
|
init: () => Promise<void>;
|
||||||
ready: boolean;
|
ready: boolean;
|
||||||
connect: (url: URL, origin: string, protocols: string[], 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;
|
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;
|
||||||
request: (remote: URL, method: string, body: BodyInit | null, headers: BareHeaders, signal: AbortSignal | undefined) => Promise<TransferrableResponse>;
|
request: (remote: URL, method: string, body: BodyInit | null, headers: BareHeaders, signal: AbortSignal | undefined) => Promise<TransferrableResponse>;
|
||||||
meta: () => BareMeta;
|
meta: () => BareMeta;
|
||||||
}
|
}
|
||||||
|
|
7
dist/Switcher.d.ts
vendored
7
dist/Switcher.d.ts
vendored
|
@ -17,10 +17,11 @@ declare global {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
declare class Switcher {
|
declare class Switcher {
|
||||||
transports: Record<string, BareTransport>;
|
|
||||||
active: BareTransport | null;
|
active: BareTransport | null;
|
||||||
|
channel: BroadcastChannel;
|
||||||
|
constructor();
|
||||||
}
|
}
|
||||||
export declare function findSwitcher(): Switcher;
|
export declare function findSwitcher(): Switcher;
|
||||||
export declare function AddTransport(name: string, client: BareTransport): void;
|
export declare function SetTransport(name: string, ...config: any[]): void;
|
||||||
export declare function SetTransport(name: string): void;
|
export declare function SetSingletonTransport(client: BareTransport): void;
|
||||||
export {};
|
export {};
|
||||||
|
|
174
dist/bare.cjs
vendored
174
dist/bare.cjs
vendored
|
@ -1,7 +1,7 @@
|
||||||
(function (global, factory) {
|
(function (global, factory) {
|
||||||
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
|
||||||
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
typeof define === 'function' && define.amd ? define(['exports'], factory) :
|
||||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.bare = {}));
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.BareMux = {}));
|
||||||
})(this, (function (exports) { 'use strict';
|
})(this, (function (exports) { 'use strict';
|
||||||
|
|
||||||
const maxRedirects = 20;
|
const maxRedirects = 20;
|
||||||
|
@ -22,25 +22,45 @@
|
||||||
OPEN: WebSocket.OPEN,
|
OPEN: WebSocket.OPEN,
|
||||||
};
|
};
|
||||||
|
|
||||||
self.BCC_VERSION = "2.1.3";
|
self.BCC_VERSION = "3.0.2";
|
||||||
console.warn("BCC_VERSION: " + self.BCC_VERSION);
|
console.warn("BCC_VERSION: " + self.BCC_VERSION);
|
||||||
if (!("gTransports" in globalThis)) {
|
|
||||||
globalThis.gTransports = {};
|
|
||||||
}
|
|
||||||
class Switcher {
|
class Switcher {
|
||||||
transports = {};
|
|
||||||
active = null;
|
active = null;
|
||||||
|
channel = new BroadcastChannel("bare-mux");
|
||||||
|
constructor() {
|
||||||
|
this.channel.addEventListener("message", ({ data: { type, data } }) => {
|
||||||
|
console.log(type, data, "ServiceWorker" in globalThis);
|
||||||
|
switch (type) {
|
||||||
|
case "setremote":
|
||||||
|
// this.active = new RemoteClient
|
||||||
|
break;
|
||||||
|
case "set":
|
||||||
|
const { name, config } = data;
|
||||||
|
this.active = new ((0, eval)(name))(...config);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function findSwitcher() {
|
function findSwitcher() {
|
||||||
if (globalThis.gSwitcher)
|
if (globalThis.gSwitcher)
|
||||||
return globalThis.gSwitcher;
|
return globalThis.gSwitcher;
|
||||||
|
if ("ServiceWorkerGlobalScope" in globalThis) {
|
||||||
|
globalThis.gSwitcher = new Switcher;
|
||||||
|
return globalThis.gSwitcher;
|
||||||
|
}
|
||||||
|
let _parent = window;
|
||||||
for (let i = 0; i < 20; i++) {
|
for (let i = 0; i < 20; i++) {
|
||||||
try {
|
try {
|
||||||
parent = parent.parent;
|
if (_parent == _parent.parent) {
|
||||||
if (parent && parent["gSwitcher"]) {
|
globalThis.gSwitcher = new Switcher;
|
||||||
|
return globalThis.gSwitcher;
|
||||||
|
}
|
||||||
|
_parent = _parent.parent;
|
||||||
|
if (_parent && _parent["gSwitcher"]) {
|
||||||
console.warn("found implementation on parent");
|
console.warn("found implementation on parent");
|
||||||
globalThis.gSwitcher = parent["gSwitcher"];
|
globalThis.gSwitcher = _parent["gSwitcher"];
|
||||||
return parent["gSwitcher"];
|
return _parent["gSwitcher"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
@ -50,6 +70,17 @@
|
||||||
}
|
}
|
||||||
throw "unreachable";
|
throw "unreachable";
|
||||||
}
|
}
|
||||||
|
findSwitcher();
|
||||||
|
function SetTransport(name, ...config) {
|
||||||
|
let switcher = findSwitcher();
|
||||||
|
switcher.active = new ((0, eval)(name))(...config);
|
||||||
|
switcher.channel.postMessage({ type: "set", data: { name, config } });
|
||||||
|
}
|
||||||
|
function SetSingletonTransport(client) {
|
||||||
|
let switcher = findSwitcher();
|
||||||
|
switcher.active = client;
|
||||||
|
switcher.channel.postMessage({ type: "setremote" });
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* WebSocket helpers
|
* WebSocket helpers
|
||||||
|
@ -75,7 +106,7 @@
|
||||||
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
|
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
|
||||||
*/
|
*/
|
||||||
constructor() { }
|
constructor() { }
|
||||||
createWebSocket(remote, protocols = [], options, origin) {
|
createWebSocket(remote, protocols = [], webSocketImpl, requestHeaders) {
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
let client = switcher.active;
|
let client = switcher.active;
|
||||||
if (!client)
|
if (!client)
|
||||||
|
@ -96,7 +127,7 @@
|
||||||
for (const proto of protocols)
|
for (const proto of protocols)
|
||||||
if (!validProtocol(proto))
|
if (!validProtocol(proto))
|
||||||
throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`);
|
throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`);
|
||||||
let wsImpl = (options.webSocketImpl || WebSocket);
|
let wsImpl = (webSocketImpl || WebSocket);
|
||||||
const socket = new wsImpl("wss:null", protocols);
|
const socket = new wsImpl("wss:null", protocols);
|
||||||
let fakeProtocol = '';
|
let fakeProtocol = '';
|
||||||
let fakeReadyState = WebSocketFields.CONNECTING;
|
let fakeReadyState = WebSocketFields.CONNECTING;
|
||||||
|
@ -108,21 +139,37 @@
|
||||||
initialErrorHappened = true;
|
initialErrorHappened = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const sendData = client.connect(remote, origin, protocols, (protocol) => {
|
// TODO socket onerror will be broken
|
||||||
|
requestHeaders['Host'] = (new URL(remote)).host;
|
||||||
|
// requestHeaders['Origin'] = origin;
|
||||||
|
requestHeaders['Pragma'] = 'no-cache';
|
||||||
|
requestHeaders['Cache-Control'] = 'no-cache';
|
||||||
|
requestHeaders['Upgrade'] = 'websocket';
|
||||||
|
// requestHeaders['User-Agent'] = navigator.userAgent;
|
||||||
|
requestHeaders['Connection'] = 'Upgrade';
|
||||||
|
const sendData = client.connect(remote, origin, protocols, requestHeaders, (protocol) => {
|
||||||
fakeReadyState = WebSocketFields.OPEN;
|
fakeReadyState = WebSocketFields.OPEN;
|
||||||
fakeProtocol = protocol;
|
fakeProtocol = protocol;
|
||||||
|
socket.meta = {
|
||||||
|
headers: {
|
||||||
|
"sec-websocket-protocol": protocol,
|
||||||
|
}
|
||||||
|
}; // what the fuck is a meta
|
||||||
socket.dispatchEvent(new Event("open"));
|
socket.dispatchEvent(new Event("open"));
|
||||||
}, (payload) => {
|
}, (payload) => {
|
||||||
if (typeof payload === "string") {
|
console.log(payload);
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
if (payload.data) {
|
||||||
}
|
socket.dispatchEvent(new MessageEvent("message", { data: payload.data }));
|
||||||
else if (payload instanceof ArrayBuffer) {
|
return;
|
||||||
Object.setPrototypeOf(payload, ArrayBuffer);
|
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
|
||||||
}
|
|
||||||
else if (payload instanceof Blob) {
|
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
|
||||||
}
|
}
|
||||||
|
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
||||||
|
// if (typeof payload === "string") {
|
||||||
|
// } else if (payload instanceof ArrayBuffer) {
|
||||||
|
// Object.setPrototypeOf(payload, ArrayBuffer);
|
||||||
|
//
|
||||||
|
// socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
||||||
|
// } else if (payload instanceof Blob) {
|
||||||
|
// }
|
||||||
}, (code, reason) => {
|
}, (code, reason) => {
|
||||||
fakeReadyState = WebSocketFields.CLOSED;
|
fakeReadyState = WebSocketFields.CLOSED;
|
||||||
socket.dispatchEvent(new CloseEvent("close", { code, reason }));
|
socket.dispatchEvent(new CloseEvent("close", { code, reason }));
|
||||||
|
@ -146,13 +193,6 @@
|
||||||
// // user is expected to specify user-agent and origin
|
// // user is expected to specify user-agent and origin
|
||||||
// // both are in spec
|
// // both are in spec
|
||||||
//
|
//
|
||||||
// requestHeaders['Host'] = (remote as URL).host;
|
|
||||||
// // requestHeaders['Origin'] = origin;
|
|
||||||
// requestHeaders['Pragma'] = 'no-cache';
|
|
||||||
// requestHeaders['Cache-Control'] = 'no-cache';
|
|
||||||
// requestHeaders['Upgrade'] = 'websocket';
|
|
||||||
// // requestHeaders['User-Agent'] = navigator.userAgent;
|
|
||||||
// requestHeaders['Connection'] = 'Upgrade';
|
|
||||||
//
|
//
|
||||||
// return requestHeaders;
|
// return requestHeaders;
|
||||||
// },
|
// },
|
||||||
|
@ -176,16 +216,12 @@
|
||||||
? fakeReadyState
|
? fakeReadyState
|
||||||
: realReadyState;
|
: realReadyState;
|
||||||
};
|
};
|
||||||
if (options.readyStateHook)
|
// we have to hook .readyState ourselves
|
||||||
options.readyStateHook(socket, getReadyState);
|
Object.defineProperty(socket, 'readyState', {
|
||||||
else {
|
get: getReadyState,
|
||||||
// we have to hook .readyState ourselves
|
configurable: true,
|
||||||
Object.defineProperty(socket, 'readyState', {
|
enumerable: true,
|
||||||
get: getReadyState,
|
});
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value
|
* @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value
|
||||||
*/
|
*/
|
||||||
|
@ -194,36 +230,26 @@
|
||||||
if (readyState === WebSocketFields.CONNECTING)
|
if (readyState === WebSocketFields.CONNECTING)
|
||||||
return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.");
|
return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.");
|
||||||
};
|
};
|
||||||
if (options.sendErrorHook)
|
// we have to hook .send ourselves
|
||||||
options.sendErrorHook(socket, getSendError);
|
// use ...args to avoid giving the number of args a quantity
|
||||||
else {
|
// no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.
|
||||||
// we have to hook .send ourselves
|
socket.send = function (...args) {
|
||||||
// use ...args to avoid giving the number of args a quantity
|
const error = getSendError();
|
||||||
// no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.
|
if (error)
|
||||||
socket.send = function (...args) {
|
throw error;
|
||||||
const error = getSendError();
|
sendData(args[0]);
|
||||||
if (error)
|
};
|
||||||
throw error;
|
Object.defineProperty(socket, 'url', {
|
||||||
sendData(args[0]);
|
get: () => remote.toString(),
|
||||||
};
|
configurable: true,
|
||||||
}
|
enumerable: true,
|
||||||
if (options.urlHook)
|
});
|
||||||
options.urlHook(socket, remote);
|
|
||||||
else
|
|
||||||
Object.defineProperty(socket, 'url', {
|
|
||||||
get: () => remote.toString(),
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
const getProtocol = () => fakeProtocol;
|
const getProtocol = () => fakeProtocol;
|
||||||
if (options.protocolHook)
|
Object.defineProperty(socket, 'protocol', {
|
||||||
options.protocolHook(socket, getProtocol);
|
get: getProtocol,
|
||||||
else
|
configurable: true,
|
||||||
Object.defineProperty(socket, 'protocol', {
|
enumerable: true,
|
||||||
get: getProtocol,
|
});
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
async fetch(url, init) {
|
async fetch(url, init) {
|
||||||
|
@ -248,7 +274,7 @@
|
||||||
}
|
}
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
if (!switcher.active)
|
if (!switcher.active)
|
||||||
throw "invalid";
|
throw "there are no bare clients";
|
||||||
const client = switcher.active;
|
const client = switcher.active;
|
||||||
if (!client.ready)
|
if (!client.ready)
|
||||||
await client.init();
|
await client.init();
|
||||||
|
@ -259,7 +285,9 @@
|
||||||
headers.Host = urlO.host;
|
headers.Host = urlO.host;
|
||||||
let resp = await client.request(urlO, req.method, body, headers, req.signal);
|
let resp = await client.request(urlO, req.method, body, headers, req.signal);
|
||||||
let responseobj = new Response(statusEmpty.includes(resp.status) ? undefined : resp.body, {
|
let responseobj = new Response(statusEmpty.includes(resp.status) ? undefined : resp.body, {
|
||||||
headers: new Headers(resp.headers)
|
headers: new Headers(resp.headers),
|
||||||
|
status: resp.status,
|
||||||
|
statusText: resp.statusText,
|
||||||
});
|
});
|
||||||
responseobj.rawHeaders = resp.headers;
|
responseobj.rawHeaders = resp.headers;
|
||||||
responseobj.rawResponse = new Response(resp.body);
|
responseobj.rawResponse = new Response(resp.body);
|
||||||
|
@ -290,8 +318,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.BareClient = BareClient;
|
exports.BareClient = BareClient;
|
||||||
|
exports.SetSingletonTransport = SetSingletonTransport;
|
||||||
|
exports.SetTransport = SetTransport;
|
||||||
exports.WebSocketFields = WebSocketFields;
|
exports.WebSocketFields = WebSocketFields;
|
||||||
|
exports.default = BareClient;
|
||||||
|
exports.findSwitcher = findSwitcher;
|
||||||
exports.maxRedirects = maxRedirects;
|
exports.maxRedirects = maxRedirects;
|
||||||
|
|
||||||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||||||
|
|
||||||
}));
|
}));
|
||||||
//# sourceMappingURL=bare.cjs.map
|
//# sourceMappingURL=bare.cjs.map
|
||||||
|
|
2
dist/bare.cjs.map
vendored
2
dist/bare.cjs.map
vendored
File diff suppressed because one or more lines are too long
2
dist/index.d.ts
vendored
2
dist/index.d.ts
vendored
|
@ -1,3 +1,5 @@
|
||||||
export * from './BareTypes';
|
export * from './BareTypes';
|
||||||
export * from './BareClient';
|
export * from './BareClient';
|
||||||
|
export * from './Switcher';
|
||||||
|
export { BareClient as default } from './BareClient';
|
||||||
export { WebSocketFields } from "./snapshot";
|
export { WebSocketFields } from "./snapshot";
|
||||||
|
|
168
dist/index.js
vendored
168
dist/index.js
vendored
|
@ -16,25 +16,45 @@ const WebSocketFields = {
|
||||||
OPEN: WebSocket.OPEN,
|
OPEN: WebSocket.OPEN,
|
||||||
};
|
};
|
||||||
|
|
||||||
self.BCC_VERSION = "2.1.3";
|
self.BCC_VERSION = "3.0.2";
|
||||||
console.warn("BCC_VERSION: " + self.BCC_VERSION);
|
console.warn("BCC_VERSION: " + self.BCC_VERSION);
|
||||||
if (!("gTransports" in globalThis)) {
|
|
||||||
globalThis.gTransports = {};
|
|
||||||
}
|
|
||||||
class Switcher {
|
class Switcher {
|
||||||
transports = {};
|
|
||||||
active = null;
|
active = null;
|
||||||
|
channel = new BroadcastChannel("bare-mux");
|
||||||
|
constructor() {
|
||||||
|
this.channel.addEventListener("message", ({ data: { type, data } }) => {
|
||||||
|
console.log(type, data, "ServiceWorker" in globalThis);
|
||||||
|
switch (type) {
|
||||||
|
case "setremote":
|
||||||
|
// this.active = new RemoteClient
|
||||||
|
break;
|
||||||
|
case "set":
|
||||||
|
const { name, config } = data;
|
||||||
|
this.active = new ((0, eval)(name))(...config);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
function findSwitcher() {
|
function findSwitcher() {
|
||||||
if (globalThis.gSwitcher)
|
if (globalThis.gSwitcher)
|
||||||
return globalThis.gSwitcher;
|
return globalThis.gSwitcher;
|
||||||
|
if ("ServiceWorkerGlobalScope" in globalThis) {
|
||||||
|
globalThis.gSwitcher = new Switcher;
|
||||||
|
return globalThis.gSwitcher;
|
||||||
|
}
|
||||||
|
let _parent = window;
|
||||||
for (let i = 0; i < 20; i++) {
|
for (let i = 0; i < 20; i++) {
|
||||||
try {
|
try {
|
||||||
parent = parent.parent;
|
if (_parent == _parent.parent) {
|
||||||
if (parent && parent["gSwitcher"]) {
|
globalThis.gSwitcher = new Switcher;
|
||||||
|
return globalThis.gSwitcher;
|
||||||
|
}
|
||||||
|
_parent = _parent.parent;
|
||||||
|
if (_parent && _parent["gSwitcher"]) {
|
||||||
console.warn("found implementation on parent");
|
console.warn("found implementation on parent");
|
||||||
globalThis.gSwitcher = parent["gSwitcher"];
|
globalThis.gSwitcher = _parent["gSwitcher"];
|
||||||
return parent["gSwitcher"];
|
return _parent["gSwitcher"];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
@ -44,6 +64,17 @@ function findSwitcher() {
|
||||||
}
|
}
|
||||||
throw "unreachable";
|
throw "unreachable";
|
||||||
}
|
}
|
||||||
|
findSwitcher();
|
||||||
|
function SetTransport(name, ...config) {
|
||||||
|
let switcher = findSwitcher();
|
||||||
|
switcher.active = new ((0, eval)(name))(...config);
|
||||||
|
switcher.channel.postMessage({ type: "set", data: { name, config } });
|
||||||
|
}
|
||||||
|
function SetSingletonTransport(client) {
|
||||||
|
let switcher = findSwitcher();
|
||||||
|
switcher.active = client;
|
||||||
|
switcher.channel.postMessage({ type: "setremote" });
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* WebSocket helpers
|
* WebSocket helpers
|
||||||
|
@ -69,7 +100,7 @@ class BareClient {
|
||||||
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
|
* Create a BareClient. Calls to fetch and connect will wait for an implementation to be ready.
|
||||||
*/
|
*/
|
||||||
constructor() { }
|
constructor() { }
|
||||||
createWebSocket(remote, protocols = [], options, origin) {
|
createWebSocket(remote, protocols = [], webSocketImpl, requestHeaders) {
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
let client = switcher.active;
|
let client = switcher.active;
|
||||||
if (!client)
|
if (!client)
|
||||||
|
@ -90,7 +121,7 @@ class BareClient {
|
||||||
for (const proto of protocols)
|
for (const proto of protocols)
|
||||||
if (!validProtocol(proto))
|
if (!validProtocol(proto))
|
||||||
throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`);
|
throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${proto}' is invalid.`);
|
||||||
let wsImpl = (options.webSocketImpl || WebSocket);
|
let wsImpl = (webSocketImpl || WebSocket);
|
||||||
const socket = new wsImpl("wss:null", protocols);
|
const socket = new wsImpl("wss:null", protocols);
|
||||||
let fakeProtocol = '';
|
let fakeProtocol = '';
|
||||||
let fakeReadyState = WebSocketFields.CONNECTING;
|
let fakeReadyState = WebSocketFields.CONNECTING;
|
||||||
|
@ -102,21 +133,37 @@ class BareClient {
|
||||||
initialErrorHappened = true;
|
initialErrorHappened = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
const sendData = client.connect(remote, origin, protocols, (protocol) => {
|
// TODO socket onerror will be broken
|
||||||
|
requestHeaders['Host'] = (new URL(remote)).host;
|
||||||
|
// requestHeaders['Origin'] = origin;
|
||||||
|
requestHeaders['Pragma'] = 'no-cache';
|
||||||
|
requestHeaders['Cache-Control'] = 'no-cache';
|
||||||
|
requestHeaders['Upgrade'] = 'websocket';
|
||||||
|
// requestHeaders['User-Agent'] = navigator.userAgent;
|
||||||
|
requestHeaders['Connection'] = 'Upgrade';
|
||||||
|
const sendData = client.connect(remote, origin, protocols, requestHeaders, (protocol) => {
|
||||||
fakeReadyState = WebSocketFields.OPEN;
|
fakeReadyState = WebSocketFields.OPEN;
|
||||||
fakeProtocol = protocol;
|
fakeProtocol = protocol;
|
||||||
|
socket.meta = {
|
||||||
|
headers: {
|
||||||
|
"sec-websocket-protocol": protocol,
|
||||||
|
}
|
||||||
|
}; // what the fuck is a meta
|
||||||
socket.dispatchEvent(new Event("open"));
|
socket.dispatchEvent(new Event("open"));
|
||||||
}, (payload) => {
|
}, (payload) => {
|
||||||
if (typeof payload === "string") {
|
console.log(payload);
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
if (payload.data) {
|
||||||
}
|
socket.dispatchEvent(new MessageEvent("message", { data: payload.data }));
|
||||||
else if (payload instanceof ArrayBuffer) {
|
return;
|
||||||
Object.setPrototypeOf(payload, ArrayBuffer);
|
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
|
||||||
}
|
|
||||||
else if (payload instanceof Blob) {
|
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
|
||||||
}
|
}
|
||||||
|
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
||||||
|
// if (typeof payload === "string") {
|
||||||
|
// } else if (payload instanceof ArrayBuffer) {
|
||||||
|
// Object.setPrototypeOf(payload, ArrayBuffer);
|
||||||
|
//
|
||||||
|
// socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
||||||
|
// } else if (payload instanceof Blob) {
|
||||||
|
// }
|
||||||
}, (code, reason) => {
|
}, (code, reason) => {
|
||||||
fakeReadyState = WebSocketFields.CLOSED;
|
fakeReadyState = WebSocketFields.CLOSED;
|
||||||
socket.dispatchEvent(new CloseEvent("close", { code, reason }));
|
socket.dispatchEvent(new CloseEvent("close", { code, reason }));
|
||||||
|
@ -140,13 +187,6 @@ class BareClient {
|
||||||
// // user is expected to specify user-agent and origin
|
// // user is expected to specify user-agent and origin
|
||||||
// // both are in spec
|
// // both are in spec
|
||||||
//
|
//
|
||||||
// requestHeaders['Host'] = (remote as URL).host;
|
|
||||||
// // requestHeaders['Origin'] = origin;
|
|
||||||
// requestHeaders['Pragma'] = 'no-cache';
|
|
||||||
// requestHeaders['Cache-Control'] = 'no-cache';
|
|
||||||
// requestHeaders['Upgrade'] = 'websocket';
|
|
||||||
// // requestHeaders['User-Agent'] = navigator.userAgent;
|
|
||||||
// requestHeaders['Connection'] = 'Upgrade';
|
|
||||||
//
|
//
|
||||||
// return requestHeaders;
|
// return requestHeaders;
|
||||||
// },
|
// },
|
||||||
|
@ -170,16 +210,12 @@ class BareClient {
|
||||||
? fakeReadyState
|
? fakeReadyState
|
||||||
: realReadyState;
|
: realReadyState;
|
||||||
};
|
};
|
||||||
if (options.readyStateHook)
|
// we have to hook .readyState ourselves
|
||||||
options.readyStateHook(socket, getReadyState);
|
Object.defineProperty(socket, 'readyState', {
|
||||||
else {
|
get: getReadyState,
|
||||||
// we have to hook .readyState ourselves
|
configurable: true,
|
||||||
Object.defineProperty(socket, 'readyState', {
|
enumerable: true,
|
||||||
get: getReadyState,
|
});
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value
|
* @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value
|
||||||
*/
|
*/
|
||||||
|
@ -188,36 +224,26 @@ class BareClient {
|
||||||
if (readyState === WebSocketFields.CONNECTING)
|
if (readyState === WebSocketFields.CONNECTING)
|
||||||
return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.");
|
return new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.");
|
||||||
};
|
};
|
||||||
if (options.sendErrorHook)
|
// we have to hook .send ourselves
|
||||||
options.sendErrorHook(socket, getSendError);
|
// use ...args to avoid giving the number of args a quantity
|
||||||
else {
|
// no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.
|
||||||
// we have to hook .send ourselves
|
socket.send = function (...args) {
|
||||||
// use ...args to avoid giving the number of args a quantity
|
const error = getSendError();
|
||||||
// no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.
|
if (error)
|
||||||
socket.send = function (...args) {
|
throw error;
|
||||||
const error = getSendError();
|
sendData(args[0]);
|
||||||
if (error)
|
};
|
||||||
throw error;
|
Object.defineProperty(socket, 'url', {
|
||||||
sendData(args[0]);
|
get: () => remote.toString(),
|
||||||
};
|
configurable: true,
|
||||||
}
|
enumerable: true,
|
||||||
if (options.urlHook)
|
});
|
||||||
options.urlHook(socket, remote);
|
|
||||||
else
|
|
||||||
Object.defineProperty(socket, 'url', {
|
|
||||||
get: () => remote.toString(),
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
const getProtocol = () => fakeProtocol;
|
const getProtocol = () => fakeProtocol;
|
||||||
if (options.protocolHook)
|
Object.defineProperty(socket, 'protocol', {
|
||||||
options.protocolHook(socket, getProtocol);
|
get: getProtocol,
|
||||||
else
|
configurable: true,
|
||||||
Object.defineProperty(socket, 'protocol', {
|
enumerable: true,
|
||||||
get: getProtocol,
|
});
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
async fetch(url, init) {
|
async fetch(url, init) {
|
||||||
|
@ -242,7 +268,7 @@ class BareClient {
|
||||||
}
|
}
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
if (!switcher.active)
|
if (!switcher.active)
|
||||||
throw "invalid";
|
throw "there are no bare clients";
|
||||||
const client = switcher.active;
|
const client = switcher.active;
|
||||||
if (!client.ready)
|
if (!client.ready)
|
||||||
await client.init();
|
await client.init();
|
||||||
|
@ -253,7 +279,9 @@ class BareClient {
|
||||||
headers.Host = urlO.host;
|
headers.Host = urlO.host;
|
||||||
let resp = await client.request(urlO, req.method, body, headers, req.signal);
|
let resp = await client.request(urlO, req.method, body, headers, req.signal);
|
||||||
let responseobj = new Response(statusEmpty.includes(resp.status) ? undefined : resp.body, {
|
let responseobj = new Response(statusEmpty.includes(resp.status) ? undefined : resp.body, {
|
||||||
headers: new Headers(resp.headers)
|
headers: new Headers(resp.headers),
|
||||||
|
status: resp.status,
|
||||||
|
statusText: resp.statusText,
|
||||||
});
|
});
|
||||||
responseobj.rawHeaders = resp.headers;
|
responseobj.rawHeaders = resp.headers;
|
||||||
responseobj.rawResponse = new Response(resp.body);
|
responseobj.rawResponse = new Response(resp.body);
|
||||||
|
@ -283,5 +311,5 @@ class BareClient {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export { BareClient, WebSocketFields, maxRedirects };
|
export { BareClient, SetSingletonTransport, SetTransport, WebSocketFields, BareClient as default, findSwitcher, maxRedirects };
|
||||||
//# sourceMappingURL=index.js.map
|
//# sourceMappingURL=index.js.map
|
||||||
|
|
2
dist/index.js.map
vendored
2
dist/index.js.map
vendored
File diff suppressed because one or more lines are too long
|
@ -45,7 +45,7 @@ const configs = [
|
||||||
output: {
|
output: {
|
||||||
file: `dist/bare.cjs`,
|
file: `dist/bare.cjs`,
|
||||||
format: 'umd',
|
format: 'umd',
|
||||||
name: 'bare',
|
name: 'BareMux',
|
||||||
sourcemap: true,
|
sourcemap: true,
|
||||||
exports: 'auto',
|
exports: 'auto',
|
||||||
},
|
},
|
||||||
|
|
|
@ -97,8 +97,8 @@ export class BareClient {
|
||||||
createWebSocket(
|
createWebSocket(
|
||||||
remote: string | URL,
|
remote: string | URL,
|
||||||
protocols: string | string[] | undefined = [],
|
protocols: string | string[] | undefined = [],
|
||||||
options: BareWebSocket.Options,
|
webSocketImpl: WebSocketImpl,
|
||||||
origin: string,
|
requestHeaders: BareHeaders,
|
||||||
): WebSocket {
|
): WebSocket {
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
let client = switcher.active;
|
let client = switcher.active;
|
||||||
|
@ -133,7 +133,7 @@ export class BareClient {
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
let wsImpl = (options.webSocketImpl || WebSocket) as WebSocketImpl;
|
let wsImpl = (webSocketImpl || WebSocket) as WebSocketImpl;
|
||||||
const socket = new wsImpl("wss:null", protocols);
|
const socket = new wsImpl("wss:null", protocols);
|
||||||
|
|
||||||
let fakeProtocol = '';
|
let fakeProtocol = '';
|
||||||
|
@ -148,26 +148,46 @@ export class BareClient {
|
||||||
initialErrorHappened = true;
|
initialErrorHappened = true;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
let initialOnErrorHappenned = false;
|
||||||
|
// TODO socket onerror will be broken
|
||||||
|
|
||||||
|
requestHeaders['Host'] = (new URL(remote)).host;
|
||||||
|
// requestHeaders['Origin'] = origin;
|
||||||
|
requestHeaders['Pragma'] = 'no-cache';
|
||||||
|
requestHeaders['Cache-Control'] = 'no-cache';
|
||||||
|
requestHeaders['Upgrade'] = 'websocket';
|
||||||
|
// requestHeaders['User-Agent'] = navigator.userAgent;
|
||||||
|
requestHeaders['Connection'] = 'Upgrade';
|
||||||
const sendData = client.connect(
|
const sendData = client.connect(
|
||||||
remote,
|
remote,
|
||||||
origin,
|
origin,
|
||||||
protocols,
|
protocols,
|
||||||
|
requestHeaders,
|
||||||
(protocol: string) => {
|
(protocol: string) => {
|
||||||
fakeReadyState = WebSocketFields.OPEN;
|
fakeReadyState = WebSocketFields.OPEN;
|
||||||
fakeProtocol = protocol;
|
fakeProtocol = protocol;
|
||||||
|
|
||||||
|
(socket as any).meta = {
|
||||||
|
headers: {
|
||||||
|
"sec-websocket-protocol": protocol,
|
||||||
|
}
|
||||||
|
}; // what the fuck is a meta
|
||||||
socket.dispatchEvent(new Event("open"));
|
socket.dispatchEvent(new Event("open"));
|
||||||
},
|
},
|
||||||
(payload) => {
|
(payload) => {
|
||||||
if (typeof payload === "string") {
|
console.log(payload);
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
if ((payload as any).data) {
|
||||||
} else if (payload instanceof ArrayBuffer) {
|
socket.dispatchEvent(new MessageEvent("message", { data: (payload as any).data }));
|
||||||
Object.setPrototypeOf(payload, ArrayBuffer);
|
return;
|
||||||
|
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
|
||||||
} else if (payload instanceof Blob) {
|
|
||||||
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
|
||||||
}
|
}
|
||||||
|
socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
||||||
|
// if (typeof payload === "string") {
|
||||||
|
// } else if (payload instanceof ArrayBuffer) {
|
||||||
|
// Object.setPrototypeOf(payload, ArrayBuffer);
|
||||||
|
//
|
||||||
|
// socket.dispatchEvent(new MessageEvent("message", { data: payload }));
|
||||||
|
// } else if (payload instanceof Blob) {
|
||||||
|
// }
|
||||||
},
|
},
|
||||||
(code, reason) => {
|
(code, reason) => {
|
||||||
fakeReadyState = WebSocketFields.CLOSED;
|
fakeReadyState = WebSocketFields.CLOSED;
|
||||||
|
@ -195,13 +215,6 @@ export class BareClient {
|
||||||
// // user is expected to specify user-agent and origin
|
// // user is expected to specify user-agent and origin
|
||||||
// // both are in spec
|
// // both are in spec
|
||||||
//
|
//
|
||||||
// requestHeaders['Host'] = (remote as URL).host;
|
|
||||||
// // requestHeaders['Origin'] = origin;
|
|
||||||
// requestHeaders['Pragma'] = 'no-cache';
|
|
||||||
// requestHeaders['Cache-Control'] = 'no-cache';
|
|
||||||
// requestHeaders['Upgrade'] = 'websocket';
|
|
||||||
// // requestHeaders['User-Agent'] = navigator.userAgent;
|
|
||||||
// requestHeaders['Connection'] = 'Upgrade';
|
|
||||||
//
|
//
|
||||||
// return requestHeaders;
|
// return requestHeaders;
|
||||||
// },
|
// },
|
||||||
|
@ -227,16 +240,13 @@ export class BareClient {
|
||||||
: realReadyState;
|
: realReadyState;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (options.readyStateHook) options.readyStateHook(socket, getReadyState);
|
// we have to hook .readyState ourselves
|
||||||
else {
|
|
||||||
// we have to hook .readyState ourselves
|
|
||||||
|
|
||||||
Object.defineProperty(socket, 'readyState', {
|
Object.defineProperty(socket, 'readyState', {
|
||||||
get: getReadyState,
|
get: getReadyState,
|
||||||
configurable: true,
|
configurable: true,
|
||||||
enumerable: true,
|
enumerable: true,
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value
|
* @returns The error that should be thrown if send() were to be called on this socket according to the fake readyState value
|
||||||
|
@ -250,36 +260,29 @@ export class BareClient {
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
if (options.sendErrorHook) options.sendErrorHook(socket, getSendError);
|
// we have to hook .send ourselves
|
||||||
else {
|
// use ...args to avoid giving the number of args a quantity
|
||||||
// we have to hook .send ourselves
|
// no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.
|
||||||
// use ...args to avoid giving the number of args a quantity
|
socket.send = function(...args) {
|
||||||
// no arguments will trip the following error: TypeError: Failed to execute 'send' on 'WebSocket': 1 argument required, but only 0 present.
|
const error = getSendError();
|
||||||
socket.send = function(...args) {
|
|
||||||
const error = getSendError();
|
|
||||||
|
|
||||||
if (error) throw error;
|
if (error) throw error;
|
||||||
sendData(args[0] as any);
|
sendData(args[0] as any);
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
if (options.urlHook) options.urlHook(socket, remote);
|
Object.defineProperty(socket, 'url', {
|
||||||
else
|
get: () => remote.toString(),
|
||||||
Object.defineProperty(socket, 'url', {
|
configurable: true,
|
||||||
get: () => remote.toString(),
|
enumerable: true,
|
||||||
configurable: true,
|
});
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const getProtocol = () => fakeProtocol;
|
const getProtocol = () => fakeProtocol;
|
||||||
|
|
||||||
if (options.protocolHook) options.protocolHook(socket, getProtocol);
|
Object.defineProperty(socket, 'protocol', {
|
||||||
else
|
get: getProtocol,
|
||||||
Object.defineProperty(socket, 'protocol', {
|
configurable: true,
|
||||||
get: getProtocol,
|
enumerable: true,
|
||||||
configurable: true,
|
});
|
||||||
enumerable: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
return socket;
|
return socket;
|
||||||
}
|
}
|
||||||
|
@ -322,7 +325,7 @@ export class BareClient {
|
||||||
}
|
}
|
||||||
|
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
if (!switcher.active) throw "invalid";
|
if (!switcher.active) throw "there are no bare clients";
|
||||||
const client = switcher.active;
|
const client = switcher.active;
|
||||||
if (!client.ready) await client.init();
|
if (!client.ready) await client.init();
|
||||||
|
|
||||||
|
@ -341,7 +344,9 @@ export class BareClient {
|
||||||
|
|
||||||
let responseobj: BareResponse & Partial<BareResponseFetch> = new Response(
|
let responseobj: BareResponse & Partial<BareResponseFetch> = new Response(
|
||||||
statusEmpty.includes(resp.status) ? undefined : resp.body, {
|
statusEmpty.includes(resp.status) ? undefined : resp.body, {
|
||||||
headers: new Headers(resp.headers as HeadersInit)
|
headers: new Headers(resp.headers as HeadersInit),
|
||||||
|
status: resp.status,
|
||||||
|
statusText: resp.statusText,
|
||||||
}) as BareResponse;
|
}) as BareResponse;
|
||||||
responseobj.rawHeaders = resp.headers;
|
responseobj.rawHeaders = resp.headers;
|
||||||
responseobj.rawResponse = new Response(resp.body);
|
responseobj.rawResponse = new Response(resp.body);
|
||||||
|
|
|
@ -20,6 +20,7 @@ export interface BareTransport {
|
||||||
url: URL,
|
url: URL,
|
||||||
origin: string,
|
origin: string,
|
||||||
protocols: string[],
|
protocols: string[],
|
||||||
|
requestHeaders: BareHeaders,
|
||||||
onopen: (protocol: string) => void,
|
onopen: (protocol: string) => void,
|
||||||
onmessage: (data: Blob | ArrayBuffer | string) => void,
|
onmessage: (data: Blob | ArrayBuffer | string) => void,
|
||||||
onclose: (code: number, reason: string) => void,
|
onclose: (code: number, reason: string) => void,
|
||||||
|
|
|
@ -1,13 +1,8 @@
|
||||||
import { BareTransport } from "./BareTypes";
|
import { BareTransport } from "./BareTypes";
|
||||||
|
|
||||||
self.BCC_VERSION = "2.1.3";
|
self.BCC_VERSION = "3.0.2";
|
||||||
console.warn("BCC_VERSION: " + self.BCC_VERSION);
|
console.warn("BCC_VERSION: " + self.BCC_VERSION);
|
||||||
|
|
||||||
if (!("gTransports" in globalThis)) {
|
|
||||||
globalThis.gTransports = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
declare global {
|
declare global {
|
||||||
interface ServiceWorkerGlobalScope {
|
interface ServiceWorkerGlobalScope {
|
||||||
gSwitcher: Switcher;
|
gSwitcher: Switcher;
|
||||||
|
@ -27,23 +22,48 @@ declare global {
|
||||||
}
|
}
|
||||||
|
|
||||||
class Switcher {
|
class Switcher {
|
||||||
transports: Record<string, BareTransport> = {};
|
|
||||||
active: BareTransport | null = null;
|
active: BareTransport | null = null;
|
||||||
|
|
||||||
|
channel = new BroadcastChannel("bare-mux");
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this.channel.addEventListener("message", ({ data: { type, data } }) => {
|
||||||
|
console.log(type, data, "ServiceWorker" in globalThis);
|
||||||
|
switch (type) {
|
||||||
|
case "setremote":
|
||||||
|
// this.active = new RemoteClient
|
||||||
|
break;
|
||||||
|
case "set":
|
||||||
|
const { name, config } = data;
|
||||||
|
this.active = new ((0, eval)(name))(...config);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function findSwitcher(): Switcher {
|
export function findSwitcher(): Switcher {
|
||||||
if (globalThis.gSwitcher) return globalThis.gSwitcher;
|
if (globalThis.gSwitcher) return globalThis.gSwitcher;
|
||||||
|
if ("ServiceWorkerGlobalScope" in globalThis) {
|
||||||
|
globalThis.gSwitcher = new Switcher;
|
||||||
|
return globalThis.gSwitcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
let _parent: any = window;
|
||||||
for (let i = 0; i < 20; i++) {
|
for (let i = 0; i < 20; i++) {
|
||||||
try {
|
try {
|
||||||
parent = parent.parent;
|
if (_parent == _parent.parent) {
|
||||||
if (parent && parent["gSwitcher"]) {
|
globalThis.gSwitcher = new Switcher;
|
||||||
|
return globalThis.gSwitcher;
|
||||||
|
}
|
||||||
|
_parent = _parent.parent;
|
||||||
|
|
||||||
|
if (_parent && _parent["gSwitcher"]) {
|
||||||
console.warn("found implementation on parent");
|
console.warn("found implementation on parent");
|
||||||
globalThis.gSwitcher = parent["gSwitcher"];
|
globalThis.gSwitcher = _parent["gSwitcher"];
|
||||||
return parent["gSwitcher"];
|
return _parent["gSwitcher"];
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
||||||
globalThis.gSwitcher = new Switcher;
|
globalThis.gSwitcher = new Switcher;
|
||||||
return globalThis.gSwitcher;
|
return globalThis.gSwitcher;
|
||||||
}
|
}
|
||||||
|
@ -51,17 +71,16 @@ export function findSwitcher(): Switcher {
|
||||||
|
|
||||||
throw "unreachable";
|
throw "unreachable";
|
||||||
}
|
}
|
||||||
|
findSwitcher();
|
||||||
|
|
||||||
export function AddTransport(name: string, client: BareTransport) {
|
export function SetTransport(name: string, ...config: any[]) {
|
||||||
|
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
|
switcher.active = new ((0, eval)(name))(...config);
|
||||||
switcher.transports[name] = client;
|
switcher.channel.postMessage({ type: "set", data: { name, config } });
|
||||||
if (!switcher.active)
|
|
||||||
switcher.active = switcher.transports[name];
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export function SetTransport(name: string) {
|
export function SetSingletonTransport(client: BareTransport) {
|
||||||
let switcher = findSwitcher();
|
let switcher = findSwitcher();
|
||||||
switcher.active = switcher.transports[name];
|
switcher.active = client;
|
||||||
|
switcher.channel.postMessage({ type: "setremote" });
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
export * from './BareTypes';
|
export * from './BareTypes';
|
||||||
export * from './BareClient';
|
export * from './BareClient';
|
||||||
|
export * from './Switcher';
|
||||||
|
export { BareClient as default } from './BareClient';
|
||||||
export { WebSocketFields } from "./snapshot";
|
export { WebSocketFields } from "./snapshot";
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue