@satorijs/satori
Advanced tools
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 |
{ | ||
"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
Network access
Supply chain riskThis module accesses the network.
Found 1 instance in 1 package
44470
445
1
Updated@satorijs/core@^1.0.9