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 1.0.8 to 1.0.9

282

lib/index.js

@@ -7,2 +7,3 @@ var __create = Object.create;

var __hasOwnProp = Object.prototype.hasOwnProperty;
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
var __export = (target, all) => {

@@ -30,33 +31,263 @@ for (var name in all)

__export(src_exports, {
Logger: () => import_reggol.default,
Schema: () => import_schemastery.default
Logger: () => import_reggol2.default,
Quester: () => Quester,
Router: () => Router,
Schema: () => import_schemastery3.default,
WebSocketLayer: () => WebSocketLayer
});
module.exports = __toCommonJS(src_exports);
var import_core4 = require("@satorijs/core");
var import_cosmokit4 = require("cosmokit");
var import_portfinder = require("portfinder");
var import_schemastery3 = __toESM(require("schemastery"));
var import_reggol2 = __toESM(require("reggol"));
// packages/satori/src/quester.ts
var import_core = require("@satorijs/core");
var import_cosmokit = require("cosmokit");
var import_portfinder = require("portfinder");
var import_ws = __toESM(require("ws"));
var import_proxy_agent = __toESM(require("proxy-agent"));
var import_axios = __toESM(require("axios"));
var import_schemastery = __toESM(require("schemastery"));
var import_reggol = __toESM(require("reggol"));
var import_quester = require("./quester");
var Quester = class {
constructor(ctx, config) {
return Quester.create(config.request);
}
};
__name(Quester, "Quester");
((Quester2) => {
Quester2.Config = import_schemastery.default.object({
proxyAgent: import_schemastery.default.string().description("使用的代理服务器地址。"),
timeout: import_schemastery.default.natural().role("ms").description("等待连接建立的最长时间。")
}).description("请求设置");
Quester2.createConfig = /* @__PURE__ */ __name((endpoint) => import_schemastery.default.object({
endpoint: import_schemastery.default.string().role("link").description("要连接的服务器地址。").default(typeof endpoint === "string" ? endpoint : null).required(typeof endpoint === "boolean" ? endpoint : false),
proxyAgent: import_schemastery.default.string().description("使用的代理服务器地址。"),
headers: import_schemastery.default.dict(String).description("要附加的额外请求头。"),
timeout: import_schemastery.default.natural().role("ms").description("等待连接建立的最长时间。")
}).description("请求设置"), "createConfig");
const agents = {};
function getAgent(url) {
return agents[url] || (agents[url] = new import_proxy_agent.default(url));
}
__name(getAgent, "getAgent");
function create(config = {}) {
const endpoint = config.endpoint = (0, import_cosmokit.trimSlash)(config.endpoint || "");
const options = {
timeout: config.timeout,
headers: config.headers
};
if (config.proxyAgent) {
options.httpAgent = getAgent(config.proxyAgent);
options.httpsAgent = getAgent(config.proxyAgent);
}
const request = /* @__PURE__ */ __name(async (url, config2 = {}) => (0, import_axios.default)({
...options,
...config2,
url: endpoint + url,
headers: {
...options.headers,
...config2.headers
}
}), "request");
const http = /* @__PURE__ */ __name(async (method, url, config2) => {
const response = await request(url, { ...config2, method });
return response.data;
}, "http");
http.config = config;
http.axios = request;
http.extend = (newConfig) => create({
...config,
...newConfig,
headers: {
...config.headers,
...newConfig.headers
}
});
http.get = (url, config2) => http("GET", url, config2);
http.delete = (url, config2) => http("DELETE", url, config2);
http.post = (url, data, config2) => http("POST", url, { ...config2, data });
http.put = (url, data, config2) => http("PUT", url, { ...config2, data });
http.patch = (url, data, config2) => http("PATCH", url, { ...config2, data });
http.head = async (url, config2) => {
const response = await request(url, { ...config2, method: "HEAD" });
return response.headers;
};
http.ws = (url, options2 = {}) => {
return new import_ws.default(url, {
agent: config.proxyAgent && getAgent(config.proxyAgent),
handshakeTimeout: config.timeout,
...options2,
headers: {
...config.headers,
...options2.headers
}
});
};
return http;
}
Quester2.create = create;
__name(create, "create");
})(Quester || (Quester = {}));
import_core.Context.service("http", Quester);
// packages/satori/src/index.ts
__reExport(src_exports, require("@satorijs/core"), module.exports);
__reExport(src_exports, require("cosmokit"), module.exports);
__reExport(src_exports, require("./adapter"), module.exports);
__reExport(src_exports, require("./quester"), module.exports);
__reExport(src_exports, require("./router"), module.exports);
(0, import_cosmokit.defineProperty)(import_core.Context, "Config", import_schemastery.default.intersect([]));
(0, import_cosmokit.defineProperty)(import_core.Context.Config, "Network", import_schemastery.default.object({
host: import_schemastery.default.string().default("localhost").description("要监听的 IP 地址。如果将此设置为 `0.0.0.0` 将监听所有地址,包括局域网和公网地址。"),
port: import_schemastery.default.natural().max(65535).description("要监听的初始端口号。"),
maxPort: import_schemastery.default.natural().max(65535).description("允许监听的最大端口号。"),
selfUrl: import_schemastery.default.string().role("link").description("应用暴露在公网的地址。")
// packages/satori/src/adapter.ts
var import_core2 = require("@satorijs/core");
var import_cosmokit2 = require("cosmokit");
var import_schemastery2 = __toESM(require("schemastery"));
var import_reggol = __toESM(require("reggol"));
var logger = new import_reggol.default("adapter");
var WsClient = class extends import_core2.Adapter.Client {
async start(bot) {
let _retryCount = 0;
const { retryTimes, retryInterval, retryLazy } = bot.config;
const reconnect = /* @__PURE__ */ __name(async (initial = false) => {
logger.debug("websocket client opening");
const socket = await this.prepare(bot);
const url = socket.url.replace(/\?.+/, "");
socket.on("error", (error) => logger.debug(error));
socket.on("close", (code, reason) => {
bot.socket = null;
logger.debug(`websocket closed with ${code}`);
if (bot.status === "disconnect") {
return bot.status = "offline";
}
const message = reason.toString() || `failed to connect to ${url}, code: ${code}`;
let timeout = retryInterval;
if (_retryCount >= retryTimes) {
if (initial) {
bot.error = new Error(message);
return bot.status = "offline";
} else {
timeout = retryLazy;
}
}
_retryCount++;
bot.status = "reconnect";
logger.warn(`${message}, will retry in ${import_cosmokit2.Time.format(timeout)}...`);
setTimeout(() => {
if (bot.status === "reconnect")
reconnect();
}, timeout);
});
socket.on("open", () => {
_retryCount = 0;
bot.socket = socket;
logger.info("connect to server: %c", url);
this.accept(bot);
});
}, "reconnect");
reconnect(true);
}
async stop(bot) {
var _a;
(_a = bot.socket) == null ? void 0 : _a.close();
}
};
__name(WsClient, "WsClient");
WsClient.reusable = true;
WsClient.Config = import_schemastery2.default.object({
retryTimes: import_schemastery2.default.natural().description("初次连接时的最大重试次数。").default(6),
retryInterval: import_schemastery2.default.natural().role("ms").description("初次连接时的重试时间间隔。").default(5 * import_cosmokit2.Time.second),
retryLazy: import_schemastery2.default.natural().role("ms").description("连接关闭后的重试时间间隔。").default(import_cosmokit2.Time.minute)
}).description("连接设置");
Object.defineProperties(import_core2.Adapter, {
WsClient: { value: WsClient, enumerable: true }
});
// packages/satori/src/router.ts
var import_core3 = require("@satorijs/core");
var import_cosmokit3 = 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"));
var WebSocketLayer = class {
constructor(router, path, callback) {
this.router = router;
this.callback = callback;
this.clients = /* @__PURE__ */ new Set();
this.regexp = (0, import_path_to_regexp.pathToRegexp)(path);
}
accept(socket, request) {
var _a;
if (!this.regexp.test((0, import_parseurl.default)(request).pathname))
return;
this.clients.add(socket);
socket.on("close", () => {
this.clients.delete(socket);
});
(_a = this.callback) == null ? void 0 : _a.call(this, socket, request);
return true;
}
close() {
(0, import_cosmokit3.remove)(this.router.wsStack, this);
for (const socket of this.clients) {
socket.close();
}
}
};
__name(WebSocketLayer, "WebSocketLayer");
var Router = class extends import_router.default {
constructor(ctx) {
super();
this.wsStack = [];
const koa = new import_koa.default();
koa.use(require("koa-bodyparser")());
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();
});
}
register(...args) {
const layer = super.register(...args);
const context = this[import_core3.Context.current];
context == null ? void 0 : context.state.disposables.push(() => {
(0, import_cosmokit3.remove)(this.stack, layer);
});
return layer;
}
ws(path, callback) {
const layer = new WebSocketLayer(this, path, callback);
this.wsStack.push(layer);
const context = this[import_core3.Context.current];
context == null ? void 0 : context.state.disposables.push(() => layer.close());
return layer;
}
};
__name(Router, "Router");
import_core3.Context.service("router", Router);
// packages/satori/src/index.ts
(0, import_cosmokit4.defineProperty)(import_core4.Context, "Config", import_schemastery3.default.intersect([]));
(0, import_cosmokit4.defineProperty)(import_core4.Context.Config, "Network", import_schemastery3.default.object({
host: import_schemastery3.default.string().default("localhost").description("要监听的 IP 地址。如果将此设置为 `0.0.0.0` 将监听所有地址,包括局域网和公网地址。"),
port: import_schemastery3.default.natural().max(65535).description("要监听的初始端口号。"),
maxPort: import_schemastery3.default.natural().max(65535).description("允许监听的最大端口号。"),
selfUrl: import_schemastery3.default.string().role("link").description("应用暴露在公网的地址。")
}).description("网络设置"));
import_core.Context.Config.list.unshift(import_core.Context.Config.Network);
import_core.Context.Config.list.push(import_schemastery.default.object({
request: import_quester.Quester.Config
import_core4.Context.Config.list.unshift(import_core4.Context.Config.Network);
import_core4.Context.Config.list.push(import_schemastery3.default.object({
request: Quester.Config
}));
var logger = new import_reggol.default("app");
var start = import_core.Context.prototype.start;
import_core.Context.prototype.start = async function(...args) {
var logger2 = new import_reggol2.default("app");
var start = import_core4.Context.prototype.start;
import_core4.Context.prototype.start = async function(...args) {
if (this.options.selfUrl) {
this.options.selfUrl = (0, import_cosmokit.trimSlash)(this.options.selfUrl);
this.options.selfUrl = (0, import_cosmokit4.trimSlash)(this.options.selfUrl);
}

@@ -72,6 +303,6 @@ if (this.options.port) {

});
logger.info("server listening at %c", `http://${host}:${port}`);
logger2.info("server listening at %c", `http://${host}:${port}`);
this.on("dispose", () => {
var _a, _b;
logger.info("http server closing");
logger2.info("http server closing");
(_a = this.router._ws) == null ? void 0 : _a.close();

@@ -86,4 +317,7 @@ (_b = this.router._http) == null ? void 0 : _b.close();

Logger,
Schema
Quester,
Router,
Schema,
WebSocketLayer
});
//# sourceMappingURL=index.js.map

4

package.json
{
"name": "@satorijs/satori",
"description": "Core components of Satorijs",
"version": "1.0.8",
"version": "1.0.9",
"main": "lib/index.js",

@@ -36,3 +36,3 @@ "typings": "lib/index.d.ts",

"@koa/router": "^10.1.1",
"@satorijs/core": "^1.0.8",
"@satorijs/core": "^1.0.9",
"@types/koa": "*",

@@ -39,0 +39,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