@blocklet/sdk 1.16.33-beta-20241030-102817-90ad7cd5 → 1.16.33-beta-20241031-073543-49b1ff9b

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.
package/lib/config.js CHANGED
@@ -120,6 +120,20 @@ const initComponentStore = () => {
120
120
  };
121
121
  const componentStore = initComponentStore();
122
122
  exports.components = componentStore;
123
+ const updateComponentStoreInDocker = (components) => {
124
+ if (!components || !components.length) {
125
+ return components;
126
+ }
127
+ if (process.env.DOCKER_HOST_SERVER_DIR && process.env.DOCKER_CONTAINER_SERVER_DIR) {
128
+ const raw = JSON.stringify({ v: components });
129
+ const nextRaw = raw.replace(new RegExp(process.env.DOCKER_HOST_SERVER_DIR, 'g'), process.env.DOCKER_CONTAINER_SERVER_DIR);
130
+ const nextComponents = JSON.parse(nextRaw).v;
131
+ for (let i = 0; i < nextComponents.length; i++) {
132
+ components[i] = nextComponents[i];
133
+ }
134
+ }
135
+ return components;
136
+ };
123
137
  const _handleComponentUpdateOld = (data) => {
124
138
  componentStore.splice(0, componentStore.length);
125
139
  componentStore.push(...data.components.map((x) => {
@@ -128,6 +142,7 @@ const _handleComponentUpdateOld = (data) => {
128
142
  }
129
143
  return x;
130
144
  }));
145
+ updateComponentStoreInDocker(componentStore);
131
146
  };
132
147
  exports._handleComponentUpdateOld = _handleComponentUpdateOld;
133
148
  const _setComponentStatus = (components, status) => {
@@ -150,6 +165,8 @@ const _setUpdatedComponents = (components) => {
150
165
  componentStore.push({ ...newItem, status: constant_1.BlockletStatus.stopped });
151
166
  }
152
167
  });
168
+ updateComponentStoreInDocker(componentStore);
169
+ updateComponentStoreInDocker(list);
153
170
  return list;
154
171
  };
155
172
  const _handleComponentStarted = (data) => {
@@ -1,48 +1,14 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.verifyBlockletSig = void 0;
7
- const semver_1 = __importDefault(require("semver"));
8
- const ufo_1 = require("ufo");
9
- const constant_1 = require("@blocklet/constant");
10
4
  const config_1 = require("../config");
11
5
  const verify_sign_1 = require("../util/verify-sign");
12
- const legacyFn = (req) => {
13
- const data = req?.body ?? {};
14
- const params = req?.query ?? {};
15
- return { data, params };
16
- };
17
- const defaultFn = (req) => {
18
- const now = Math.floor(Date.now() / 1000);
19
- const iat = Number(req.get('x-blocklet-sig-iat'));
20
- const exp = Number(req.get('x-blocklet-sig-exp'));
21
- if (Number.isNaN(iat) || Number.isNaN(exp)) {
22
- throw new Error('invalid sig');
23
- }
24
- if (exp < now) {
25
- throw new Error('expired sig');
26
- }
27
- const data = {
28
- iat,
29
- exp,
30
- body: req.body ?? {},
31
- query: req.query ?? {},
32
- method: req.method.toLowerCase(),
33
- url: (0, ufo_1.parseURL)(req.originalUrl).pathname,
34
- };
35
- return data;
36
- };
37
6
  const verifyBlockletSig = (req, res, next) => {
38
7
  try {
39
- const sig = req.get('x-blocklet-sig');
40
- const sigVersion = req.get('x-blocklet-sig-version');
8
+ const { data, sig } = (0, verify_sign_1.getVerifyData)(req, 'blocklet');
41
9
  if (!sig) {
42
10
  return res.status(400).json({ error: 'Bad Request' });
43
11
  }
44
- const getData = semver_1.default.gt(semver_1.default.coerce(sigVersion), semver_1.default.coerce(constant_1.SIG_VERSION.V0)) ? defaultFn : legacyFn;
45
- const data = getData(req);
46
12
  const verified = (0, verify_sign_1.verify)(data, sig);
47
13
  if (!verified) {
48
14
  return res.status(401).json({ error: 'verify sig failed' });
@@ -1,48 +1,14 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.verifySig = void 0;
7
- const semver_1 = __importDefault(require("semver"));
8
- const ufo_1 = require("ufo");
9
- const constant_1 = require("@blocklet/constant");
10
4
  const config_1 = require("../config");
11
5
  const verify_sign_1 = require("../util/verify-sign");
12
- const legacyFn = (req) => {
13
- const data = req?.body ?? {};
14
- const params = req?.query ?? {};
15
- return { data, params };
16
- };
17
- const latestFn = (req) => {
18
- const now = Math.floor(Date.now() / 1000);
19
- const iat = Number(req.get('x-component-sig-iat'));
20
- const exp = Number(req.get('x-component-sig-exp'));
21
- if (Number.isNaN(iat) || Number.isNaN(exp)) {
22
- throw new Error('invalid sig');
23
- }
24
- if (exp < now) {
25
- throw new Error('expired sig');
26
- }
27
- const data = {
28
- iat,
29
- exp,
30
- body: req.body ?? {},
31
- query: req.query ?? {},
32
- method: req.method.toLowerCase(),
33
- url: (0, ufo_1.parseURL)(req.originalUrl).pathname,
34
- };
35
- return data;
36
- };
37
6
  const verifySig = (req, res, next) => {
38
7
  try {
39
- const sig = req.get('x-component-sig');
40
- const sigVersion = req.get('x-component-sig-version');
8
+ const { data, sig } = (0, verify_sign_1.getVerifyData)(req, 'component');
41
9
  if (!sig) {
42
10
  return res.status(400).json({ error: 'Bad Request' });
43
11
  }
44
- const getData = semver_1.default.gt(semver_1.default.coerce(sigVersion), semver_1.default.coerce(constant_1.SIG_VERSION.V0)) ? latestFn : legacyFn;
45
- const data = getData(req);
46
12
  const verified = (0, verify_sign_1.verify)(data, sig);
47
13
  if (!verified) {
48
14
  return res.status(401).json({ error: 'verify sig failed' });
@@ -5,8 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const axios_1 = __importDefault(require("axios"));
7
7
  const env_1 = require("@blocklet/env");
8
- const constant_1 = require("@blocklet/constant");
9
- const ufo_1 = require("ufo");
8
+ const qs_1 = __importDefault(require("qs"));
10
9
  const verify_sign_1 = require("./verify-sign");
11
10
  const componentApi = axios_1.default.create({
12
11
  timeout: 60 * 1000,
@@ -14,23 +13,20 @@ const componentApi = axios_1.default.create({
14
13
  'User-Agent': `BlockletSDK/${env_1.serverVersion}`,
15
14
  'x-blocklet-server-version': env_1.serverVersion,
16
15
  },
16
+ paramsSerializer: (params) => qs_1.default.stringify(params),
17
17
  });
18
18
  componentApi.interceptors.request.use((config) => {
19
- const iat = Math.floor(Date.now() / 1000);
20
- const exp = iat + 60 * 5;
21
- const data = {
22
- iat,
23
- exp,
24
- };
25
- data.body = config.data ?? {};
26
- data.query = config.params ?? {};
27
- data.method = config.method.toLowerCase();
28
- data.url = (0, ufo_1.parseURL)(config.url).pathname;
19
+ const { sig, exp, iat, version } = (0, verify_sign_1.getSignData)({
20
+ data: config.data,
21
+ method: config.method,
22
+ params: config.params,
23
+ url: config.url,
24
+ });
29
25
  config.headers['x-component-did'] = process.env.BLOCKLET_COMPONENT_DID;
30
- config.headers['x-component-sig'] = (0, verify_sign_1.sign)(data);
26
+ config.headers['x-component-sig'] = sig;
31
27
  config.headers['x-component-sig-iat'] = iat;
32
28
  config.headers['x-component-sig-exp'] = exp;
33
- config.headers['x-component-sig-version'] = constant_1.SIG_VERSION.DEFAULT;
29
+ config.headers['x-component-sig-version'] = version;
34
30
  return config;
35
31
  });
36
32
  exports.default = componentApi;
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 用于在 SDK 中像 blocklet-service 发起 http 请求
2
+ * 用于在 SDK 中向 blocklet-service 发起 http 请求
3
3
  * 该封装中,会在请求的 header 中增加签名信息,确保安全性(签名信息的验证由 blocklet-service 的接口去做验证)
4
4
  */
5
5
  declare const axios: import("axios").AxiosInstance;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  /**
3
- * 用于在 SDK 中像 blocklet-service 发起 http 请求
3
+ * 用于在 SDK 中向 blocklet-service 发起 http 请求
4
4
  * 该封装中,会在请求的 header 中增加签名信息,确保安全性(签名信息的验证由 blocklet-service 的接口去做验证)
5
5
  */
6
6
  var __importDefault = (this && this.__importDefault) || function (mod) {
@@ -9,8 +9,6 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
9
9
  Object.defineProperty(exports, "__esModule", { value: true });
10
10
  const axios_1 = __importDefault(require("axios"));
11
11
  const env_1 = require("@blocklet/env");
12
- const ufo_1 = require("ufo");
13
- const constant_1 = require("@blocklet/constant");
14
12
  const constants_1 = require("./constants");
15
13
  const verify_sign_1 = require("./verify-sign");
16
14
  const axios = axios_1.default.create({
@@ -28,22 +26,18 @@ const axios = axios_1.default.create({
28
26
  },
29
27
  });
30
28
  axios.interceptors.request.use((config) => {
31
- const iat = Math.floor(Date.now() / 1000);
32
- const exp = iat + 60 * 5;
29
+ const { sig, exp, iat, version } = (0, verify_sign_1.getSignData)({
30
+ data: config.data,
31
+ method: config.method,
32
+ params: config.params,
33
+ url: config.url,
34
+ });
33
35
  // 同时对 post 和 get 参数做签名,确保同时支持 post get 请求的校验
34
- const data = {
35
- iat,
36
- exp,
37
- };
38
- data.body = config.data ?? {};
39
- data.query = config.params ?? {};
40
- data.method = config.method.toLowerCase();
41
- data.url = (0, ufo_1.parseURL)(config.url).pathname;
42
36
  // 签名使用的是当前 blocklet 的 appSk,固命名为 x-blocklet-sig,以后可做统一使用
43
- config.headers['x-blocklet-sig'] = (0, verify_sign_1.sign)(data);
37
+ config.headers['x-blocklet-sig'] = sig;
44
38
  config.headers['x-blocklet-sig-iat'] = iat;
45
39
  config.headers['x-blocklet-sig-exp'] = exp;
46
- config.headers['x-blocklet-sig-version'] = constant_1.SIG_VERSION.DEFAULT;
40
+ config.headers['x-blocklet-sig-version'] = version;
47
41
  return config;
48
42
  });
49
43
  exports.default = axios;
@@ -1,4 +1,5 @@
1
1
  import { DIDTypeShortcut } from '@arcblock/did';
2
+ import type { Request } from 'express';
2
3
  declare const verify: (data: object, sig: string, { type, appSk, appPk, }?: {
3
4
  type?: DIDTypeShortcut;
4
5
  appSk?: string;
@@ -8,4 +9,20 @@ declare const sign: (data: object, { type, appSk, }?: {
8
9
  type?: DIDTypeShortcut;
9
10
  appSk?: string;
10
11
  }) => string;
11
- export { verify, sign };
12
+ type SignType = 'component' | 'blocklet';
13
+ declare const getVerifyData: (req: Request, type?: SignType) => {
14
+ sig: string;
15
+ data: object;
16
+ };
17
+ declare const getSignData: ({ data, params, method, url, }: {
18
+ data: object;
19
+ params: object;
20
+ method: string;
21
+ url: string;
22
+ }, signOptions?: object) => {
23
+ sig: string;
24
+ iat: number;
25
+ exp: number;
26
+ version: string;
27
+ };
28
+ export { verify, sign, getVerifyData, getSignData };
@@ -29,8 +29,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
29
29
  return (mod && mod.__esModule) ? mod : { "default": mod };
30
30
  };
31
31
  Object.defineProperty(exports, "__esModule", { value: true });
32
- exports.sign = exports.verify = void 0;
32
+ exports.getSignData = exports.getVerifyData = exports.sign = exports.verify = void 0;
33
33
  const json_stable_stringify_1 = __importDefault(require("json-stable-stringify"));
34
+ const ufo_1 = require("ufo");
35
+ const constant_1 = require("@blocklet/constant");
36
+ const semver_1 = __importDefault(require("semver"));
37
+ const qs_1 = __importDefault(require("qs"));
34
38
  const wallet_1 = __importStar(require("../wallet"));
35
39
  const verify = (data, sig, { type, appSk, appPk, } = {}) => {
36
40
  try {
@@ -57,3 +61,67 @@ const sign = (data, { type, appSk, } = {}) => {
57
61
  return wallet.sign((0, json_stable_stringify_1.default)(data || {}));
58
62
  };
59
63
  exports.sign = sign;
64
+ const getLatestFn = ({ iat, exp, body, query, method, url, }) => {
65
+ const now = Math.floor(Date.now() / 1000);
66
+ if (Number.isNaN(iat) || Number.isNaN(exp)) {
67
+ throw new Error('invalid sig');
68
+ }
69
+ if (exp < now) {
70
+ throw new Error('expired sig');
71
+ }
72
+ const data = {
73
+ iat,
74
+ exp,
75
+ body: body ?? {},
76
+ query: query ?? {},
77
+ method: method.toLowerCase(),
78
+ url: (0, ufo_1.parseURL)(url).pathname,
79
+ };
80
+ return data;
81
+ };
82
+ const getLegacyFn = ({ body, query, type = 'component' }) => {
83
+ // NOTICE: legacy 保持和原来一样,不做 parse 和 stringify 的处理了
84
+ const data = body ?? {};
85
+ const params = query ?? {};
86
+ if (type === 'blocklet') {
87
+ return { data, params };
88
+ }
89
+ return data;
90
+ };
91
+ const getVerifyData = (req, type = 'component') => {
92
+ const sig = req.get(`x-${type}-sig`);
93
+ const sigVersion = req.get(`x-${type}-sig-version`) || constant_1.SIG_VERSION.V0;
94
+ const iat = Number(req.get(`x-${type}-sig-iat`));
95
+ const exp = Number(req.get(`x-${type}-sig-exp`));
96
+ // NOTICE: 从 req 拿到的数据是经过 axios 和 JSON.parse 处理过的,所以 body 和 query 不需要再处理了
97
+ const { body, method, originalUrl: url, query } = req;
98
+ // FIXME: @zhanghan 2024-11-30 需要移除这个旧的兼容(提升总体的安全性)
99
+ const data = semver_1.default.gt(semver_1.default.coerce(sigVersion), semver_1.default.coerce(constant_1.SIG_VERSION.V0))
100
+ ? getLatestFn({ iat, exp, body, query, method, url })
101
+ : getLegacyFn({ body, query, type });
102
+ return { sig, data };
103
+ };
104
+ exports.getVerifyData = getVerifyData;
105
+ const getSignData = ({ data, params, method, url, }, signOptions) => {
106
+ const iat = Math.floor(Date.now() / 1000);
107
+ const exp = iat + 60 * 5;
108
+ const signSeed = {
109
+ iat,
110
+ exp,
111
+ };
112
+ // 此处的数据为了保持和 verify 一致,需要做一次 JSON.parse 和 qs.parse
113
+ signSeed.body = JSON.parse(JSON.stringify(data ?? {}));
114
+ // NOTICE: 为了保持和 verify 一致,需要做一次 qs.stringify 和 qs.parse
115
+ signSeed.query = qs_1.default.parse(qs_1.default.stringify(params ?? {}));
116
+ signSeed.method = method.toLowerCase();
117
+ signSeed.url = (0, ufo_1.parseURL)(url).pathname;
118
+ const sig = sign(signSeed, signOptions);
119
+ const version = constant_1.SIG_VERSION.DEFAULT;
120
+ return {
121
+ sig,
122
+ iat,
123
+ exp,
124
+ version,
125
+ };
126
+ };
127
+ exports.getSignData = getSignData;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.33-beta-20241030-102817-90ad7cd5",
6
+ "version": "1.16.33-beta-20241031-073543-49b1ff9b",
7
7
  "description": "graphql client to read/write data on abt node",
8
8
  "main": "lib/index.js",
9
9
  "typings": "lib/index.d.ts",
@@ -27,20 +27,20 @@
27
27
  "author": "linchen1987 <linchen.1987@foxmail.com> (http://github.com/linchen1987)",
28
28
  "license": "Apache-2.0",
29
29
  "dependencies": {
30
- "@abtnode/client": "1.16.33-beta-20241030-102817-90ad7cd5",
31
- "@abtnode/constant": "1.16.33-beta-20241030-102817-90ad7cd5",
32
- "@arcblock/did": "1.18.136",
33
- "@arcblock/did-auth": "1.18.136",
34
- "@arcblock/jwt": "1.18.136",
35
- "@arcblock/ws": "1.18.136",
36
- "@blocklet/constant": "1.16.33-beta-20241030-102817-90ad7cd5",
37
- "@blocklet/env": "1.16.33-beta-20241030-102817-90ad7cd5",
38
- "@blocklet/meta": "1.16.33-beta-20241030-102817-90ad7cd5",
30
+ "@abtnode/client": "1.16.33-beta-20241031-073543-49b1ff9b",
31
+ "@abtnode/constant": "1.16.33-beta-20241031-073543-49b1ff9b",
32
+ "@arcblock/did": "1.18.137",
33
+ "@arcblock/did-auth": "1.18.137",
34
+ "@arcblock/jwt": "1.18.137",
35
+ "@arcblock/ws": "1.18.137",
36
+ "@blocklet/constant": "1.16.33-beta-20241031-073543-49b1ff9b",
37
+ "@blocklet/env": "1.16.33-beta-20241031-073543-49b1ff9b",
38
+ "@blocklet/meta": "1.16.33-beta-20241031-073543-49b1ff9b",
39
39
  "@did-connect/authenticator": "^2.2.4",
40
40
  "@did-connect/handler": "^2.2.4",
41
41
  "@nedb/core": "^2.1.5",
42
- "@ocap/mcrypto": "1.18.136",
43
- "@ocap/wallet": "1.18.136",
42
+ "@ocap/mcrypto": "1.18.137",
43
+ "@ocap/wallet": "1.18.137",
44
44
  "axios": "^1.7.5",
45
45
  "cheerio": "1.0.0-rc.12",
46
46
  "debug": "^4.3.7",
@@ -50,6 +50,7 @@
50
50
  "jsonwebtoken": "^9.0.0",
51
51
  "lodash": "^4.17.21",
52
52
  "lru-cache": "^6.0.0",
53
+ "qs": "^6.13.0",
53
54
  "semver": "^7.6.3",
54
55
  "sitemap": "^8.0.0",
55
56
  "ufo": "^1.5.3",
@@ -77,5 +78,5 @@
77
78
  "ts-node": "^10.9.1",
78
79
  "typescript": "^5.6.3"
79
80
  },
80
- "gitHead": "13346a64f33be7432253dc7735f3d6f52878e9ac"
81
+ "gitHead": "5c2659700928afe90cd739b617aababda6593bdc"
81
82
  }