@bunny.net/edgescript-sdk
Version:
429 lines (415 loc) • 11.8 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/lib.ts
var lib_exports = {};
__export(lib_exports, {
net: () => net_exports
});
module.exports = __toCommonJS(lib_exports);
// src/net/index.ts
var net_exports = {};
__export(net_exports, {
http: () => serve_exports,
ip: () => ip_exports,
socketAddr: () => socket_addr_exports,
tcp: () => tcp_exports
});
// src/net/tcp.ts
var tcp_exports = {};
__export(tcp_exports, {
bind: () => bind,
isTcpListener: () => isTcpListener,
toString: () => toString2,
unstable_local_addr: () => unstable_local_addr,
unstable_new: () => unstable_new
});
// src/platform.ts
var normalizePlatform = (platform) => {
platform = platform.toLowerCase();
if (platform.includes("ios")) return "iOS";
if (platform === "android") return "Android";
if (platform === "darwin") return "MacOS";
if (platform === "win32") return "Windows";
if (platform === "freebsd") return "FreeBSD";
if (platform === "openbsd") return "OpenBSD";
if (platform === "linux") return "Linux";
if (platform) return `Other:${platform}`;
return "Unknown";
};
var internal_getPlatform = () => {
if (typeof Bunny !== "undefined") {
return {
_tag: "_Platform",
version: "0.12.0",
name: "Unknown",
runtime: "bunny",
runtime_version: "unknown"
};
}
if (typeof Deno !== "undefined" && Deno.build != null) {
return {
_tag: "_Platform",
version: "0.12.0",
name: normalizePlatform(Deno.build.os),
runtime: "deno",
runtime_version: typeof Deno.version === "string" ? Deno.version : Deno.version?.deno ?? "unknown"
};
}
const process = globalThis.process;
if (Object.prototype.toString.call(
typeof process !== "undefined" ? process : 0
) === "[object process]") {
return {
_tag: "_Platform",
version: "0.12.0",
name: normalizePlatform(process.platform),
runtime: "node",
runtime_version: process.version
};
}
return {
_tag: "_Platform",
version: "0.12.0",
name: "Unknown",
runtime: "unknown",
runtime_version: "unknown"
};
};
// src/net/socket_addr.ts
var socket_addr_exports = {};
__export(socket_addr_exports, {
InvalidAddr: () => InvalidAddr,
isV4: () => isV4,
v4: () => v4_exports
});
// src/net/socket/v4.ts
var v4_exports = {};
__export(v4_exports, {
ip: () => ip,
port: () => port,
tryFromString: () => tryFromString
});
// src/net/ip.ts
var ip_exports = {};
__export(ip_exports, {
toString: () => toString,
tryParseFromString: () => tryParseFromString
});
function toString(ip2) {
return `${ip2[0]}.${ip2[1]}.${ip2[2]}.${ip2[3]}`;
}
function tryParseFromString(ip2) {
const parts = ip2.split(".").map(Number);
if (parts.length !== 4 || parts.some((part) => isNaN(part) || part < 0 || part > 255)) {
return new SyntaxError("Invalid IP address");
}
return [parts[0], parts[1], parts[2], parts[3]];
}
// src/net/socket/v4.ts
function port(addr) {
return addr.port;
}
function ip(addr) {
return addr.ip;
}
function tryFromString(value) {
const parts = value.split(":");
if (parts.length !== 2) {
return new SyntaxError("Invalid SocketAddrV4 address");
}
const ip2 = tryParseFromString(parts[0]);
if (ip2 instanceof SyntaxError) {
return ip2;
}
const port2 = Number(parts[1]);
if (isNaN(port2) || port2 < 0 || port2 > 65535) {
return new SyntaxError("Invalid Port");
}
return {
_tag: "SocketAddrV4",
port: port2,
ip: ip2
};
}
// src/net/socket_addr.ts
function isV4(value) {
return value._tag === "SocketAddrV4";
}
var addr_symbol = Symbol("invalidAddr");
var InvalidAddr = class extends Error {
_guard = addr_symbol;
constructor(message) {
super(message);
this.name = "InvalidAddr";
}
toString() {
return `${this.name}: ${this.message}`;
}
};
// src/net/tcp.ts
function isTcpListener(value) {
return value instanceof Object && value["_tag"] === "TcpListener";
}
function unstable_local_addr(tcp) {
return tcp.addr;
}
function toString2(tcp) {
switch (tcp.addr._tag) {
case "SocketAddrV4":
return `${v4_exports.ip(tcp.addr).join(".")}:${v4_exports.port(tcp.addr)}`;
case "NoAddr":
return "No addr associated to this listener. You should be running in a controlled environment.";
}
}
function unstable_new() {
const platform = internal_getPlatform();
switch (platform.runtime) {
case "bunny": {
return {
_tag: "TcpListener",
addr: {
_tag: "NoAddr"
}
};
}
default:
return {
_tag: "TcpListener",
addr: {
_tag: "SocketAddrV4",
port: 8080,
ip: [127, 0, 0, 1]
}
};
}
}
function bind(addr) {
return {
_tag: "TcpListener",
addr
};
}
// src/net/serve.ts
var serve_exports = {};
__export(serve_exports, {
serve: () => serve2,
servePullZone: () => servePullZone
});
// src/net/_impl/node/serve.ts
var HonoNode = __toESM(require("@hono/node-server"));
var import_hono = require("hono");
function node_serve(listener, handler) {
const addr = unstable_local_addr(listener);
if (!isV4(addr)) {
throw new Error("An issue happened with the addr.");
}
const port2 = v4_exports.port(addr);
const hostname = toString(v4_exports.ip(addr));
const app = new import_hono.Hono();
app.all("*", (c) => {
return handler(c.req.raw);
});
HonoNode.serve({
fetch: app.fetch,
hostname,
port: port2
});
return {};
}
// src/net/serve.ts
function isResponse(value) {
return value instanceof Response;
}
function isRequest(value) {
return value instanceof Request;
}
function is_port_and_hostname(value) {
if (typeof value === "object" && value !== null) {
const port2 = value["port"];
return port2 !== void 0 && typeof port2 === "number" && value["hostname"] !== void 0;
}
return false;
}
function serve2(listener, handler) {
let raw_handler;
let raw_listener;
if (is_port_and_hostname(listener)) {
const addr = v4_exports.tryFromString(
`${listener.hostname}:${listener.port}`
);
if (addr instanceof Error) {
throw addr;
}
raw_listener = bind(addr);
raw_handler = handler;
} else if (isTcpListener(listener)) {
raw_handler = handler;
raw_listener = listener;
} else {
raw_handler = listener;
raw_listener = unstable_new();
}
if (raw_handler === void 0) {
throw new Error("An issue happened.");
}
const platform = internal_getPlatform();
switch (platform.runtime) {
case "bunny": {
Bunny.v1.serve(raw_handler);
return {};
}
case "node": {
return node_serve(raw_listener, raw_handler);
}
case "deno": {
const addr = unstable_local_addr(raw_listener);
if (!isV4(addr)) {
throw new Error("An issue happened with the addr.");
}
const port2 = v4_exports.port(addr);
const hostname = toString(v4_exports.ip(addr));
Deno.serve({ port: port2, hostname }, raw_handler);
return {};
}
case "unknown": {
return {};
}
}
}
function servePullZone(listener, options) {
let raw_listener;
let raw_options = {
url: "https://bunny.net"
};
if (options) {
raw_options = options;
}
if (is_port_and_hostname(listener)) {
const addr = v4_exports.tryFromString(
`${listener.hostname}:${listener.port}`
);
if (addr instanceof Error) {
throw addr;
}
raw_listener = bind(addr);
} else if (isTcpListener(listener)) {
raw_listener = listener;
} else {
if (listener) {
raw_options = listener;
}
raw_listener = unstable_new();
}
const onOriginRequestMiddleware = [];
const onOriginResponseMiddleware = [];
const platform = internal_getPlatform();
switch (platform.runtime) {
case "bunny": {
Bunny.v1.registerMiddlewares({
onOriginRequest: onOriginRequestMiddleware,
onOriginResponse: onOriginResponseMiddleware
});
break;
}
default: {
const middlewareHandler = async (req) => {
const url = new URL(req.url);
const origin_url = new URL(raw_options.url);
url.protocol = origin_url.protocol;
url.hostname = origin_url.hostname;
url.port = origin_url.port;
let mutableRequest = new Request(
url,
req
);
for (const [_, mid] of onOriginRequestMiddleware.entries()) {
const reqOrResponse = await mid({ request: mutableRequest });
if (isResponse(reqOrResponse)) {
return reqOrResponse;
}
if (isRequest(reqOrResponse)) {
mutableRequest = reqOrResponse;
}
}
const prevResponse = await fetch(mutableRequest);
const headers = new Headers();
for (const [key, value] of prevResponse.headers.entries()) {
headers.set(key, value);
}
let response;
switch (platform.runtime) {
case "node": {
if (headers.get("content-type") === "text/html" && prevResponse.body !== null) {
const body = await prevResponse.text();
headers.delete("content-encoding");
response = new Response(body, { headers });
} else {
response = new Response(prevResponse.body, {
...prevResponse,
headers
});
}
break;
}
default: {
response = new Response(prevResponse.body, {
...prevResponse,
headers
});
}
}
for (const [_, mid] of onOriginResponseMiddleware.entries()) {
const reqOrResponse = await mid({
request: mutableRequest,
response
});
if (isResponse(reqOrResponse)) {
response = reqOrResponse;
}
}
return response;
};
serve2(raw_listener, middlewareHandler);
}
}
const pullzoneHandler = {};
pullzoneHandler.onOriginResponse = (middleware) => {
onOriginResponseMiddleware.push(middleware);
return pullzoneHandler;
};
pullzoneHandler.onOriginRequest = (middleware) => {
onOriginRequestMiddleware.push(middleware);
return pullzoneHandler;
};
return pullzoneHandler;
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
net
});