@mercuryworkshop/proxy-bootstrap 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bootstrap-server.js +24 -10
- package/dist/bootstrap-server.js.map +1 -1
- package/package.json +1 -1
package/dist/bootstrap-server.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as __WEBPACK_EXTERNAL_MODULE__mercuryworkshop_wisp_js_server_778dd5d9__ from "@mercuryworkshop/wisp-js/server";
|
|
2
2
|
import * as __WEBPACK_EXTERNAL_MODULE_fs_promises_400951f8__ from "fs/promises";
|
|
3
|
+
import * as __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__ from "node:path";
|
|
3
4
|
import * as __WEBPACK_EXTERNAL_MODULE_tar__ from "tar";
|
|
4
5
|
var __webpack_modules__ = ({
|
|
5
6
|
"./packages/scramjet/packages/bootstrap/src/common.ts":
|
|
@@ -59,11 +60,14 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
59
60
|
/* ESM import */var _mercuryworkshop_wisp_js_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @mercuryworkshop/wisp-js/server */ "@mercuryworkshop/wisp-js/server");
|
|
60
61
|
/* ESM import */var tar__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! tar */ "tar");
|
|
61
62
|
/* ESM import */var fs_promises__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! fs/promises */ "fs/promises");
|
|
62
|
-
/* ESM import */var
|
|
63
|
+
/* ESM import */var node_path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! node:path */ "node:path");
|
|
64
|
+
/* ESM import */var _common__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./common */ "./packages/scramjet/packages/bootstrap/src/common.ts");
|
|
63
65
|
|
|
64
66
|
|
|
65
67
|
|
|
66
68
|
|
|
69
|
+
|
|
70
|
+
const bootstrapRoot = import.meta.dirname;
|
|
67
71
|
let config;
|
|
68
72
|
async function sendFile(res, filePath, contentType) {
|
|
69
73
|
const data = await fs_promises__WEBPACK_IMPORTED_MODULE_2__["default"].readFile(filePath);
|
|
@@ -72,7 +76,7 @@ async function sendFile(res, filePath, contentType) {
|
|
|
72
76
|
});
|
|
73
77
|
res.end(data);
|
|
74
78
|
}
|
|
75
|
-
const clientdata = await fs_promises__WEBPACK_IMPORTED_MODULE_2__["default"].readFile(
|
|
79
|
+
const clientdata = await fs_promises__WEBPACK_IMPORTED_MODULE_2__["default"].readFile((0,node_path__WEBPACK_IMPORTED_MODULE_3__.join)(bootstrapRoot, "bootstrap-client.js"));
|
|
76
80
|
function routeRequest(req, res) {
|
|
77
81
|
if (!req.url) return false;
|
|
78
82
|
if (req.url === config.swPath) {
|
|
@@ -167,13 +171,13 @@ async function getDownloadedControllerVersion() {
|
|
|
167
171
|
async function updateScramjet(controllerMeta) {
|
|
168
172
|
const scramjetVersion = controllerMeta.dependencies["@mercuryworkshop/scramjet"];
|
|
169
173
|
console.log(`Fetching scramjet version: ${scramjetVersion}`);
|
|
170
|
-
const scramjetRes = await fetch(`${
|
|
174
|
+
const scramjetRes = await fetch(`${_common__WEBPACK_IMPORTED_MODULE_4__.REGISTRY_URL}${_common__WEBPACK_IMPORTED_MODULE_4__.SCRAMJET_PACKAGE_NAME}/${scramjetVersion}`);
|
|
171
175
|
const scramjetMeta = await scramjetRes.json();
|
|
172
176
|
await unpack(scramjetMeta.dist.tarball, "scramjet");
|
|
173
177
|
await unpack(controllerMeta.dist.tarball, "controller");
|
|
174
178
|
}
|
|
175
179
|
async function findLatestVersionOfPackage(packageName, majorVersion) {
|
|
176
|
-
const packageRes = await fetch(`${
|
|
180
|
+
const packageRes = await fetch(`${_common__WEBPACK_IMPORTED_MODULE_4__.REGISTRY_URL}${packageName}`);
|
|
177
181
|
const packageMeta = await packageRes.json();
|
|
178
182
|
const versions = Object.keys(packageMeta.versions).filter((v)=>v.startsWith(`${majorVersion}.`));
|
|
179
183
|
const sortedVersions = versions.sort((a, b)=>{
|
|
@@ -190,32 +194,32 @@ async function findLatestVersionOfPackage(packageName, majorVersion) {
|
|
|
190
194
|
throw new Error(`No versions found for package ${packageName} with major version ${majorVersion}`);
|
|
191
195
|
}
|
|
192
196
|
const latestVersion = sortedVersions[0];
|
|
193
|
-
const latestRes = await fetch(`${
|
|
197
|
+
const latestRes = await fetch(`${_common__WEBPACK_IMPORTED_MODULE_4__.REGISTRY_URL}${packageName}/${latestVersion}`);
|
|
194
198
|
const latestMeta = await latestRes.json();
|
|
195
199
|
return latestMeta;
|
|
196
200
|
}
|
|
197
201
|
async function bootstrap(cfg = {}) {
|
|
198
202
|
config = {
|
|
199
|
-
...
|
|
203
|
+
..._common__WEBPACK_IMPORTED_MODULE_4__.defaultConfig,
|
|
200
204
|
...cfg,
|
|
201
|
-
downloadedFilesDir:
|
|
205
|
+
downloadedFilesDir: (0,node_path__WEBPACK_IMPORTED_MODULE_3__.join)(bootstrapRoot, ".downloads") + "/"
|
|
202
206
|
};
|
|
203
207
|
const downloadedControllerVersion = await getDownloadedControllerVersion();
|
|
204
208
|
if (downloadedControllerVersion) {
|
|
205
209
|
console.log(`Found downloaded Scramjet Controller version: ${downloadedControllerVersion}`);
|
|
206
210
|
}
|
|
207
211
|
if (config.transport === "epoxy") {
|
|
208
|
-
const epoxyMeta = await findLatestVersionOfPackage(
|
|
212
|
+
const epoxyMeta = await findLatestVersionOfPackage(_common__WEBPACK_IMPORTED_MODULE_4__.EPOXY_TRANSPORT_PACKAGE_NAME, _common__WEBPACK_IMPORTED_MODULE_4__.EPOXY_TRANSPORT_PINNED_MAJOR_VERSION);
|
|
209
213
|
await unpack(epoxyMeta.dist.tarball, "epoxy-transport");
|
|
210
214
|
console.log(`Using Epoxy Transport version: ${epoxyMeta.version}`);
|
|
211
215
|
} else if (config.transport === "libcurl") {
|
|
212
|
-
const libcurlMeta = await findLatestVersionOfPackage(
|
|
216
|
+
const libcurlMeta = await findLatestVersionOfPackage(_common__WEBPACK_IMPORTED_MODULE_4__.LIBCURL_TRANSPORT_PACKAGE_NAME, _common__WEBPACK_IMPORTED_MODULE_4__.LIBCURL_TRANSPORT_PINNED_MAJOR_VERSION);
|
|
213
217
|
await unpack(libcurlMeta.dist.tarball, "libcurl-transport");
|
|
214
218
|
console.log(`Using libcurl Transport version: ${libcurlMeta.version}`);
|
|
215
219
|
} else {
|
|
216
220
|
throw new Error(`Unknown transport option: ${config.transport}`);
|
|
217
221
|
}
|
|
218
|
-
const controllerMeta = await findLatestVersionOfPackage(
|
|
222
|
+
const controllerMeta = await findLatestVersionOfPackage(_common__WEBPACK_IMPORTED_MODULE_4__.SCRAMJET_CONTROLLER_PACKAGE_NAME, _common__WEBPACK_IMPORTED_MODULE_4__.SCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION);
|
|
219
223
|
if (downloadedControllerVersion === controllerMeta.version) {
|
|
220
224
|
console.log(`Scramjet Controller is up to date (version: ${downloadedControllerVersion}), skipping download.`);
|
|
221
225
|
} else {
|
|
@@ -251,6 +255,16 @@ module.exports = __WEBPACK_EXTERNAL_MODULE__mercuryworkshop_wisp_js_server_778dd
|
|
|
251
255
|
module.exports = __WEBPACK_EXTERNAL_MODULE_fs_promises_400951f8__;
|
|
252
256
|
|
|
253
257
|
|
|
258
|
+
}),
|
|
259
|
+
"node:path":
|
|
260
|
+
/*!****************************!*\
|
|
261
|
+
!*** external "node:path" ***!
|
|
262
|
+
\****************************/
|
|
263
|
+
(function (module) {
|
|
264
|
+
|
|
265
|
+
module.exports = __WEBPACK_EXTERNAL_MODULE_node_path_c5b9b54f__;
|
|
266
|
+
|
|
267
|
+
|
|
254
268
|
}),
|
|
255
269
|
"tar":
|
|
256
270
|
/*!**********************!*\
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bootstrap-server.js","sources":["webpack://browser.js/./packages/scramjet/packages/bootstrap/src/common.ts","webpack://browser.js/./packages/scramjet/packages/bootstrap/src/server.ts","webpack://browser.js/webpack/runtime/async_module","webpack://browser.js/webpack/runtime/define_property_getters","webpack://browser.js/webpack/runtime/has_own_property","webpack://browser.js/webpack/runtime/make_namespace_object"],"sourcesContent":["export const REGISTRY_URL = \"https://registry.npmjs.org/\";\nexport const SCRAMJET_PACKAGE_NAME = \"@mercuryworkshop/scramjet\";\n\nexport const SCRAMJET_CONTROLLER_PACKAGE_NAME =\n\t\"@mercuryworkshop/scramjet-controller\";\nexport const SCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION = \"0\";\n\nexport const EPOXY_TRANSPORT_PACKAGE_NAME = \"@mercuryworkshop/epoxy-transport\";\nexport const EPOXY_TRANSPORT_PINNED_MAJOR_VERSION = \"3\";\n\nexport const LIBCURL_TRANSPORT_PACKAGE_NAME =\n\t\"@mercuryworkshop/libcurl-transport\";\nexport const LIBCURL_TRANSPORT_PINNED_MAJOR_VERSION = \"2\";\n\nexport type TransportOptions = \"epoxy\" | \"libcurl\" | \"bare\";\n\nexport type BootstrapOptions = {\n\ttransport: TransportOptions;\n\tswPath: string;\n\n\twispPath: string;\n\n\tscramjetBundlePath: string;\n\tscramjetWasmPath: string;\n\n\tepoxyClientPath: string;\n\tlibcurlClientPath: string;\n\tbareClientPath: string;\n\tscramjetControllerApiPath: string;\n\tscramjetControllerInjectPath: string;\n\tscramjetControllerSwPath: string;\n\n\tbootstrapApiPath: string;\n\tbootstrapInitPath: string;\n\n\tscramjetVersionPin?: string;\n\tscramjetControllerVersionPin?: string;\n\tepoxyTransportVersionPin?: string;\n\tlibcurlTransportVersionPin?: string;\n\tbareTransportVersionPin?: string;\n};\n\nexport const defaultConfig: Partial<BootstrapOptions> = {\n\ttransport: \"libcurl\",\n\tswPath: \"/sw.js\",\n\twispPath: \"/wisp/\",\n\n\tepoxyClientPath: \"/clients/epoxy-client.js\",\n\tlibcurlClientPath: \"/clients/libcurl-client.js\",\n\tbareClientPath: \"/clients/bare-client.js\",\n\tbootstrapInitPath: \"/bootstrap-init.js\",\n\n\tscramjetControllerApiPath: \"/controller/controller.api.js\",\n\tscramjetControllerInjectPath: \"/controller/controller.inject.js\",\n\tscramjetControllerSwPath: \"/controller/controller.sw.js\",\n\tscramjetBundlePath: \"/scram/scramjet.js\",\n\tscramjetWasmPath: \"/scram/scramjet.wasm\",\n};\n","import { server as wisp } from \"@mercuryworkshop/wisp-js/server\";\nimport http from \"http\";\nimport { extract } from \"tar\";\nimport { Readable } from \"stream\";\nimport fs from \"fs/promises\";\nimport {\n\tdefaultConfig,\n\tEPOXY_TRANSPORT_PACKAGE_NAME,\n\tEPOXY_TRANSPORT_PINNED_MAJOR_VERSION,\n\tLIBCURL_TRANSPORT_PACKAGE_NAME,\n\tLIBCURL_TRANSPORT_PINNED_MAJOR_VERSION,\n\tREGISTRY_URL,\n\tSCRAMJET_CONTROLLER_PACKAGE_NAME,\n\tSCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION,\n\tSCRAMJET_PACKAGE_NAME,\n\tBootstrapOptions,\n} from \"./common\";\n\ntype ServerBootstrapOptions = BootstrapOptions & {\n\tdownloadedFilesDir: string;\n};\n\nlet config: ServerBootstrapOptions;\n\nasync function sendFile(\n\tres: http.ServerResponse,\n\tfilePath: string,\n\tcontentType: string\n) {\n\tconst data = await fs.readFile(filePath);\n\tres.writeHead(200, { \"Content-Type\": contentType });\n\tres.end(data);\n}\nconst clientdata = await fs.readFile(\n\timport.meta.dirname + \"/bootstrap-client.js\"\n);\nfunction routeRequest(\n\treq: http.IncomingMessage,\n\tres: http.ServerResponse\n): boolean {\n\tif (!req.url) return false;\n\n\tif (req.url === config.swPath) {\n\t\tres.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n\t\tres.end(`importScripts(\"${config.scramjetControllerSwPath}\");\naddEventListener(\"fetch\", (e) => {\n\tif ($scramjetController.shouldRoute(e)) {\n\t\te.respondWith($scramjetController.route(e));\n\t}\n});\n`);\n\n\t\treturn true;\n\t} else if (req.url === config.bootstrapInitPath) {\n\t\tres.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n\t\tres.end(`async function initBootstrap() {\n\tconst { init } = await import(\"data:text/javascript;base64,${Buffer.from(clientdata).toString(\"base64\")}\");\n\treturn init(${JSON.stringify(config)});\n}`);\n\n\t\treturn true;\n\t}\n\n\tconst pathsToFiles = {\n\t\t[config.scramjetControllerApiPath]:\n\t\t\tconfig.downloadedFilesDir + \"controller/package/dist/controller.api.js\",\n\t\t[config.scramjetControllerInjectPath]:\n\t\t\tconfig.downloadedFilesDir +\n\t\t\t\"controller/package/dist/controller.inject.js\",\n\t\t[config.scramjetControllerSwPath]:\n\t\t\tconfig.downloadedFilesDir + \"controller/package/dist/controller.sw.js\",\n\t\t[config.scramjetBundlePath]:\n\t\t\tconfig.downloadedFilesDir + \"scramjet/package/dist/scramjet.js\",\n\t\t[config.scramjetWasmPath]:\n\t\t\tconfig.downloadedFilesDir + \"scramjet/package/dist/scramjet.wasm\",\n\n\t\t[config.libcurlClientPath]:\n\t\t\tconfig.downloadedFilesDir + \"libcurl-transport/package/dist/index.js\",\n\t};\n\tif (req.url in pathsToFiles) {\n\t\tconst filePath = pathsToFiles[req.url as keyof typeof pathsToFiles];\n\t\tconst contentType = req.url.endsWith(\".wasm\")\n\t\t\t? \"application/wasm\"\n\t\t\t: \"application/javascript\";\n\t\tsendFile(res, filePath, contentType);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction routeUpgrade(\n\treq: http.IncomingMessage,\n\tsocket: any,\n\thead: Buffer\n): boolean {\n\tif (!req.url) return false;\n\tif (!req.url.startsWith(\"/wisp/\")) return false;\n\n\twisp.routeRequest(req, socket, head);\n\treturn true;\n}\n\nexport async function unpack(tarball: string, name: string) {\n\tif (!name) throw new Error(\"no package name!\");\n\tconst response = await fetch(tarball);\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to download tarball: ${response.statusText}`);\n\t}\n\n\tconst arrayBuffer = await response.arrayBuffer();\n\tconst buffer = Buffer.from(arrayBuffer);\n\n\tawait fs.mkdir(config.downloadedFilesDir, { recursive: true });\n\tconst file = `${config.downloadedFilesDir}${name}.tgz`;\n\tawait fs.writeFile(file, buffer);\n\n\tconst packagedir = `${config.downloadedFilesDir}/${name}`;\n\n\tif (await fs.stat(packagedir).catch(() => false)) {\n\t\tawait fs.rm(packagedir, { recursive: true, force: true });\n\t}\n\tawait fs.mkdir(packagedir, { recursive: true });\n\n\ttry {\n\t\tawait extract({\n\t\t\tf: file,\n\t\t\tcwd: packagedir,\n\t\t});\n\t\tawait fs.unlink(file);\n\t} catch (err) {\n\t\tconsole.error(\"Error extracting tarball:\", err);\n\t\tawait fs.unlink(file);\n\t\tthrow err;\n\t}\n}\n\nasync function getDownloadedControllerVersion(): Promise<string | null> {\n\tconst packagedir = `${config.downloadedFilesDir}controller`;\n\tconsole.log(packagedir);\n\ttry {\n\t\tconst pkgJson = JSON.parse(\n\t\t\t(await fs.readFile(\n\t\t\t\t`${packagedir}/package/package.json`,\n\t\t\t\t\"utf-8\"\n\t\t\t)) as unknown as string\n\t\t);\n\t\treturn pkgJson.version;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function updateScramjet(controllerMeta: any) {\n\tconst scramjetVersion =\n\t\tcontrollerMeta.dependencies[\"@mercuryworkshop/scramjet\"];\n\n\tconsole.log(`Fetching scramjet version: ${scramjetVersion}`);\n\tconst scramjetRes = await fetch(\n\t\t`${REGISTRY_URL}${SCRAMJET_PACKAGE_NAME}/${scramjetVersion}`\n\t);\n\tconst scramjetMeta = await scramjetRes.json();\n\n\tawait unpack(scramjetMeta.dist.tarball, \"scramjet\");\n\tawait unpack(controllerMeta.dist.tarball, \"controller\");\n}\n\nexport async function findLatestVersionOfPackage(\n\tpackageName: string,\n\tmajorVersion: string\n): Promise<NodePackageMeta> {\n\tconst packageRes = await fetch(`${REGISTRY_URL}${packageName}`);\n\tconst packageMeta = await packageRes.json();\n\tconst versions = Object.keys(packageMeta.versions).filter((v) =>\n\t\tv.startsWith(`${majorVersion}.`)\n\t);\n\tconst sortedVersions = versions.sort((a, b) => {\n\t\tconst aParts = a.split(\".\").map(Number);\n\t\tconst bParts = b.split(\".\").map(Number);\n\t\tfor (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n\t\t\tconst aVal = aParts[i] || 0;\n\t\t\tconst bVal = bParts[i] || 0;\n\t\t\tif (aVal !== bVal) return bVal - aVal;\n\t\t}\n\t\treturn 0;\n\t});\n\tif (sortedVersions.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No versions found for package ${packageName} with major version ${majorVersion}`\n\t\t);\n\t}\n\tconst latestVersion = sortedVersions[0];\n\n\tconst latestRes = await fetch(\n\t\t`${REGISTRY_URL}${packageName}/${latestVersion}`\n\t);\n\tconst latestMeta = await latestRes.json();\n\treturn latestMeta;\n}\n\ntype NodePackageMeta = {\n\tname: string;\n\tversion: string;\n\tdist: {\n\t\ttarball: string;\n\t};\n\tdependencies: { [key: string]: string };\n};\n\nexport async function bootstrap(\n\tcfg: Partial<ServerBootstrapOptions> = {}\n): Promise<{\n\trouteRequest: typeof routeRequest;\n\trouteUpgrade: typeof routeUpgrade;\n}> {\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...cfg,\n\t\tdownloadedFilesDir: import.meta.dirname + \"/.downloads/\",\n\t} as ServerBootstrapOptions;\n\n\tconst downloadedControllerVersion = await getDownloadedControllerVersion();\n\tif (downloadedControllerVersion) {\n\t\tconsole.log(\n\t\t\t`Found downloaded Scramjet Controller version: ${downloadedControllerVersion}`\n\t\t);\n\t}\n\n\tif (config.transport === \"epoxy\") {\n\t\tconst epoxyMeta = await findLatestVersionOfPackage(\n\t\t\tEPOXY_TRANSPORT_PACKAGE_NAME,\n\t\t\tEPOXY_TRANSPORT_PINNED_MAJOR_VERSION\n\t\t);\n\t\tawait unpack(epoxyMeta.dist.tarball, \"epoxy-transport\");\n\t\tconsole.log(`Using Epoxy Transport version: ${epoxyMeta.version}`);\n\t} else if (config.transport === \"libcurl\") {\n\t\tconst libcurlMeta = await findLatestVersionOfPackage(\n\t\t\tLIBCURL_TRANSPORT_PACKAGE_NAME,\n\t\t\tLIBCURL_TRANSPORT_PINNED_MAJOR_VERSION\n\t\t);\n\t\tawait unpack(libcurlMeta.dist.tarball, \"libcurl-transport\");\n\t\tconsole.log(`Using libcurl Transport version: ${libcurlMeta.version}`);\n\t} else {\n\t\tthrow new Error(`Unknown transport option: ${config.transport}`);\n\t}\n\n\tconst controllerMeta = await findLatestVersionOfPackage(\n\t\tSCRAMJET_CONTROLLER_PACKAGE_NAME,\n\t\tSCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION\n\t);\n\n\tif (downloadedControllerVersion === controllerMeta.version) {\n\t\tconsole.log(\n\t\t\t`Scramjet Controller is up to date (version: ${downloadedControllerVersion}), skipping download.`\n\t\t);\n\t} else {\n\t\tawait updateScramjet(controllerMeta);\n\t\tconsole.log(\n\t\t\t`Downloaded Scramjet Controller version: ${controllerMeta.version}`\n\t\t);\n\t}\n\n\treturn {\n\t\trouteRequest,\n\t\trouteUpgrade,\n\t};\n}\n","var webpackQueues =\n\ttypeof Symbol === \"function\"\n\t\t? Symbol(\"webpack queues\")\n\t\t: \"__webpack_queues__\";\nvar webpackExports =\n\ttypeof Symbol === \"function\"\n\t\t? Symbol(\"webpack exports\")\n\t\t: \"__webpack_exports__\";\nvar webpackError =\n\ttypeof Symbol === \"function\" ? Symbol(\"webpack error\") : \"__webpack_error__\";\nvar resolveQueue = (queue) => {\n if (queue && queue.d < 1) {\n queue.d = 1;\n queue.forEach((fn) => (fn.r--));\n\t\tqueue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));\n\t}\n}\nvar wrapDeps = (deps) => {\n\treturn deps.map((dep) => {\n\t\tif (dep !== null && typeof dep === \"object\") {\n\t\t\tif (dep[webpackQueues]) return dep;\n\t\t\tif (dep.then) {\n\t\t\t\tvar queue = [];\n\t\t\t\tqueue.d = 0;\n\t\t\t\tdep.then((r) => {\n\t\t\t\t\tobj[webpackExports] = r;\n\t\t\t\t\tresolveQueue(queue);\n\t\t\t\t},(e) => {\n\t\t\t\t\tobj[webpackError] = e;\n\t\t\t\t\tresolveQueue(queue);\n\t\t\t\t});\n\t\t\t\tvar obj = {};\n\t\t\t\tobj[webpackQueues] = (fn) => (fn(queue));\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t}\n\t\tvar ret = {};\n\t\tret[webpackQueues] = function() {};\n\t\tret[webpackExports] = dep;\n\t\treturn ret;\n\t});\n};\n__webpack_require__.a = (module, body, hasAwait) => {\n\tvar queue;\n\thasAwait && ((queue = []).d = -1);\n\tvar depQueues = new Set();\n\tvar exports = module.exports;\n\tvar currentDeps;\n\tvar outerResolve;\n\tvar reject;\n\tvar promise = new Promise((resolve, rej) => {\n\t\treject = rej;\n\t\touterResolve = resolve;\n\t});\n\tpromise[webpackExports] = exports;\n\tpromise[webpackQueues] = (fn) => { queue && fn(queue), depQueues.forEach(fn), promise[\"catch\"](function() {}); };\n\tmodule.exports = promise;\n\tbody((deps) => {\n\t\tcurrentDeps = wrapDeps(deps);\n\t\tvar fn;\n\t\tvar getResult = () => {\n\t\t\treturn currentDeps.map((d) => {\n\t\t\t\tif (d[webpackError]) throw d[webpackError];\n\t\t\t\treturn d[webpackExports];\n\t\t\t});\n\t\t}\n\t\tvar promise = new Promise((resolve) => {\n\t\t\tfn = () => (resolve(getResult));\n\t\t\tfn.r = 0;\n\t\t\tvar fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));\n\t\t\tcurrentDeps.map((dep) => (dep[webpackQueues](fnQueue)));\n\t\t});\n\t\treturn fn.r ? promise : getResult();\n\t}, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)));\n\tqueue && queue.d < 0 && (queue.d = 0);\n};","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["REGISTRY_URL","SCRAMJET_PACKAGE_NAME","SCRAMJET_CONTROLLER_PACKAGE_NAME","SCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION","EPOXY_TRANSPORT_PACKAGE_NAME","EPOXY_TRANSPORT_PINNED_MAJOR_VERSION","LIBCURL_TRANSPORT_PACKAGE_NAME","LIBCURL_TRANSPORT_PINNED_MAJOR_VERSION","defaultConfig","server","wisp","extract","fs","config","sendFile","res","filePath","contentType","data","clientdata","routeRequest","req","Buffer","JSON","pathsToFiles","routeUpgrade","socket","head","unpack","tarball","name","Error","response","fetch","arrayBuffer","buffer","file","packagedir","err","console","getDownloadedControllerVersion","pkgJson","updateScramjet","controllerMeta","scramjetVersion","scramjetRes","scramjetMeta","findLatestVersionOfPackage","packageName","majorVersion","packageRes","packageMeta","versions","Object","v","sortedVersions","a","b","aParts","Number","bParts","i","Math","aVal","bVal","latestVersion","latestRes","latestMeta","bootstrap","cfg","downloadedControllerVersion","epoxyMeta","libcurlMeta"],"mappings":"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AAImE,gCAAgC3B,eAAe,OAAO,EAAE;QAC3DJ,QAAQ,GAAG,CACV,CAAC,4CAA4C,EAAE+B,4BAA4B,qBAAqB,CAAC;IAEnG,OAAO;QACN,MAAM5B,eAAeC;QACrBJ,QAAQ,GAAG,CACV,CAAC,wCAAwC,EAAEI,eAAe,OAAO,EAAE;IAErE;IAEA,OAAO;QACNvB;QACAK;IACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,oCAAoC,yEAAyE;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;AACF;AACA,E;;;;AC3EA;AACA;AACA;AACA,kDAAkD,wCAAwC;AAC1F;AACA;AACA,E;;;;ACNA,wF;;;;ACAA;AACA;AACA;AACA,uDAAuD,iBAAiB;AACxE;AACA,gDAAgD,aAAa;AAC7D,E"}
|
|
1
|
+
{"version":3,"file":"bootstrap-server.js","sources":["webpack://browser.js/./packages/scramjet/packages/bootstrap/src/common.ts","webpack://browser.js/./packages/scramjet/packages/bootstrap/src/server.ts","webpack://browser.js/webpack/runtime/async_module","webpack://browser.js/webpack/runtime/define_property_getters","webpack://browser.js/webpack/runtime/has_own_property","webpack://browser.js/webpack/runtime/make_namespace_object"],"sourcesContent":["export const REGISTRY_URL = \"https://registry.npmjs.org/\";\nexport const SCRAMJET_PACKAGE_NAME = \"@mercuryworkshop/scramjet\";\n\nexport const SCRAMJET_CONTROLLER_PACKAGE_NAME =\n\t\"@mercuryworkshop/scramjet-controller\";\nexport const SCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION = \"0\";\n\nexport const EPOXY_TRANSPORT_PACKAGE_NAME = \"@mercuryworkshop/epoxy-transport\";\nexport const EPOXY_TRANSPORT_PINNED_MAJOR_VERSION = \"3\";\n\nexport const LIBCURL_TRANSPORT_PACKAGE_NAME =\n\t\"@mercuryworkshop/libcurl-transport\";\nexport const LIBCURL_TRANSPORT_PINNED_MAJOR_VERSION = \"2\";\n\nexport type TransportOptions = \"epoxy\" | \"libcurl\" | \"bare\";\n\nexport type BootstrapOptions = {\n\ttransport: TransportOptions;\n\tswPath: string;\n\n\twispPath: string;\n\n\tscramjetBundlePath: string;\n\tscramjetWasmPath: string;\n\n\tepoxyClientPath: string;\n\tlibcurlClientPath: string;\n\tbareClientPath: string;\n\tscramjetControllerApiPath: string;\n\tscramjetControllerInjectPath: string;\n\tscramjetControllerSwPath: string;\n\n\tbootstrapApiPath: string;\n\tbootstrapInitPath: string;\n\n\tscramjetVersionPin?: string;\n\tscramjetControllerVersionPin?: string;\n\tepoxyTransportVersionPin?: string;\n\tlibcurlTransportVersionPin?: string;\n\tbareTransportVersionPin?: string;\n};\n\nexport const defaultConfig: Partial<BootstrapOptions> = {\n\ttransport: \"libcurl\",\n\tswPath: \"/sw.js\",\n\twispPath: \"/wisp/\",\n\n\tepoxyClientPath: \"/clients/epoxy-client.js\",\n\tlibcurlClientPath: \"/clients/libcurl-client.js\",\n\tbareClientPath: \"/clients/bare-client.js\",\n\tbootstrapInitPath: \"/bootstrap-init.js\",\n\n\tscramjetControllerApiPath: \"/controller/controller.api.js\",\n\tscramjetControllerInjectPath: \"/controller/controller.inject.js\",\n\tscramjetControllerSwPath: \"/controller/controller.sw.js\",\n\tscramjetBundlePath: \"/scram/scramjet.js\",\n\tscramjetWasmPath: \"/scram/scramjet.wasm\",\n};\n","import { server as wisp } from \"@mercuryworkshop/wisp-js/server\";\nimport http from \"http\";\nimport { extract } from \"tar\";\nimport { Readable } from \"stream\";\nimport fs from \"fs/promises\";\nimport { join } from \"node:path\";\nimport {\n\tdefaultConfig,\n\tEPOXY_TRANSPORT_PACKAGE_NAME,\n\tEPOXY_TRANSPORT_PINNED_MAJOR_VERSION,\n\tLIBCURL_TRANSPORT_PACKAGE_NAME,\n\tLIBCURL_TRANSPORT_PINNED_MAJOR_VERSION,\n\tREGISTRY_URL,\n\tSCRAMJET_CONTROLLER_PACKAGE_NAME,\n\tSCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION,\n\tSCRAMJET_PACKAGE_NAME,\n\tBootstrapOptions,\n} from \"./common\";\n\nconst bootstrapRoot = import.meta.dirname;\n\ntype ServerBootstrapOptions = BootstrapOptions & {\n\tdownloadedFilesDir: string;\n};\n\nlet config: ServerBootstrapOptions;\n\nasync function sendFile(\n\tres: http.ServerResponse,\n\tfilePath: string,\n\tcontentType: string\n) {\n\tconst data = await fs.readFile(filePath);\n\tres.writeHead(200, { \"Content-Type\": contentType });\n\tres.end(data);\n}\nconst clientdata = await fs.readFile(\n\tjoin(bootstrapRoot, \"bootstrap-client.js\")\n);\nfunction routeRequest(\n\treq: http.IncomingMessage,\n\tres: http.ServerResponse\n): boolean {\n\tif (!req.url) return false;\n\n\tif (req.url === config.swPath) {\n\t\tres.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n\t\tres.end(`importScripts(\"${config.scramjetControllerSwPath}\");\naddEventListener(\"fetch\", (e) => {\n\tif ($scramjetController.shouldRoute(e)) {\n\t\te.respondWith($scramjetController.route(e));\n\t}\n});\n`);\n\n\t\treturn true;\n\t} else if (req.url === config.bootstrapInitPath) {\n\t\tres.writeHead(200, { \"Content-Type\": \"application/javascript\" });\n\t\tres.end(`async function initBootstrap() {\n\tconst { init } = await import(\"data:text/javascript;base64,${Buffer.from(clientdata).toString(\"base64\")}\");\n\treturn init(${JSON.stringify(config)});\n}`);\n\n\t\treturn true;\n\t}\n\n\tconst pathsToFiles = {\n\t\t[config.scramjetControllerApiPath]:\n\t\t\tconfig.downloadedFilesDir + \"controller/package/dist/controller.api.js\",\n\t\t[config.scramjetControllerInjectPath]:\n\t\t\tconfig.downloadedFilesDir +\n\t\t\t\"controller/package/dist/controller.inject.js\",\n\t\t[config.scramjetControllerSwPath]:\n\t\t\tconfig.downloadedFilesDir + \"controller/package/dist/controller.sw.js\",\n\t\t[config.scramjetBundlePath]:\n\t\t\tconfig.downloadedFilesDir + \"scramjet/package/dist/scramjet.js\",\n\t\t[config.scramjetWasmPath]:\n\t\t\tconfig.downloadedFilesDir + \"scramjet/package/dist/scramjet.wasm\",\n\n\t\t[config.libcurlClientPath]:\n\t\t\tconfig.downloadedFilesDir + \"libcurl-transport/package/dist/index.js\",\n\t};\n\tif (req.url in pathsToFiles) {\n\t\tconst filePath = pathsToFiles[req.url as keyof typeof pathsToFiles];\n\t\tconst contentType = req.url.endsWith(\".wasm\")\n\t\t\t? \"application/wasm\"\n\t\t\t: \"application/javascript\";\n\t\tsendFile(res, filePath, contentType);\n\t\treturn true;\n\t}\n\n\treturn false;\n}\n\nfunction routeUpgrade(\n\treq: http.IncomingMessage,\n\tsocket: any,\n\thead: Buffer\n): boolean {\n\tif (!req.url) return false;\n\tif (!req.url.startsWith(\"/wisp/\")) return false;\n\n\twisp.routeRequest(req, socket, head);\n\treturn true;\n}\n\nexport async function unpack(tarball: string, name: string) {\n\tif (!name) throw new Error(\"no package name!\");\n\tconst response = await fetch(tarball);\n\tif (!response.ok) {\n\t\tthrow new Error(`Failed to download tarball: ${response.statusText}`);\n\t}\n\n\tconst arrayBuffer = await response.arrayBuffer();\n\tconst buffer = Buffer.from(arrayBuffer);\n\n\tawait fs.mkdir(config.downloadedFilesDir, { recursive: true });\n\tconst file = `${config.downloadedFilesDir}${name}.tgz`;\n\tawait fs.writeFile(file, buffer);\n\n\tconst packagedir = `${config.downloadedFilesDir}/${name}`;\n\n\tif (await fs.stat(packagedir).catch(() => false)) {\n\t\tawait fs.rm(packagedir, { recursive: true, force: true });\n\t}\n\tawait fs.mkdir(packagedir, { recursive: true });\n\n\ttry {\n\t\tawait extract({\n\t\t\tf: file,\n\t\t\tcwd: packagedir,\n\t\t});\n\t\tawait fs.unlink(file);\n\t} catch (err) {\n\t\tconsole.error(\"Error extracting tarball:\", err);\n\t\tawait fs.unlink(file);\n\t\tthrow err;\n\t}\n}\n\nasync function getDownloadedControllerVersion(): Promise<string | null> {\n\tconst packagedir = `${config.downloadedFilesDir}controller`;\n\tconsole.log(packagedir);\n\ttry {\n\t\tconst pkgJson = JSON.parse(\n\t\t\t(await fs.readFile(\n\t\t\t\t`${packagedir}/package/package.json`,\n\t\t\t\t\"utf-8\"\n\t\t\t)) as unknown as string\n\t\t);\n\t\treturn pkgJson.version;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\nasync function updateScramjet(controllerMeta: any) {\n\tconst scramjetVersion =\n\t\tcontrollerMeta.dependencies[\"@mercuryworkshop/scramjet\"];\n\n\tconsole.log(`Fetching scramjet version: ${scramjetVersion}`);\n\tconst scramjetRes = await fetch(\n\t\t`${REGISTRY_URL}${SCRAMJET_PACKAGE_NAME}/${scramjetVersion}`\n\t);\n\tconst scramjetMeta = await scramjetRes.json();\n\n\tawait unpack(scramjetMeta.dist.tarball, \"scramjet\");\n\tawait unpack(controllerMeta.dist.tarball, \"controller\");\n}\n\nexport async function findLatestVersionOfPackage(\n\tpackageName: string,\n\tmajorVersion: string\n): Promise<NodePackageMeta> {\n\tconst packageRes = await fetch(`${REGISTRY_URL}${packageName}`);\n\tconst packageMeta = await packageRes.json();\n\tconst versions = Object.keys(packageMeta.versions).filter((v) =>\n\t\tv.startsWith(`${majorVersion}.`)\n\t);\n\tconst sortedVersions = versions.sort((a, b) => {\n\t\tconst aParts = a.split(\".\").map(Number);\n\t\tconst bParts = b.split(\".\").map(Number);\n\t\tfor (let i = 0; i < Math.max(aParts.length, bParts.length); i++) {\n\t\t\tconst aVal = aParts[i] || 0;\n\t\t\tconst bVal = bParts[i] || 0;\n\t\t\tif (aVal !== bVal) return bVal - aVal;\n\t\t}\n\t\treturn 0;\n\t});\n\tif (sortedVersions.length === 0) {\n\t\tthrow new Error(\n\t\t\t`No versions found for package ${packageName} with major version ${majorVersion}`\n\t\t);\n\t}\n\tconst latestVersion = sortedVersions[0];\n\n\tconst latestRes = await fetch(\n\t\t`${REGISTRY_URL}${packageName}/${latestVersion}`\n\t);\n\tconst latestMeta = await latestRes.json();\n\treturn latestMeta;\n}\n\ntype NodePackageMeta = {\n\tname: string;\n\tversion: string;\n\tdist: {\n\t\ttarball: string;\n\t};\n\tdependencies: { [key: string]: string };\n};\n\nexport async function bootstrap(\n\tcfg: Partial<ServerBootstrapOptions> = {}\n): Promise<{\n\trouteRequest: typeof routeRequest;\n\trouteUpgrade: typeof routeUpgrade;\n}> {\n\tconfig = {\n\t\t...defaultConfig,\n\t\t...cfg,\n\t\tdownloadedFilesDir: join(bootstrapRoot, \".downloads\") + \"/\",\n\t} as ServerBootstrapOptions;\n\n\tconst downloadedControllerVersion = await getDownloadedControllerVersion();\n\tif (downloadedControllerVersion) {\n\t\tconsole.log(\n\t\t\t`Found downloaded Scramjet Controller version: ${downloadedControllerVersion}`\n\t\t);\n\t}\n\n\tif (config.transport === \"epoxy\") {\n\t\tconst epoxyMeta = await findLatestVersionOfPackage(\n\t\t\tEPOXY_TRANSPORT_PACKAGE_NAME,\n\t\t\tEPOXY_TRANSPORT_PINNED_MAJOR_VERSION\n\t\t);\n\t\tawait unpack(epoxyMeta.dist.tarball, \"epoxy-transport\");\n\t\tconsole.log(`Using Epoxy Transport version: ${epoxyMeta.version}`);\n\t} else if (config.transport === \"libcurl\") {\n\t\tconst libcurlMeta = await findLatestVersionOfPackage(\n\t\t\tLIBCURL_TRANSPORT_PACKAGE_NAME,\n\t\t\tLIBCURL_TRANSPORT_PINNED_MAJOR_VERSION\n\t\t);\n\t\tawait unpack(libcurlMeta.dist.tarball, \"libcurl-transport\");\n\t\tconsole.log(`Using libcurl Transport version: ${libcurlMeta.version}`);\n\t} else {\n\t\tthrow new Error(`Unknown transport option: ${config.transport}`);\n\t}\n\n\tconst controllerMeta = await findLatestVersionOfPackage(\n\t\tSCRAMJET_CONTROLLER_PACKAGE_NAME,\n\t\tSCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION\n\t);\n\n\tif (downloadedControllerVersion === controllerMeta.version) {\n\t\tconsole.log(\n\t\t\t`Scramjet Controller is up to date (version: ${downloadedControllerVersion}), skipping download.`\n\t\t);\n\t} else {\n\t\tawait updateScramjet(controllerMeta);\n\t\tconsole.log(\n\t\t\t`Downloaded Scramjet Controller version: ${controllerMeta.version}`\n\t\t);\n\t}\n\n\treturn {\n\t\trouteRequest,\n\t\trouteUpgrade,\n\t};\n}\n","var webpackQueues =\n\ttypeof Symbol === \"function\"\n\t\t? Symbol(\"webpack queues\")\n\t\t: \"__webpack_queues__\";\nvar webpackExports =\n\ttypeof Symbol === \"function\"\n\t\t? Symbol(\"webpack exports\")\n\t\t: \"__webpack_exports__\";\nvar webpackError =\n\ttypeof Symbol === \"function\" ? Symbol(\"webpack error\") : \"__webpack_error__\";\nvar resolveQueue = (queue) => {\n if (queue && queue.d < 1) {\n queue.d = 1;\n queue.forEach((fn) => (fn.r--));\n\t\tqueue.forEach((fn) => (fn.r-- ? fn.r++ : fn()));\n\t}\n}\nvar wrapDeps = (deps) => {\n\treturn deps.map((dep) => {\n\t\tif (dep !== null && typeof dep === \"object\") {\n\t\t\tif (dep[webpackQueues]) return dep;\n\t\t\tif (dep.then) {\n\t\t\t\tvar queue = [];\n\t\t\t\tqueue.d = 0;\n\t\t\t\tdep.then((r) => {\n\t\t\t\t\tobj[webpackExports] = r;\n\t\t\t\t\tresolveQueue(queue);\n\t\t\t\t},(e) => {\n\t\t\t\t\tobj[webpackError] = e;\n\t\t\t\t\tresolveQueue(queue);\n\t\t\t\t});\n\t\t\t\tvar obj = {};\n\t\t\t\tobj[webpackQueues] = (fn) => (fn(queue));\n\t\t\t\treturn obj;\n\t\t\t}\n\t\t}\n\t\tvar ret = {};\n\t\tret[webpackQueues] = function() {};\n\t\tret[webpackExports] = dep;\n\t\treturn ret;\n\t});\n};\n__webpack_require__.a = (module, body, hasAwait) => {\n\tvar queue;\n\thasAwait && ((queue = []).d = -1);\n\tvar depQueues = new Set();\n\tvar exports = module.exports;\n\tvar currentDeps;\n\tvar outerResolve;\n\tvar reject;\n\tvar promise = new Promise((resolve, rej) => {\n\t\treject = rej;\n\t\touterResolve = resolve;\n\t});\n\tpromise[webpackExports] = exports;\n\tpromise[webpackQueues] = (fn) => { queue && fn(queue), depQueues.forEach(fn), promise[\"catch\"](function() {}); };\n\tmodule.exports = promise;\n\tbody((deps) => {\n\t\tcurrentDeps = wrapDeps(deps);\n\t\tvar fn;\n\t\tvar getResult = () => {\n\t\t\treturn currentDeps.map((d) => {\n\t\t\t\tif (d[webpackError]) throw d[webpackError];\n\t\t\t\treturn d[webpackExports];\n\t\t\t});\n\t\t}\n\t\tvar promise = new Promise((resolve) => {\n\t\t\tfn = () => (resolve(getResult));\n\t\t\tfn.r = 0;\n\t\t\tvar fnQueue = (q) => (q !== queue && !depQueues.has(q) && (depQueues.add(q), q && !q.d && (fn.r++, q.push(fn))));\n\t\t\tcurrentDeps.map((dep) => (dep[webpackQueues](fnQueue)));\n\t\t});\n\t\treturn fn.r ? promise : getResult();\n\t}, (err) => ((err ? reject(promise[webpackError] = err) : outerResolve(exports)), resolveQueue(queue)));\n\tqueue && queue.d < 0 && (queue.d = 0);\n};","__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n }\n }\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};"],"names":["REGISTRY_URL","SCRAMJET_PACKAGE_NAME","SCRAMJET_CONTROLLER_PACKAGE_NAME","SCRAMJET_CONTROLLER_PINNED_MAJOR_VERSION","EPOXY_TRANSPORT_PACKAGE_NAME","EPOXY_TRANSPORT_PINNED_MAJOR_VERSION","LIBCURL_TRANSPORT_PACKAGE_NAME","LIBCURL_TRANSPORT_PINNED_MAJOR_VERSION","defaultConfig","server","wisp","extract","fs","join","bootstrapRoot","config","sendFile","res","filePath","contentType","data","clientdata","routeRequest","req","Buffer","JSON","pathsToFiles","routeUpgrade","socket","head","unpack","tarball","name","Error","response","fetch","arrayBuffer","buffer","file","packagedir","err","console","getDownloadedControllerVersion","pkgJson","updateScramjet","controllerMeta","scramjetVersion","scramjetRes","scramjetMeta","findLatestVersionOfPackage","packageName","majorVersion","packageRes","packageMeta","versions","Object","v","sortedVersions","a","b","aParts","Number","bParts","i","Math","aVal","bVal","latestVersion","latestRes","latestMeta","bootstrap","cfg","downloadedControllerVersion","epoxyMeta","libcurlMeta"],"mappings":"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MAAM8B,iBAAiB,MAAMI,2BAC5B/C,qEAAgCA,EAChCC,6EAAwCA;IAGzC,IAAIqE,gCAAgC3B,eAAe,OAAO,EAAE;QAC3DJ,QAAQ,GAAG,CACV,CAAC,4CAA4C,EAAE+B,4BAA4B,qBAAqB,CAAC;IAEnG,OAAO;QACN,MAAM5B,eAAeC;QACrBJ,QAAQ,GAAG,CACV,CAAC,wCAAwC,EAAEI,eAAe,OAAO,EAAE;IAErE;IAEA,OAAO;QACNvB;QACAK;IACD;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA,KAAK;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EAAE;AACF;AACA,oCAAoC,yEAAyE;AAC7G;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,IAAI;AACJ;AACA;AACA;AACA;AACA;AACA;AACA,GAAG;AACH;AACA,EAAE;AACF;AACA,E;;;;AC3EA;AACA;AACA;AACA,kDAAkD,wCAAwC;AAC1F;AACA;AACA,E;;;;ACNA,wF;;;;ACAA;AACA;AACA;AACA,uDAAuD,iBAAiB;AACxE;AACA,gDAAgD,aAAa;AAC7D,E"}
|