@statewalker/webrun-devtools
Version:
DevTools Extension for the StateWalker WebRun framework
438 lines (437 loc) • 13.2 kB
JavaScript
//#region node_modules/.pnpm/@statewalker+utils@0.4.2/node_modules/@statewalker/utils/src/iterate.js
async function* e(e, t = []) {
let n, r, i = async (e, n, i) => {
let a = {
error: e,
value: n,
done: i
};
return a.promise = new Promise((e) => a.notify = e), await t.push(a), r && r(), r = null, a.promise;
}, a = (e) => i(void 0, e, !1), o = () => i(void 0, void 0, !0), s = (e) => i(e, void 0, !0), c = e(Object.assign([
a,
o,
s
], {
next: a,
complete: o,
error: s
})), l;
try {
for (;;) if (l = await t.shift(), l) try {
if (l.error) throw l.error;
if (l.done) break;
yield l.value;
} finally {
l.notify(!0);
}
else await (n = r ? n : new Promise((e) => r = e));
} finally {
for (r && r(), i = () => !1, typeof c == "function" && await c(); l = await t.shift();) l.notify(!1);
}
}
//#endregion
//#region node_modules/.pnpm/@statewalker+utils@0.4.2/node_modules/@statewalker/utils/src/newRegistry.js
function t(e = console.error) {
let t = 0, n = {}, r = (r) => {
let i = t++;
return n[i] = Object.assign(function(t) {
try {
return delete n[i], !t && r && r();
} catch (t) {
e(t);
}
}, { action: r });
}, i = (e) => Object.values(n).forEach((t) => t.action === e && t(!0)), a = () => Object.values(n).forEach((e) => e());
return Object.assign([
r,
a,
i
], {
register: r,
clear: a,
unregister: i
});
}
//#endregion
//#region node_modules/.pnpm/@statewalker+getset@0.2.6/node_modules/@statewalker/getset/src/toPath.js
function n(e) {
return e ? typeof e == "string" ? e.split(".") : e : [];
}
//#endregion
//#region node_modules/.pnpm/@statewalker+getset@0.2.6/node_modules/@statewalker/getset/src/set.js
function r(e = {}, t, r) {
if (t = n(t), t.length === 0) return r;
let i = a(e);
for (let e = 0, n = i; e < t.length; e++) {
let i = t[e];
n = n[i] = e < t.length - 1 ? a(n[i]) : r;
}
return i;
function a(e) {
return typeof e == "object" && e ? Array.isArray(e) ? [...e] : Object.assign({}, e) : {};
}
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-http@0.1.0/node_modules/@statewalker/webrun-http/src/readable-streams.js
function i(e) {
return new ReadableStream({
type: "bytes",
async pull(t) {
let n = !1;
try {
for (; !n;) {
let n = await e.next();
if (!n || n.done) break;
t.enqueue(await n.value);
}
} catch (e) {
n = !0, t.error(e);
} finally {
!n && t.close();
}
}
});
}
async function* a(e) {
let t = await e.getReader(), n, r;
for (; ({done: n, value: r} = await t.read()) && !n;) yield await r;
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-http@0.1.0/node_modules/@statewalker/webrun-http/src/http-stubs.js
function o(e) {
return async (t) => {
t = await t;
let n = [
"url",
"method",
"mode",
"credentials",
"cache",
"redirect",
"referrer",
"referrerPolicy",
"integrity",
"keepalive"
], r = [...t.headers].map(([e, t]) => [e, t]), o = n.reduce((e, n) => {
let r = t[n];
return r !== void 0 && (e[n] = r), e;
}, { headers: r }), s = await e({
options: o,
content: t.body ? a(t.body) : []
}), c = null, l = {};
if (!s) l = {
status: 404,
statusText: "Error 404: Not Found"
};
else {
l = s.options;
let e = s.content;
o.method !== "HEAD" && o.method !== "OPTIONS" ? c = i(e) : e && e.return && e.return();
}
return new Response(c, l);
};
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-http@0.1.0/node_modules/@statewalker/webrun-http/src/http-send-recieve.js
async function* s(e) {
let { options: t, content: n } = await e;
yield new TextEncoder().encode(JSON.stringify(t)), yield* n;
}
async function c(e) {
e = await e;
let { done: t, value: n } = await e.next(), r = {};
if (!t && n) {
let e = new TextDecoder().decode(n);
r = JSON.parse(e);
}
return {
options: r,
content: e
};
}
function l(e) {
return async function(t) {
return await o(async (t) => await c(e(s(t))))(t);
};
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/errors.js
function u(e) {
return Object.assign({
message: e,
stack: e.stack
}, e);
}
function d(e) {
return typeof e == "string" && (e = { message: e }), Object.assign(Error(e.message), e);
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/callPort.js
async function f(e, t, { timeout: n = 1e3, channelName: r = "", log: i = () => {}, newCallId: a = () => `call-${Date.now()}-${String(Math.random()).substring(2)}` } = {}) {
let o = a();
i && i("[callPort]", {
channelName: r,
callId: o,
params: t
});
let s, c, l = new Promise((t, i) => {
s = setTimeout(() => i(/* @__PURE__ */ Error(`Call timeout. CallId: "${o}".`)), n), c = (e) => {
e.data && e.data.channelName === r && e.data.callId === o && (e.data.type === "response:error" ? i(d(e.data.error)) : e.data.type === "response:result" && t(e.data.result));
}, e.addEventListener("message", c);
});
return l.finally(() => clearTimeout(s)), l.finally(() => e.removeEventListener("message", c)), e.postMessage({
type: "request",
channelName: r,
callId: o,
params: t
}), l;
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/recieveIterator.js
async function* p(t) {
let n, r = t(async ({ done: e = !0, value: t, error: r } = {}) => {
r ? await n.error(r) : e ? await n.complete() : await n.next(t);
});
yield* e((e) => (n = e, r));
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/listenPort.js
function m(e, t, { channelName: n = "", log: r = () => {} } = {}) {
let i = async function(i) {
if (!i.data || i.data.channelName !== n || i.data.type !== "request") return;
let { callId: a, params: o } = i.data;
r && r("[listenPort]", {
channelName: n,
callId: a,
params: o
});
let s, c, l;
try {
s = await t(o), l = "response:result";
} catch (e) {
c = u(e), l = "response:error";
}
e.postMessage({
callId: a,
channelName: n,
type: l,
result: s,
error: c
});
};
return e.addEventListener("message", i), () => e.removeEventListener("message", i);
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/recieve.js
async function* h(e, t = {}) {
let n, r = m(e, async ({ done: e, value: t, error: r }) => {
await n({
done: e,
value: t,
error: r
});
}, t);
try {
for (;;) yield p((e) => n = e);
} finally {
r && await r();
}
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/sendIterator.js
async function g(e, t) {
let n;
try {
for await (let n of t) await e({
done: !1,
value: n
});
} catch (e) {
n = e;
} finally {
await e({
done: !0,
error: n
});
}
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/send.js
async function _(e, t, n = {}) {
await g(async ({ done: t, value: r, error: i }) => {
await f(e, {
done: t,
value: r,
error: i
}, n);
}, t);
}
//#endregion
//#region node_modules/.pnpm/@statewalker+webrun-ports@0.4.0_eslint@10.12.0/node_modules/@statewalker/webrun-ports/src/ioSend.js
async function* v(e, t, n) {
for await (let r of h(e, n)) {
let i = _(e, t, n);
try {
yield* r;
} finally {
await i;
}
break;
}
}
//#endregion
//#region src/libs/serd.js
async function* y(e, t) {
for await (let n of t) yield e(n);
}
async function* b(e) {
yield* y(w, e);
}
async function* x(e) {
yield* y(T, e);
}
var S = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", C = typeof Uint8Array > "u" ? [] : /* @__PURE__ */ new Uint8Array(256);
for (let e = 0; e < 64; e++) C[S.charCodeAt(e)] = e;
function w(e) {
let t = new Uint8Array(e), n, r = t.length, i = "";
for (n = 0; n < r; n += 3) i += S[t[n] >> 2], i += S[(t[n] & 3) << 4 | t[n + 1] >> 4], i += S[(t[n + 1] & 15) << 2 | t[n + 2] >> 6], i += S[t[n + 2] & 63];
return r % 3 == 2 ? i = i.substring(0, i.length - 1) + "=" : r % 3 == 1 && (i = i.substring(0, i.length - 2) + "=="), i;
}
function T(e) {
let t = e.length * .75, n = e.length, r, i = 0, a, o, s, c;
e[e.length - 1] === "=" && (t--, e[e.length - 2] === "=" && t--);
let l = new ArrayBuffer(t), u = new Uint8Array(l);
for (r = 0; r < n; r += 4) a = C[e.charCodeAt(r)], o = C[e.charCodeAt(r + 1)], s = C[e.charCodeAt(r + 2)], c = C[e.charCodeAt(r + 3)], u[i++] = a << 2 | o >> 4, u[i++] = (o & 15) << 4 | s >> 2, u[i++] = (s & 3) << 6 | c & 63;
return u;
}
//#endregion
//#region src/api-client/newId.js
function E(e = "id-") {
return `${e}${Date.now()}-${String(Math.random()).substring(2)}`;
}
//#endregion
//#region src/api-client/initApi.js
async function D(e, { apiKey: n, callTimeout: i = 3e5, closeTimeout: a = 5e3 }) {
let [o, s] = t(), c = {}, u = {};
o(() => {
for (let { listener: e, removeListener: t } of Object.values(u)) typeof t == "function" && t(e);
u = {};
});
let d;
async function p() {
return d ||= f(e, {
method: "init",
args: [{
apiKey: n,
listeners: Object.entries(u).map(([e, { listenerMethodName: t }]) => [e, t])
}]
}, { timeout: i }), d;
}
async function h(t, ...n) {
return await p(), await f(e, {
method: t,
args: n
}, { timeout: i });
}
o(m(e, async ({ method: e, args: t } = {}) => {
if (e === "notifyListener") {
let [e, ...n] = t, { listener: r } = u[e] || {};
if (r) return await r(...n);
} else if (e === "reset") d = null, await p();
else throw Error(`Unknown method "${e}"}`);
}));
let { methods: g } = await p();
for (let t of g) {
let n = t.split("."), i;
if (t === "http.fetch") i = async (n, ...r) => {
n instanceof Request || (n = new Request(n, ...r));
let i = `channel-${Date.now()}-${String(Math.random()).substring(2)}`;
return h(t, n.url, { channelName: i }), await l((t) => x(v(e, b(t), { channelName: i })))(n);
};
else if (t.match(/\.on[A-Z]/)) {
async function e(e) {
let n = e.__id;
return delete e.__id, delete u[n], await h("removeListener", n, t);
}
async function n(n, ...r) {
let i = E("listener-");
return n.__id = i, u[i] = {
listener: n,
removeListener: e,
listenerMethodName: t
}, await h("addListener", i, t, ...r);
}
i = async (t) => (await n(t), o(() => e(t))), i.addListener = n, i.removeListener = e;
} else i = async (...e) => await h(t, ...e);
c = r(c, n, i);
}
return c.close = async () => {
s(), await h("done"), setTimeout(() => e.close(), a);
}, c;
}
//#endregion
//#region package.json
var O = "0.1.6", k = .1;
//#endregion
//#region src/api-client/openPortToExtension.js
function A(e) {
if (e.protocolVersion !== .1) {
let t = ["Incompatible version of the WebRun DevTools browser extension protocol."];
return e.protocolVersion ? (t.push(`The expected extension protocol version is ${e.protocolVersion}.`), e.extensionVersion && (t.push(`Try to use the client library version ${e.extensionVersion}.`), t.push(`For example: https://unpkg.com/@statewalker/webrun-devtools@${e.extensionVersion}.`))) : (t.push("Try to use the client library version 0.0.12."), t.push("For example: https://unpkg.com/@statewalker/webrun-devtools@0.0.12.")), Error(t.join("\n"));
}
}
async function j({ apiKey: e, timeout: t = 5e3 }) {
await new Promise((e) => {
let t = () => setTimeout(e, 10);
document.readyState === "complete" ? t() : document.addEventListener("DOMContentLoaded", t);
});
let n, r, i = new Promise((i, a) => {
n = setTimeout(() => a(/* @__PURE__ */ Error("Connection timeout. Please check that the WebRun DevTools browser extension is active.")), t);
let o = !1, s = E("call-");
function c() {
o || window.postMessage({
type: "connection-request",
apiKey: e,
callId: s,
protocolVersion: k,
clientApiVersion: O
}, "*");
}
r = (e) => {
if (e.source !== window) return;
let { data: t, ports: n } = e;
try {
if (t?.type === "extension-ready") c();
else if (t?.callId === s) {
if (o = !0, t?.type === "connection-error") a(Error(t.message));
else if (t.type === "connection-response") {
let e = A(t);
e ? a(e) : i(n[0]);
}
}
} catch (e) {
a(e), n[0] && n[0].close();
}
}, window.addEventListener("message", r), c();
});
i.finally(() => clearTimeout(n)), i.finally(() => r && window.removeEventListener("message", r));
let a = await i;
return a.start(), a;
}
//#endregion
//#region src/api-client/connectPageToExtension.js
async function M({ apiKey: e, timeout: t = 5e3, callTimeout: n = 3e5, closeTimeout: r = 5e3 }) {
return await D(await j({
apiKey: e,
timeout: t
}), {
apiKey: e,
callTimeout: n,
closeTimeout: r
});
}
//#endregion
//#region src/api-client/index.js
var N = M;
//#endregion
export { M as connectPageToExtension, N as default, D as initApi, t as newRegistry, j as openPortToExtension };