@satorijs/satori
Advanced tools
Comparing version 3.0.2 to 3.1.0
@@ -1,68 +0,2 @@ | ||
/// <reference types="ws" /> | ||
/// <reference types="node" /> | ||
/// <reference types="koa__router" /> | ||
import { Context, Schema } from '@satorijs/core'; | ||
import { MaybeArray } from 'cosmokit'; | ||
import { IncomingMessage, Server } from 'http'; | ||
import WebSocket from 'ws'; | ||
import KoaRouter from '@koa/router'; | ||
export interface ListenOptions { | ||
host?: string; | ||
port?: number; | ||
maxPort?: number; | ||
} | ||
export function listen({ host, port, maxPort }: ListenOptions): Promise<number>; | ||
declare module 'koa' { | ||
interface Request { | ||
body?: any; | ||
rawBody?: string; | ||
} | ||
} | ||
declare module '@satorijs/core' { | ||
interface Context { | ||
router: Router; | ||
} | ||
} | ||
type WebSocketCallback = (socket: WebSocket, request: IncomingMessage) => void; | ||
export class WebSocketLayer { | ||
private router; | ||
callback?: WebSocketCallback; | ||
clients: Set<WebSocket>; | ||
regexp: RegExp; | ||
constructor(router: Router, path: MaybeArray<string | RegExp>, callback?: WebSocketCallback); | ||
accept(socket: WebSocket, request: IncomingMessage): boolean; | ||
close(): void; | ||
} | ||
export class Router extends KoaRouter { | ||
_http?: Server; | ||
_ws?: WebSocket.Server; | ||
wsStack: WebSocketLayer[]; | ||
host: string; | ||
port: number; | ||
constructor(ctx: Context); | ||
get selfUrl(): string; | ||
/** | ||
* hack into router methods to make sure that koa middlewares are disposable | ||
*/ | ||
register(...args: Parameters<KoaRouter['register']>): KoaRouter.Layer; | ||
ws(path: MaybeArray<string | RegExp>, callback?: WebSocketCallback): WebSocketLayer; | ||
} | ||
export * from '@satorijs/core'; | ||
export * from 'cosmokit'; | ||
declare module '@satorijs/core' { | ||
namespace Context { | ||
interface Config extends Config.Network { | ||
} | ||
namespace Config { | ||
interface Network { | ||
host?: string; | ||
port?: number; | ||
maxPort?: number; | ||
selfUrl?: string; | ||
} | ||
interface Static extends Schema<Config> { | ||
Network: Schema<Network>; | ||
} | ||
} | ||
} | ||
} |
178
lib/index.js
@@ -8,6 +8,2 @@ var __create = Object.create; | ||
var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); | ||
var __export = (target, all) => { | ||
for (var name in all) | ||
__defProp(target, name, { get: all[name], enumerable: true }); | ||
}; | ||
var __copyProps = (to, from, except, desc) => { | ||
@@ -34,13 +30,3 @@ if (from && typeof from === "object" || typeof from === "function") { | ||
var src_exports = {}; | ||
__export(src_exports, { | ||
Router: () => Router, | ||
WebSocketLayer: () => WebSocketLayer | ||
}); | ||
module.exports = __toCommonJS(src_exports); | ||
var import_core3 = require("@satorijs/core"); | ||
var import_cosmokit3 = require("cosmokit"); | ||
__reExport(src_exports, require("@satorijs/core"), module.exports); | ||
__reExport(src_exports, require("cosmokit"), module.exports); | ||
// satori/packages/satori/src/axios.ts | ||
var import_core = require("@satorijs/core"); | ||
@@ -56,2 +42,4 @@ var import_cosmokit = require("cosmokit"); | ||
var import_socks_proxy_agent = __toESM(require("socks-proxy-agent")); | ||
__reExport(src_exports, require("@satorijs/core"), module.exports); | ||
__reExport(src_exports, require("cosmokit"), module.exports); | ||
var oldFile = import_core.Quester.prototype.file; | ||
@@ -97,166 +85,4 @@ import_core.Quester.prototype.file = /* @__PURE__ */ __name(async function file(url) { | ||
import_core.Quester.defineAgent(["socks", "socks4", "socks4a", "socks5", "socks5h"], import_socks_proxy_agent.default); | ||
// satori/packages/satori/src/router.ts | ||
var import_core2 = require("@satorijs/core"); | ||
var import_cosmokit2 = require("cosmokit"); | ||
var import_http = require("http"); | ||
var import_path_to_regexp = require("path-to-regexp"); | ||
var import_parseurl = __toESM(require("parseurl")); | ||
var import_ws2 = __toESM(require("ws")); | ||
var import_router = __toESM(require("@koa/router")); | ||
var import_koa = __toESM(require("koa")); | ||
// satori/packages/satori/src/listen.ts | ||
var import_net = __toESM(require("net")); | ||
function listen({ host, port, maxPort = port }) { | ||
const server = import_net.default.createServer(); | ||
return new Promise((resolve, reject) => { | ||
function onListen() { | ||
server.off("error", onError); | ||
server.close((err) => { | ||
err ? reject(err) : resolve(port); | ||
}); | ||
} | ||
__name(onListen, "onListen"); | ||
function onError(err) { | ||
server.off("listening", onListen); | ||
if (!(err.code === "EADDRINUSE" || err.code === "EACCES")) { | ||
return reject(err); | ||
} | ||
port++; | ||
if (port > maxPort) { | ||
return reject(new Error("No open ports available")); | ||
} | ||
testPort(); | ||
} | ||
__name(onError, "onError"); | ||
function testPort() { | ||
server.once("error", onError); | ||
server.once("listening", onListen); | ||
server.listen(port, host); | ||
} | ||
__name(testPort, "testPort"); | ||
testPort(); | ||
}); | ||
} | ||
__name(listen, "listen"); | ||
// satori/packages/satori/src/router.ts | ||
var logger = new import_core2.Logger("app"); | ||
var _WebSocketLayer = class _WebSocketLayer { | ||
constructor(router, path, callback) { | ||
this.router = router; | ||
this.callback = callback; | ||
this.regexp = (0, import_path_to_regexp.pathToRegexp)(path); | ||
} | ||
clients = /* @__PURE__ */ new Set(); | ||
regexp; | ||
accept(socket, request) { | ||
var _a; | ||
if (!this.regexp.test((0, import_parseurl.default)(request).pathname)) | ||
return; | ||
this.clients.add(socket); | ||
socket.addEventListener("close", () => { | ||
this.clients.delete(socket); | ||
}); | ||
(_a = this.callback) == null ? void 0 : _a.call(this, socket, request); | ||
return true; | ||
} | ||
close() { | ||
(0, import_cosmokit2.remove)(this.router.wsStack, this); | ||
for (const socket of this.clients) { | ||
socket.close(); | ||
} | ||
} | ||
}; | ||
__name(_WebSocketLayer, "WebSocketLayer"); | ||
var WebSocketLayer = _WebSocketLayer; | ||
var _Router = class _Router extends import_router.default { | ||
_http; | ||
_ws; | ||
wsStack = []; | ||
host; | ||
port; | ||
constructor(ctx) { | ||
super(); | ||
const koa = new import_koa.default(); | ||
koa.use(require("koa-bodyparser")({ | ||
enableTypes: ["json", "form", "xml"] | ||
})); | ||
koa.use(this.routes()); | ||
koa.use(this.allowedMethods()); | ||
this._http = (0, import_http.createServer)(koa.callback()); | ||
this._ws = new import_ws2.default.Server({ | ||
server: this._http | ||
}); | ||
this._ws.on("connection", (socket, request) => { | ||
for (const manager of this.wsStack) { | ||
if (manager.accept(socket, request)) | ||
return; | ||
} | ||
socket.close(); | ||
}); | ||
ctx.root.decline(["selfUrl", "host", "port", "maxPort"]); | ||
if (ctx.root.config.selfUrl) { | ||
ctx.root.config.selfUrl = (0, import_cosmokit2.trimSlash)(ctx.root.config.selfUrl); | ||
} | ||
ctx.on("ready", async () => { | ||
const { host = "127.0.0.1", port } = ctx.root.config; | ||
if (!port) | ||
return; | ||
this.host = host; | ||
this.port = await listen(ctx.root.config); | ||
this._http.listen(this.port, host); | ||
logger.info("server listening at %c", this.selfUrl); | ||
}, true); | ||
ctx.on("dispose", () => { | ||
var _a, _b; | ||
logger.info("http server closing"); | ||
(_a = this._ws) == null ? void 0 : _a.close(); | ||
(_b = this._http) == null ? void 0 : _b.close(); | ||
}); | ||
} | ||
get selfUrl() { | ||
const wildcard = ["0.0.0.0", "::"]; | ||
const host = wildcard.includes(this.host) ? "127.0.0.1" : this.host; | ||
return `http://${host}:${this.port}`; | ||
} | ||
/** | ||
* hack into router methods to make sure that koa middlewares are disposable | ||
*/ | ||
register(...args) { | ||
const layer = super.register(...args); | ||
const context = this[import_core2.Context.current]; | ||
context == null ? void 0 : context.state.disposables.push(() => { | ||
(0, import_cosmokit2.remove)(this.stack, layer); | ||
}); | ||
return layer; | ||
} | ||
ws(path, callback) { | ||
const layer = new WebSocketLayer(this, path, callback); | ||
this.wsStack.push(layer); | ||
const context = this[import_core2.Context.current]; | ||
context == null ? void 0 : context.state.disposables.push(() => layer.close()); | ||
return layer; | ||
} | ||
}; | ||
__name(_Router, "Router"); | ||
var Router = _Router; | ||
import_core2.Context.service("router", Router); | ||
// satori/packages/satori/src/index.ts | ||
(0, import_cosmokit3.defineProperty)(import_core3.Context.Config, "Network", import_core3.Schema.object({ | ||
host: import_core3.Schema.string().default("127.0.0.1").description("要监听的 IP 地址。如果将此设置为 `0.0.0.0` 将监听所有地址,包括局域网和公网地址。"), | ||
port: import_core3.Schema.natural().max(65535).description("要监听的初始端口号。"), | ||
maxPort: import_core3.Schema.natural().max(65535).description("允许监听的最大端口号。"), | ||
selfUrl: import_core3.Schema.string().role("link").description("应用暴露在公网的地址。") | ||
}).description("网络设置")); | ||
import_core3.Context.Config.list.unshift(import_core3.Context.Config.Network); | ||
import_core3.Context.Config.list.push(import_core3.Schema.object({ | ||
request: import_core3.Quester.Config | ||
})); | ||
// Annotate the CommonJS export names for ESM import in node: | ||
0 && (module.exports = { | ||
Router, | ||
WebSocketLayer, | ||
...require("@satorijs/core"), | ||
@@ -263,0 +89,0 @@ ...require("cosmokit") |
{ | ||
"name": "@satorijs/satori", | ||
"description": "Core components of Satorijs", | ||
"version": "3.0.2", | ||
"version": "3.1.0", | ||
"main": "lib/index.js", | ||
"typings": "lib/index.d.ts", | ||
"files": [ | ||
"lib" | ||
"lib", | ||
"src" | ||
], | ||
@@ -32,3 +33,3 @@ "author": "Shigma <shigma10826@gmail.com>", | ||
"@koa/router": "^10.1.1", | ||
"@satorijs/core": "3.0.2", | ||
"@satorijs/core": "3.1.0", | ||
"@types/koa": "*", | ||
@@ -35,0 +36,0 @@ "@types/koa__router": "*", |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Network access
Supply chain riskThis module accesses the network.
Found 2 instances in 1 package
3
15533
6
142
+ Added@cordisjs/core@3.18.1(transitive)
+ Added@cordisjs/loader@0.13.1(transitive)
+ Added@cordisjs/logger@0.3.3(transitive)
+ Added@cordisjs/schema@0.1.1(transitive)
+ Added@cordisjs/timer@0.3.2(transitive)
+ Added@satorijs/core@3.1.0(transitive)
+ Addedargparse@2.0.1(transitive)
+ Addedcac@6.7.14(transitive)
+ Addedcordis@3.18.1(transitive)
+ Addeddotenv@16.4.7(transitive)
+ Addedjs-yaml@4.1.0(transitive)
+ Addedkleur@4.1.5(transitive)
- Removed@satorijs/core@3.0.2(transitive)
- Removedcordis@2.10.3(transitive)
Updated@satorijs/core@3.1.0