New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@satorijs/satori

Package Overview
Dependencies
Maintainers
1
Versions
154
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@satorijs/satori - npm Package Compare versions

Comparing version 3.0.2 to 3.1.0

src/index.ts

66

lib/index.d.ts

@@ -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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc