node-karin 0.12.2-5.pr.206.e09f093 → 0.12.2-5.pr.206.e2e1f8d

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -268,7 +268,6 @@ var modifyPackageJson = () => {
268
268
  "rs",
269
269
  "log",
270
270
  "up",
271
- "init",
272
271
  "dev",
273
272
  "ts",
274
273
  "watch"
package/dist/cli/index.js CHANGED
@@ -259,7 +259,6 @@ var modifyPackageJson = () => {
259
259
  "rs",
260
260
  "log",
261
261
  "up",
262
- "init",
263
262
  "dev",
264
263
  "ts",
265
264
  "watch"
package/dist/index.js CHANGED
@@ -8850,14 +8850,277 @@ var init_types = __esm({
8850
8850
  }
8851
8851
  });
8852
8852
 
8853
+ // src/utils/fs/static.ts
8854
+ var isStatic;
8855
+ var init_static = __esm({
8856
+ "src/utils/fs/static.ts"() {
8857
+ "use strict";
8858
+ init_esm_shims();
8859
+ init_cache();
8860
+ init_path();
8861
+ isStatic = (filePath) => {
8862
+ try {
8863
+ for (const item of cache9.static) {
8864
+ if (isSubPath(item, filePath)) {
8865
+ return true;
8866
+ }
8867
+ }
8868
+ return false;
8869
+ } catch (error) {
8870
+ logger.error("isStatic", error);
8871
+ return false;
8872
+ }
8873
+ };
8874
+ }
8875
+ });
8876
+
8877
+ // src/adapter/render/connect/ws.ts
8878
+ import fs18 from "node:fs";
8879
+ import crypto from "node:crypto";
8880
+ var WebSocketRender;
8881
+ var init_ws2 = __esm({
8882
+ "src/adapter/render/connect/ws.ts"() {
8883
+ "use strict";
8884
+ init_esm_shims();
8885
+ init_template();
8886
+ init_cache2();
8887
+ init_static();
8888
+ WebSocketRender = class {
8889
+ /** websocket实例 */
8890
+ socket;
8891
+ /** 唯一标识符 */
8892
+ echo = 0;
8893
+ /** 索引 */
8894
+ index;
8895
+ constructor(socket) {
8896
+ this.socket = socket;
8897
+ this.index = -1;
8898
+ }
8899
+ async init() {
8900
+ this.socket.on("close", () => {
8901
+ unregisterRender(this.index);
8902
+ this.socket.removeAllListeners();
8903
+ this.socket.close();
8904
+ });
8905
+ this.socket.on("message", (event) => {
8906
+ const raw2 = event.toString();
8907
+ const { echo, action, status, data } = JSON.parse(raw2);
8908
+ logger.debug(`[WebSocket] ${echo} ${action} ${status}`);
8909
+ logger.trace(`[WebSocket] ${echo} ${raw2}`);
8910
+ if (action === "response") {
8911
+ this.socket.emit(echo, { action, status, data });
8912
+ } else if (action === "close") {
8913
+ logger.error(`[WebSocket] \u6536\u5230\u65AD\u5F00\u8FDE\u63A5\u8BF7\u6C42: ${raw2}`);
8914
+ this.socket.close();
8915
+ } else if (action === "static") {
8916
+ return this.static(echo, data);
8917
+ } else {
8918
+ logger.error(`[WebSocket] \u672A\u77E5\u7684\u8BF7\u6C42: ${raw2}`);
8919
+ }
8920
+ });
8921
+ this.index = registerRender("puppeteer", this.render.bind(this));
8922
+ }
8923
+ /**
8924
+ * @description 鉴权
8925
+ * @param token
8926
+ * @param targetToken 目标的token
8927
+ * @returns 是否鉴权成功
8928
+ */
8929
+ auth(token, targetToken) {
8930
+ if (token !== targetToken) {
8931
+ if (token.length !== 32) {
8932
+ token = crypto.createHash("md5").update(`Bearer ${token}`).digest("hex");
8933
+ }
8934
+ if (targetToken.length !== 32) {
8935
+ targetToken = crypto.createHash("md5").update(`Bearer ${targetToken}`).digest("hex");
8936
+ }
8937
+ if (token !== targetToken) {
8938
+ return false;
8939
+ }
8940
+ }
8941
+ return true;
8942
+ }
8943
+ /**
8944
+ * @description 处理静态资源请求
8945
+ * @param echo 唯一标识符
8946
+ * @param data 数据
8947
+ */
8948
+ async static(echo, data) {
8949
+ const result = isStatic(data.file);
8950
+ if (!result) {
8951
+ logger.warn(`[WebSocket] \u8BBF\u95EE\u7684\u8DEF\u5F84\u975E\u6CD5: echo: ${echo} data: ${JSON.stringify(data)}`);
8952
+ return this.socket.send(JSON.stringify({ echo, status: "error", data: "\u975E\u6CD5\u7684\u8BBF\u95EE\u8DEF\u5F84" }));
8953
+ }
8954
+ const fileData = fs18.readFileSync(data.file);
8955
+ return this.socket.send(JSON.stringify({ echo, status: "ok", data: fileData }));
8956
+ }
8957
+ render(data) {
8958
+ const options = renderTpl(data);
8959
+ return this.sendApi("render", options);
8960
+ }
8961
+ async sendApi(action, data) {
8962
+ const echo = ++this.echo;
8963
+ const str = JSON.stringify({ echo, action, data });
8964
+ logger.debug(`[sendApi][WebSocket] ${echo} ${action} ${str}`);
8965
+ this.socket.send(str);
8966
+ return new Promise((resolve, reject) => {
8967
+ const timeoutId = setTimeout(() => {
8968
+ reject(new Error(`[sendApi] \u8BF7\u6C42\u9519\u8BEF:
8969
+ action: ${action}
8970
+ params: ${str}
8971
+ error: \u8BF7\u6C42\u8D85\u65F6}`));
8972
+ }, 120 * 1e3);
8973
+ this.socket.once(echo + "", ({ status, data: data2 }) => {
8974
+ clearTimeout(timeoutId);
8975
+ if (status === "ok") {
8976
+ return resolve(data2);
8977
+ }
8978
+ reject(new Error(`[sendApi] \u8BF7\u6C42\u9519\u8BEF:
8979
+ action: ${action}
8980
+ params: ${str}
8981
+ error: ${data2}}`));
8982
+ });
8983
+ });
8984
+ }
8985
+ };
8986
+ }
8987
+ });
8988
+
8989
+ // src/adapter/render/connect/client.ts
8990
+ import WebSocket from "ws";
8991
+ var init_client = __esm({
8992
+ async "src/adapter/render/connect/client.ts"() {
8993
+ "use strict";
8994
+ init_esm_shims();
8995
+ init_ws2();
8996
+ await init_render();
8997
+ }
8998
+ });
8999
+
9000
+ // src/adapter/render/connect/server.ts
9001
+ var WebSocketServerRenderer;
9002
+ var init_server2 = __esm({
9003
+ async "src/adapter/render/connect/server.ts"() {
9004
+ "use strict";
9005
+ init_esm_shims();
9006
+ init_ws2();
9007
+ await init_render();
9008
+ init_internal();
9009
+ WebSocketServerRenderer = class extends WebSocketRender {
9010
+ /** 请求实例 */
9011
+ request;
9012
+ constructor(socket, request) {
9013
+ super(socket);
9014
+ this.request = request;
9015
+ }
9016
+ connection() {
9017
+ const cfg = render();
9018
+ if (!cfg.ws_server.enable) {
9019
+ logger.warn("[WebSocket] \u53CD\u5411ws\u672A\u542F\u7528");
9020
+ this.socket.close();
9021
+ return false;
9022
+ }
9023
+ const url = `ws://${this.request.headers.host}${this.request.url}`;
9024
+ if (process.env.WS_SERVER_AUTH_KEY) {
9025
+ const token = this.request.headers["authorization"];
9026
+ if (!token || !this.auth(process.env.WS_SERVER_AUTH_KEY, token)) {
9027
+ logger.error(`[WebSocket] \u9274\u6743\u5931\u8D25: authorization: ${token} url: ${url}`);
9028
+ this.socket.close();
9029
+ return false;
9030
+ }
9031
+ }
9032
+ logger.info(`[WebSocket] \u8FDE\u63A5\u6210\u529F: url: ${url}`);
9033
+ return true;
9034
+ }
9035
+ };
9036
+ listeners.on("ws:connection:puppeteer", (socket, request) => {
9037
+ const server2 = new WebSocketServerRenderer(socket, request);
9038
+ if (!server2.connection()) return;
9039
+ server2.init();
9040
+ });
9041
+ }
9042
+ });
9043
+
9044
+ // src/adapter/render/connect/http.ts
9045
+ import axios4 from "axios";
9046
+ import crypto2 from "node:crypto";
9047
+ var createHttpRenderClient;
9048
+ var init_http = __esm({
9049
+ async "src/adapter/render/connect/http.ts"() {
9050
+ "use strict";
9051
+ init_esm_shims();
9052
+ init_cache2();
9053
+ await init_render();
9054
+ createHttpRenderClient = () => {
9055
+ const cfg = render();
9056
+ if (!cfg.http_server || !Array.isArray(cfg.http_server) || cfg.http_server.length === 0) {
9057
+ logger.trace("[render][http] \u672A\u914D\u7F6E\u4EFB\u4F55\u6B63\u5411HTTP \u5DF2\u8DF3\u8FC7\u521B\u5EFA");
9058
+ return;
9059
+ }
9060
+ return Promise.allSettled(cfg.http_server.map(async (item) => {
9061
+ let { url, token, enable } = item;
9062
+ if (!enable) return;
9063
+ url = url.replace("/puppeteer", "");
9064
+ const headers = { authorization: crypto2.createHash("md5").update(`Bearer ${token}`).digest("hex") };
9065
+ try {
9066
+ const result = await axios4.get(`${url}/ping`, { timeout: 5e3 });
9067
+ if (result.status !== 200 || String(result.data.status) !== "200") {
9068
+ logger.error(`[render][http] \u521B\u5EFA\u6E32\u67D3\u5668\u5931\u8D25: \u65E0\u6CD5\u8FDE\u63A5 ${url}`);
9069
+ }
9070
+ const auth2 = await axios4.get(`${url}/auth`, { headers, timeout: 5e3 });
9071
+ if (auth2.status !== 200 || String(auth2.data.status) !== "200") {
9072
+ logger.error(`[render][http] \u521B\u5EFA\u6E32\u67D3\u5668\u5931\u8D25: \u9274\u6743\u9519\u8BEF ${url}`);
9073
+ return;
9074
+ }
9075
+ } catch (error) {
9076
+ if (axios4.isAxiosError(error)) {
9077
+ const { response } = error;
9078
+ logger.error(`[render][http] \u521B\u5EFA\u6E32\u67D3\u5668\u5931\u8D25: ${response == null ? void 0 : response.status} ${response == null ? void 0 : response.statusText} - ${JSON.stringify((response == null ? void 0 : response.data) || "\u672A\u77E5\u9519\u8BEF")}`);
9079
+ } else {
9080
+ logger.error(`[render][http] \u521B\u5EFA\u6E32\u67D3\u5668\u5931\u8D25: ${error}`);
9081
+ }
9082
+ return;
9083
+ }
9084
+ const index4 = registerRender("puppeteer", async (options) => {
9085
+ var _a;
9086
+ try {
9087
+ const result = await axios4.post(`${url}/puppeteer`, options, { headers });
9088
+ if (result.status !== 200) {
9089
+ throw new Error(`[render][http] \u6E32\u67D3\u5931\u8D25: ${result.status} ${result.statusText} - ${((_a = result.data) == null ? void 0 : _a.message) || "\u672A\u77E5\u9519\u8BEF"}`);
9090
+ }
9091
+ return result.data;
9092
+ } catch (error) {
9093
+ if (axios4.isAxiosError(error)) {
9094
+ if (!error.response) {
9095
+ unregisterRender(index4);
9096
+ throw new Error(`[render][http] \u7F51\u7EDC\u8FDE\u63A5\u5931\u8D25: ${error.message}`);
9097
+ }
9098
+ const { response } = error;
9099
+ throw new Error(`[render][http] \u6E32\u67D3\u5931\u8D25: ${response == null ? void 0 : response.status} ${response == null ? void 0 : response.statusText} - ${JSON.stringify((response == null ? void 0 : response.data) || "\u672A\u77E5\u9519\u8BEF")}`);
9100
+ }
9101
+ if (error instanceof Error) {
9102
+ throw error;
9103
+ }
9104
+ throw new Error(`[render][unknown] \u672A\u77E5\u9519\u8BEF: ${error}`);
9105
+ }
9106
+ });
9107
+ }));
9108
+ };
9109
+ }
9110
+ });
9111
+
8853
9112
  // src/adapter/render/index.ts
8854
9113
  var init_render2 = __esm({
8855
- "src/adapter/render/index.ts"() {
9114
+ async "src/adapter/render/index.ts"() {
8856
9115
  "use strict";
8857
9116
  init_esm_shims();
8858
9117
  init_cache2();
8859
9118
  init_template();
8860
9119
  init_types();
9120
+ await init_client();
9121
+ await init_server2();
9122
+ await init_http();
9123
+ createHttpRenderClient();
8861
9124
  }
8862
9125
  });
8863
9126
 
@@ -9177,7 +9440,7 @@ var button2 = (reg, fnc2, options = {}) => {
9177
9440
 
9178
9441
  // src/core/karin/render.ts
9179
9442
  init_esm_shims();
9180
- init_render2();
9443
+ await init_render2();
9181
9444
  var render3 = (options, multiPageOrId, id) => {
9182
9445
  if (options === "opt") {
9183
9446
  return callRender(multiPageOrId, id);
@@ -9632,26 +9895,7 @@ init_json();
9632
9895
  init_path();
9633
9896
  init_pkg();
9634
9897
  init_require();
9635
-
9636
- // src/utils/fs/static.ts
9637
- init_esm_shims();
9638
- init_cache();
9639
- init_path();
9640
- var isStatic = (filePath) => {
9641
- try {
9642
- for (const item of cache9.static) {
9643
- if (isSubPath(item, filePath)) {
9644
- return true;
9645
- }
9646
- }
9647
- return false;
9648
- } catch (error) {
9649
- logger.error("isStatic", error);
9650
- return false;
9651
- }
9652
- };
9653
-
9654
- // src/utils/fs/fs.ts
9898
+ init_static();
9655
9899
  init_yaml();
9656
9900
  init_watch();
9657
9901
  init_lock();
@@ -9779,7 +10023,7 @@ init_esm_shims();
9779
10023
  init_exec();
9780
10024
  init_require();
9781
10025
  init_list();
9782
- import fs18 from "node:fs";
10026
+ import fs19 from "node:fs";
9783
10027
  var getPkg = (isForcibly = false) => {
9784
10028
  return requireFile("package.json", { force: isForcibly });
9785
10029
  };
@@ -9909,8 +10153,8 @@ var checkGitPluginUpdate = async (filePath, time2 = 120) => {
9909
10153
  var _a;
9910
10154
  const logger3 = (global == null ? void 0 : global.logger) || console;
9911
10155
  try {
9912
- if (!fs18.existsSync(filePath)) return { status: "error", data: new Error("\u8DEF\u5F84\u4E0D\u5B58\u5728") };
9913
- if (!fs18.existsSync(`${filePath}/.git`)) return { status: "error", data: new Error("\u8BE5\u8DEF\u5F84\u4E0D\u662F\u4E00\u4E2Agit\u4ED3\u5E93") };
10156
+ if (!fs19.existsSync(filePath)) return { status: "error", data: new Error("\u8DEF\u5F84\u4E0D\u5B58\u5728") };
10157
+ if (!fs19.existsSync(`${filePath}/.git`)) return { status: "error", data: new Error("\u8BE5\u8DEF\u5F84\u4E0D\u662F\u4E00\u4E2Agit\u4ED3\u5E93") };
9914
10158
  const timer = setTimeout(() => {
9915
10159
  return { status: "failed", data: "\u6267\u884C\u8D85\u65F6" };
9916
10160
  }, time2 * 1e3);
@@ -9961,8 +10205,8 @@ var getTime = async (filePath) => {
9961
10205
  var updateGitPlugin = async (filePath, cmd = "git pull", time2 = 120) => {
9962
10206
  const logger3 = (global == null ? void 0 : global.logger) || console;
9963
10207
  try {
9964
- if (!fs18.existsSync(filePath)) return { status: "failed", data: "\u8DEF\u5F84\u4E0D\u5B58\u5728" };
9965
- if (!fs18.existsSync(`${filePath}/.git`)) return { status: "failed", data: "\u8BE5\u8DEF\u5F84\u4E0D\u662F\u4E00\u4E2Agit\u4ED3\u5E93" };
10208
+ if (!fs19.existsSync(filePath)) return { status: "failed", data: "\u8DEF\u5F84\u4E0D\u5B58\u5728" };
10209
+ if (!fs19.existsSync(`${filePath}/.git`)) return { status: "failed", data: "\u8BE5\u8DEF\u5F84\u4E0D\u662F\u4E00\u4E2Agit\u4ED3\u5E93" };
9966
10210
  const timer = setTimeout(() => {
9967
10211
  return { status: "failed", data: "\u6267\u884C\u8D85\u65F6" };
9968
10212
  }, time2 * 1e3);
@@ -10223,7 +10467,7 @@ init_esm_shims();
10223
10467
  // src/adapter/onebot/core/convert.ts
10224
10468
  init_esm_shims();
10225
10469
  init_message2();
10226
- import fs19 from "node:fs";
10470
+ import fs20 from "node:fs";
10227
10471
  var buildError = (selfId, action, request, error) => {
10228
10472
  if (error) {
10229
10473
  const err = JSON.stringify(error, null, 2).replace(/\\n/g, "\n");
@@ -10288,7 +10532,7 @@ var fileToBase64 = (file, url) => {
10288
10532
  if (!url || !file.startsWith("file://")) return file;
10289
10533
  const list4 = ["127.0.0.1", "localhost"];
10290
10534
  const link = new URL(url);
10291
- return list4.includes(link.hostname) ? file : `base64://${fs19.readFileSync(file.replace("file://", "")).toString("base64")}`;
10535
+ return list4.includes(link.hostname) ? file : `base64://${fs20.readFileSync(file.replace("file://", "")).toString("base64")}`;
10292
10536
  };
10293
10537
  var KarinConvertAdapter = (data, onebot) => {
10294
10538
  var _a, _b, _c;
@@ -12085,7 +12329,7 @@ var WsAdapterOneBot11 = class extends AdapterOneBot {
12085
12329
 
12086
12330
  // src/adapter/onebot/connect/http.ts
12087
12331
  init_esm_shims();
12088
- import axios4 from "axios";
12332
+ import axios5 from "axios";
12089
12333
  init_listeners();
12090
12334
  init_bot();
12091
12335
  var HttpAdapterOneBot11 = class extends AdapterOneBot {
@@ -12148,13 +12392,13 @@ var HttpAdapterOneBot11 = class extends AdapterOneBot {
12148
12392
  logger.bot("debug", this.selfId, `\u53D1\u9001Api\u8BF7\u6C42 ${action}: ${request}`);
12149
12393
  try {
12150
12394
  const headers = this.#token ? { Authorization: `Bearer ${this.#token}` } : {};
12151
- const { data } = await axios4.post(`${this.adapter.address}/${action}`, params, { headers, timeout: time2 * 1e3 });
12395
+ const { data } = await axios5.post(`${this.adapter.address}/${action}`, params, { headers, timeout: time2 * 1e3 });
12152
12396
  if (data.status === "ok") {
12153
12397
  return data.data;
12154
12398
  }
12155
12399
  throw buildError(this.selfId, action, request, data);
12156
12400
  } catch (error) {
12157
- if (axios4.isAxiosError(error) && error.code === "ECONNABORTED") {
12401
+ if (axios5.isAxiosError(error) && error.code === "ECONNABORTED") {
12158
12402
  throw buildError(this.selfId, action, request, "\u8BF7\u6C42\u8D85\u65F6");
12159
12403
  }
12160
12404
  buildError(this.selfId, action, request);
@@ -12165,7 +12409,7 @@ var HttpAdapterOneBot11 = class extends AdapterOneBot {
12165
12409
 
12166
12410
  // src/adapter/onebot/connect/client.ts
12167
12411
  init_esm_shims();
12168
- import WebSocket from "ws";
12412
+ import WebSocket2 from "ws";
12169
12413
  init_bot();
12170
12414
  var AdapterClientOneBot11 = class _AdapterClientOneBot11 extends WsAdapterOneBot11 {
12171
12415
  token;
@@ -12186,7 +12430,7 @@ var AdapterClientOneBot11 = class _AdapterClientOneBot11 extends WsAdapterOneBot
12186
12430
  }
12187
12431
  static async init(url, token) {
12188
12432
  const authorization = token ? `Bearer ${token}` : void 0;
12189
- const socket = authorization ? new WebSocket(url, { headers: { authorization } }) : new WebSocket(url);
12433
+ const socket = authorization ? new WebSocket2(url, { headers: { authorization } }) : new WebSocket2(url);
12190
12434
  socket.on("open", async () => {
12191
12435
  await new _AdapterClientOneBot11(socket, token).init("\u83B7\u53D6\u4E2D...", url, "webSocketClient");
12192
12436
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-karin",
3
- "version": "0.12.25.pr.206.e09f093",
3
+ "version": "0.12.25.pr.206.e2e1f8d",
4
4
  "description": "Lightweight, efficient, concise, and stable robot framework.",
5
5
  "keywords": [
6
6
  "node",