cloudbase.js 10 KB

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