cloudbase.js 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. "use strict";
  2. var __rest = (this && this.__rest) || function (s, e) {
  3. var t = {};
  4. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
  5. t[p] = s[p];
  6. if (s != null && typeof Object.getOwnPropertySymbols === "function")
  7. for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
  8. if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
  9. t[p[i]] = s[p[i]];
  10. }
  11. return t;
  12. };
  13. Object.defineProperty(exports, "__esModule", { value: true });
  14. const database_1 = require("@cloudbase/database");
  15. const functions_1 = require("./functions");
  16. const auth_1 = require("./auth");
  17. const wx_1 = require("./wx");
  18. const storage_1 = require("./storage");
  19. const dbRequest_1 = require("./utils/dbRequest");
  20. const log_1 = require("./log");
  21. const code_1 = require("./const/code");
  22. const utils_1 = require("./utils/utils");
  23. class CloudBase {
  24. static parseContext(context) {
  25. if (typeof context !== 'object') {
  26. throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_CONTEXT, { message: 'context 必须为对象类型' }));
  27. }
  28. let { memory_limit_in_mb, time_limit_in_ms, request_id, environ, function_version, namespace, function_name, environment } = context;
  29. let parseResult = {};
  30. try {
  31. parseResult.memoryLimitInMb = memory_limit_in_mb;
  32. parseResult.timeLimitIns = time_limit_in_ms;
  33. parseResult.requestId = request_id;
  34. parseResult.functionVersion = function_version;
  35. parseResult.namespace = namespace;
  36. parseResult.functionName = function_name;
  37. // 存在environment 为新架构 上新字段 JSON序列化字符串
  38. if (environment) {
  39. parseResult.environment = JSON.parse(environment);
  40. return parseResult;
  41. }
  42. // 不存在environment 则为老字段,老架构上存在bug,无法识别value含特殊字符(若允许特殊字符,影响解析,这里特殊处理)
  43. const parseEnviron = environ.split(';');
  44. let parseEnvironObj = {};
  45. for (let i in parseEnviron) {
  46. // value含分号影响切割,未找到= 均忽略
  47. if (parseEnviron[i].indexOf('=') >= 0) {
  48. const equalIndex = parseEnviron[i].indexOf('=');
  49. const key = parseEnviron[i].slice(0, equalIndex);
  50. let value = parseEnviron[i].slice(equalIndex + 1);
  51. // value 含, 为数组
  52. if (value.indexOf(',') >= 0) {
  53. value = value.split(',');
  54. }
  55. parseEnvironObj[key] = value;
  56. }
  57. }
  58. parseResult.environ = parseEnvironObj;
  59. }
  60. catch (err) {
  61. throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_CONTEXT));
  62. }
  63. CloudBase.scfContext = parseResult;
  64. return parseResult;
  65. }
  66. /**
  67. * 获取当前函数内的所有环境变量(作为获取变量的统一方法,取值来源process.env 和 context)
  68. */
  69. static getCloudbaseContext(context) {
  70. // WX_CONTEXT_ENV WX_APPID WX_OPENID WX_UNIONID WX_API_TOKEN
  71. // TCB_CONTEXT_ENV TCB_ENV TCB_SEQID TRIGGER_SRC LOGINTYPE QQ_OPENID QQ_APPID TCB_UUID TCB_ISANONYMOUS_USER TCB_SESSIONTOKEN TCB_CUSTOM_USER_ID TCB_SOURCE_IP TCB_SOURCE TCB_ROUTE_KEY TCB_HTTP_CONTEXT TCB_CONTEXT_CNFG
  72. // 解析process.env
  73. const { TENCENTCLOUD_RUNENV, SCF_NAMESPACE, TCB_CONTEXT_KEYS, TENCENTCLOUD_SECRETID, TENCENTCLOUD_SECRETKEY, TENCENTCLOUD_SESSIONTOKEN, TRIGGER_SRC, WX_CONTEXT_KEYS, WX_TRIGGER_API_TOKEN_V0, WX_CLIENTIP, WX_CLIENTIPV6, _SCF_TCB_LOG, TCB_CONTEXT_CNFG, LOGINTYPE } = process.env;
  74. let contextEnv = {};
  75. if (context) {
  76. const { environment, environ } = CloudBase.parseContext(context);
  77. contextEnv = environment || environ || {};
  78. }
  79. // 从TCB_CONTEXT_KEYS 和 WX_CONTEXT_KEYS中解析环境变量 取值优先级为 context > process.env
  80. const tcb_context_keys = contextEnv.TCB_CONTEXT_KEYS || TCB_CONTEXT_KEYS;
  81. const wx_context_keys = contextEnv.WX_CONTEXT_KEYS || WX_CONTEXT_KEYS;
  82. let rawContext = {
  83. TENCENTCLOUD_RUNENV,
  84. SCF_NAMESPACE,
  85. TCB_CONTEXT_KEYS,
  86. TENCENTCLOUD_SECRETID,
  87. TENCENTCLOUD_SECRETKEY,
  88. TENCENTCLOUD_SESSIONTOKEN,
  89. TRIGGER_SRC,
  90. WX_TRIGGER_API_TOKEN_V0,
  91. WX_CLIENTIP,
  92. WX_CLIENTIPV6,
  93. WX_CONTEXT_KEYS,
  94. _SCF_TCB_LOG,
  95. TCB_CONTEXT_CNFG,
  96. LOGINTYPE
  97. };
  98. // 遍历keys
  99. if (tcb_context_keys) {
  100. try {
  101. const tcbKeysList = tcb_context_keys.split(',');
  102. for (let item of tcbKeysList) {
  103. rawContext[item] = contextEnv[item] || process.env[item];
  104. }
  105. }
  106. catch (e) { }
  107. }
  108. if (wx_context_keys) {
  109. try {
  110. const wxKeysList = wx_context_keys.split(',');
  111. for (let item of wxKeysList) {
  112. rawContext[item] = contextEnv[item] || process.env[item];
  113. }
  114. }
  115. catch (e) { }
  116. }
  117. rawContext = Object.assign({}, rawContext, contextEnv);
  118. let finalContext = {};
  119. for (let key in rawContext) {
  120. if (rawContext[key] !== undefined) {
  121. finalContext[key] = rawContext[key];
  122. }
  123. }
  124. return finalContext;
  125. }
  126. constructor(config) {
  127. this.init(config);
  128. }
  129. init(config = {}) {
  130. let { debug, secretId, secretKey, sessionToken, env, timeout, headers = {}, throwOnCode } = config, restConfig = __rest(config, ["debug", "secretId", "secretKey", "sessionToken", "env", "timeout", "headers", "throwOnCode"]);
  131. if ((secretId && !secretKey) || (!secretId && secretKey)) {
  132. throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'secretId and secretKey must be a pair' }));
  133. }
  134. const newConfig = Object.assign({}, restConfig, { debug: !!debug, secretId: secretId, secretKey: secretKey, sessionToken: sessionToken, envName: env, headers: Object.assign({}, headers), timeout: timeout || 15000, throwOnCode: throwOnCode !== undefined ? throwOnCode : true });
  135. this.config = newConfig;
  136. this.extensionMap = {};
  137. }
  138. registerExtension(ext) {
  139. this.extensionMap[ext.name] = ext;
  140. }
  141. async invokeExtension(name, opts) {
  142. const ext = this.extensionMap[name];
  143. if (!ext) {
  144. throw Error(`扩展${name} 必须先注册`);
  145. }
  146. return ext.invoke(opts, this);
  147. }
  148. database(dbConfig = {}) {
  149. database_1.Db.reqClass = dbRequest_1.DBRequest;
  150. // 兼容方法预处理
  151. if (Object.prototype.toString.call(dbConfig).slice(8, -1) !== 'Object') {
  152. throw utils_1.E(Object.assign({}, code_1.ERROR.INVALID_PARAM, { message: 'dbConfig must be an object' }));
  153. }
  154. if (dbConfig && dbConfig.env) {
  155. // env变量名转换
  156. dbConfig.envName = dbConfig.env;
  157. delete dbConfig.env;
  158. }
  159. return new database_1.Db(Object.assign({}, this.config, dbConfig));
  160. }
  161. /**
  162. * 调用云函数
  163. *
  164. * @param param0
  165. * @param opts
  166. */
  167. callFunction({ name, data }, opts) {
  168. return functions_1.callFunction(this, { name, data }, opts);
  169. }
  170. auth() {
  171. return auth_1.auth(this);
  172. }
  173. /**
  174. * openapi调用
  175. *
  176. * @param param0
  177. * @param opts
  178. */
  179. callWxOpenApi({ apiName, apiOptions, cgiName, requestData }, opts) {
  180. return wx_1.callWxOpenApi(this, { apiName, apiOptions, cgiName, requestData }, opts);
  181. }
  182. /**
  183. * wxpayapi调用
  184. *
  185. * @param param0
  186. * @param opts
  187. */
  188. callWxPayApi({ apiName, apiOptions, cgiName, requestData }, opts) {
  189. return wx_1.callWxPayApi(this, { apiName, apiOptions, cgiName, requestData }, opts);
  190. }
  191. /**
  192. * 微信云调用
  193. *
  194. * @param param0
  195. * @param opts
  196. */
  197. callCompatibleWxOpenApi({ apiName, apiOptions, cgiName, requestData }, opts) {
  198. return wx_1.callCompatibleWxOpenApi(this, { apiName, apiOptions, cgiName, requestData }, opts);
  199. }
  200. /**
  201. * 上传文件
  202. *
  203. * @param param0
  204. * @param opts
  205. */
  206. uploadFile({ cloudPath, fileContent }, opts) {
  207. return storage_1.uploadFile(this, { cloudPath, fileContent }, opts);
  208. }
  209. /**
  210. * 删除文件
  211. *
  212. * @param param0
  213. * @param opts
  214. */
  215. deleteFile({ fileList }, opts) {
  216. return storage_1.deleteFile(this, { fileList }, opts);
  217. }
  218. /**
  219. * 获取临时连接
  220. *
  221. * @param param0
  222. * @param opts
  223. */
  224. getTempFileURL({ fileList }, opts) {
  225. return storage_1.getTempFileURL(this, { fileList }, opts);
  226. }
  227. /**
  228. * 下载文件
  229. *
  230. * @param params
  231. * @param opts
  232. */
  233. downloadFile(params, opts) {
  234. return storage_1.downloadFile(this, params, opts);
  235. }
  236. /**
  237. * 获取上传元数据
  238. *
  239. * @param param0
  240. * @param opts
  241. */
  242. getUploadMetadata({ cloudPath }, opts) {
  243. return storage_1.getUploadMetadata(this, { cloudPath }, opts);
  244. }
  245. getFileAuthority({ fileList }, opts) {
  246. return storage_1.getFileAuthority(this, { fileList }, opts);
  247. }
  248. /**
  249. * 获取logger
  250. *
  251. */
  252. logger() {
  253. if (!this.clsLogger) {
  254. this.clsLogger = log_1.logger();
  255. }
  256. return this.clsLogger;
  257. }
  258. }
  259. exports.CloudBase = CloudBase;