@blocklet/sdk 1.16.33-beta-20241111-162739-f5906773 → 1.16.33-beta-20241112-095006-c0bb4e6b

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.
@@ -73,6 +73,6 @@ declare const _default: {
73
73
  signedToken?: boolean;
74
74
  }) => (req: import("express").Request & {
75
75
  user?: import("../util/login").SessionUser;
76
- }, res: import("express").Response, next: import("express").NextFunction) => void | import("express").Response<any, Record<string, any>>;
76
+ }, res: import("express").Response, next: import("express").NextFunction) => Promise<void>;
77
77
  };
78
78
  export default _default;
@@ -8,5 +8,5 @@ type SessionOptions = {
8
8
  };
9
9
  declare const sessionMiddleware: (options?: SessionOptions) => (req: Request & {
10
10
  user?: SessionUser;
11
- }, res: Response, next: NextFunction) => void | Response<any, Record<string, any>>;
11
+ }, res: Response, next: NextFunction) => Promise<void>;
12
12
  export = sessionMiddleware;
@@ -1,95 +1,32 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
- const constant_1 = require("@blocklet/constant");
6
- const mcrypto_1 = require("@ocap/mcrypto");
7
- const jwt_1 = require("@arcblock/jwt");
8
- const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
9
- const login_1 = require("../util/login");
10
- const verify_sign_1 = require("../util/verify-sign");
11
- const wallet_1 = __importDefault(require("../wallet"));
2
+ const verify_session_1 = require("../util/verify-session");
12
3
  const sessionMiddleware = (options = {}) => {
13
- const wallet = (0, wallet_1.default)();
14
- const secret = mcrypto_1.Hasher.SHA3.hash256(Buffer.concat([wallet.secretKey, wallet.address].map((v) => Buffer.from(v))));
15
4
  const { loginToken = true, componentCall = false, signedToken = '', strictMode = false } = options;
16
- return (req, res, next) => {
17
- // authenticate by login token
18
- if (loginToken) {
19
- const token = req.cookies.login_token;
20
- if (token) {
21
- return jsonwebtoken_1.default.verify(token, secret, (err, decoded) => {
22
- if (err) {
23
- if (strictMode) {
24
- res.status(401).json({ message: 'Unauthorized: Invalid login token' });
25
- }
26
- else {
27
- next();
28
- }
29
- }
30
- else {
31
- const { did, role, fullName, provider = constant_1.LOGIN_PROVIDER.WALLET, walletOS, kyc = 0 } = decoded;
32
- req.user = {
33
- did,
34
- role,
35
- fullName,
36
- provider,
37
- walletOS,
38
- ...(0, login_1.decodeKycStatus)(Number(kyc) || 0),
39
- method: 'loginToken',
40
- };
41
- next();
42
- }
43
- });
5
+ return async (req, res, next) => {
6
+ let result = null;
7
+ try {
8
+ // authenticate by login token
9
+ if (loginToken) {
10
+ result = await (0, verify_session_1.verifyLoginToken)({ token: req.cookies.login_token, strictMode });
44
11
  }
45
- }
46
- // authenticate by component call
47
- if (componentCall) {
48
- const { sig, data } = (0, verify_sign_1.getVerifyData)(req);
49
- if (sig) {
50
- if ((0, verify_sign_1.verify)(data, sig) === false) {
51
- if (strictMode) {
52
- return res.status(401).json({ error: 'Unauthorized: Invalid signature' });
53
- }
54
- return next();
55
- }
56
- req.user = {
57
- did: req.get('x-component-did'),
58
- role: 'component',
59
- provider: 'wallet',
60
- fullName: req.get('x-component-did'),
61
- walletOS: 'embed',
62
- emailVerified: false,
63
- phoneVerified: false,
64
- method: 'componentCall',
65
- };
66
- return next();
12
+ // authenticate by component call
13
+ if (!result && componentCall) {
14
+ result = (0, verify_session_1.verifyComponentCall)({ req, strictMode });
67
15
  }
68
- }
69
- // authenticate by signed tmp token: which expires in 5 minutes
70
- if (signedToken) {
71
- const token = req.query.__jwt || '';
72
- if (token) {
73
- if ((0, jwt_1.verify)(token, secret) === false) {
74
- if (strictMode) {
75
- return res.status(401).json({ error: 'Unauthorized: Invalid signed token' });
76
- }
77
- return next();
78
- }
79
- req.user = {
80
- did: wallet.address,
81
- role: 'component',
82
- provider: 'wallet',
83
- fullName: wallet.address,
84
- walletOS: 'embed',
85
- emailVerified: false,
86
- phoneVerified: false,
87
- method: 'signedToken',
88
- };
89
- return next();
16
+ // authenticate by signed tmp token: which expires in 5 minutes
17
+ if (!result && signedToken) {
18
+ const token = req.query.__jwt || '';
19
+ result = (0, verify_session_1.verifySignedToken)({ token, strictMode });
90
20
  }
91
21
  }
92
- return next();
22
+ catch (err) {
23
+ res.status(401).json({ error: err.message });
24
+ return;
25
+ }
26
+ if (result) {
27
+ req.user = result;
28
+ }
29
+ next();
93
30
  };
94
31
  };
95
32
  module.exports = sessionMiddleware;
@@ -0,0 +1,13 @@
1
+ import { SessionUser } from './login';
2
+ export declare function verifyLoginToken({ token, strictMode }: {
3
+ token: any;
4
+ strictMode: any;
5
+ }): Promise<SessionUser | null>;
6
+ export declare function verifyComponentCall({ req, strictMode }: {
7
+ req: any;
8
+ strictMode: any;
9
+ }): SessionUser | null;
10
+ export declare function verifySignedToken({ token, strictMode }: {
11
+ token: any;
12
+ strictMode: any;
13
+ }): SessionUser | null;
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.verifyLoginToken = verifyLoginToken;
7
+ exports.verifyComponentCall = verifyComponentCall;
8
+ exports.verifySignedToken = verifySignedToken;
9
+ const constant_1 = require("@blocklet/constant");
10
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
11
+ const mcrypto_1 = require("@ocap/mcrypto");
12
+ const jwt_1 = require("@arcblock/jwt");
13
+ const login_1 = require("./login");
14
+ const wallet_1 = __importDefault(require("../wallet"));
15
+ const verify_sign_1 = require("./verify-sign");
16
+ function verifyLoginToken({ token, strictMode }) {
17
+ if (!token)
18
+ return null;
19
+ const wallet = (0, wallet_1.default)();
20
+ const secret = mcrypto_1.Hasher.SHA3.hash256(Buffer.concat([wallet.secretKey, wallet.address].map((v) => Buffer.from(v))));
21
+ return new Promise((resolve, reject) => {
22
+ jsonwebtoken_1.default.verify(token, secret, (err, decoded) => {
23
+ if (err) {
24
+ if (strictMode) {
25
+ reject(new Error('Unauthorized: Invalid login token'));
26
+ }
27
+ resolve(null);
28
+ return;
29
+ }
30
+ const { did, role, fullName, provider = constant_1.LOGIN_PROVIDER.WALLET, walletOS, kyc = 0 } = decoded;
31
+ resolve({
32
+ did,
33
+ role,
34
+ fullName,
35
+ provider,
36
+ walletOS,
37
+ ...(0, login_1.decodeKycStatus)(Number(kyc) || 0),
38
+ method: 'loginToken',
39
+ });
40
+ });
41
+ });
42
+ }
43
+ function verifyComponentCall({ req, strictMode }) {
44
+ const { sig, data } = (0, verify_sign_1.getVerifyData)(req);
45
+ if (!sig)
46
+ return null;
47
+ if ((0, verify_sign_1.verify)(data, sig) === false) {
48
+ if (strictMode) {
49
+ throw new Error('Unauthorized: Invalid signature');
50
+ }
51
+ return null;
52
+ }
53
+ return {
54
+ did: req.get('x-component-did'),
55
+ role: 'component',
56
+ provider: 'wallet',
57
+ fullName: req.get('x-component-did'),
58
+ walletOS: 'embed',
59
+ emailVerified: false,
60
+ phoneVerified: false,
61
+ method: 'componentCall',
62
+ };
63
+ }
64
+ function verifySignedToken({ token, strictMode }) {
65
+ if (!token)
66
+ return null;
67
+ const wallet = (0, wallet_1.default)();
68
+ const secret = mcrypto_1.Hasher.SHA3.hash256(Buffer.concat([wallet.secretKey, wallet.address].map((v) => Buffer.from(v))));
69
+ if ((0, jwt_1.verify)(token, secret) === false) {
70
+ if (strictMode) {
71
+ throw new Error('Unauthorized: Invalid signed token');
72
+ }
73
+ return null;
74
+ }
75
+ return {
76
+ did: wallet.address,
77
+ role: 'component',
78
+ provider: 'wallet',
79
+ fullName: wallet.address,
80
+ walletOS: 'embed',
81
+ emailVerified: false,
82
+ phoneVerified: false,
83
+ method: 'signedToken',
84
+ };
85
+ }
package/lib/wallet.js CHANGED
@@ -1,7 +1,14 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  const wallet_1 = require("@ocap/wallet");
3
6
  const mcrypto_1 = require("@ocap/mcrypto");
4
7
  const did_1 = require("@arcblock/did");
8
+ const lru_cache_1 = __importDefault(require("lru-cache"));
9
+ // NOTICE: 1 个应用的 sdk 运行时最多 4 个钱包
10
+ // 此处 cache 只是优化性能的手段,即使 miss 也不会造成任何错误,最终决定设置 size 为 4
11
+ const cacheWallet = new lru_cache_1.default({ max: 4, maxAge: 60 * 1000 });
5
12
  /**
6
13
  * @param {string} [type=process.env.CHAIN_TYPE] can only be 'eth|ethereum' or 'default|arcblock'
7
14
  * @param {string} [appSk=process.env.BLOCKLET_APP_SK] must be hex
@@ -13,6 +20,10 @@ const getWallet = (type, appSk = process.env.BLOCKLET_APP_SK) => {
13
20
  // BLOCKLET_WALLET_TYPE is for backward compatibility
14
21
  // eslint-disable-next-line no-param-reassign
15
22
  type = type || process.env.CHAIN_TYPE || process.env.BLOCKLET_WALLET_TYPE;
23
+ const cacheKey = [type, appSk].join('_');
24
+ const cache = cacheWallet.get(cacheKey);
25
+ if (cache)
26
+ return cache;
16
27
  if ((0, did_1.isEthereumType)((0, did_1.DidType)(type))) {
17
28
  sk = appSk.slice(0, 66);
18
29
  t = (0, wallet_1.WalletType)(type);
@@ -21,7 +32,9 @@ const getWallet = (type, appSk = process.env.BLOCKLET_APP_SK) => {
21
32
  sk = appSk;
22
33
  t = (0, wallet_1.WalletType)({ role: mcrypto_1.types.RoleType.ROLE_APPLICATION, pk: mcrypto_1.types.KeyType.ED25519, hash: mcrypto_1.types.HashType.SHA3 });
23
34
  }
24
- return (0, wallet_1.fromSecretKey)(sk, t);
35
+ const currentWallet = (0, wallet_1.fromSecretKey)(sk, t);
36
+ cacheWallet.set(cacheKey, currentWallet);
37
+ return currentWallet;
25
38
  };
26
39
  // BLOCKLET_WALLET_TYPE is for backward compatibility
27
40
  const getPermanentWallet = () => getWallet(process.env.CHAIN_TYPE || process.env.BLOCKLET_WALLET_TYPE, process.env.BLOCKLET_APP_PSK);
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "1.16.33-beta-20241111-162739-f5906773",
6
+ "version": "1.16.33-beta-20241112-095006-c0bb4e6b",
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,15 +27,15 @@
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-20241111-162739-f5906773",
31
- "@abtnode/constant": "1.16.33-beta-20241111-162739-f5906773",
30
+ "@abtnode/client": "1.16.33-beta-20241112-095006-c0bb4e6b",
31
+ "@abtnode/constant": "1.16.33-beta-20241112-095006-c0bb4e6b",
32
32
  "@arcblock/did": "1.18.139",
33
33
  "@arcblock/did-auth": "1.18.139",
34
34
  "@arcblock/jwt": "1.18.139",
35
35
  "@arcblock/ws": "1.18.139",
36
- "@blocklet/constant": "1.16.33-beta-20241111-162739-f5906773",
37
- "@blocklet/env": "1.16.33-beta-20241111-162739-f5906773",
38
- "@blocklet/meta": "1.16.33-beta-20241111-162739-f5906773",
36
+ "@blocklet/constant": "1.16.33-beta-20241112-095006-c0bb4e6b",
37
+ "@blocklet/env": "1.16.33-beta-20241112-095006-c0bb4e6b",
38
+ "@blocklet/meta": "1.16.33-beta-20241112-095006-c0bb4e6b",
39
39
  "@did-connect/authenticator": "^2.2.4",
40
40
  "@did-connect/handler": "^2.2.4",
41
41
  "@nedb/core": "^2.1.5",
@@ -79,5 +79,5 @@
79
79
  "ts-node": "^10.9.1",
80
80
  "typescript": "^5.6.3"
81
81
  },
82
- "gitHead": "de1be92a37cd504e82b3d963b5b4d5302ecbb887"
82
+ "gitHead": "60cc6bf9891c7b3995b312841c41562e1a360f21"
83
83
  }