qq-server-sdk
Advanced tools
| interface deleteFileOptions { | ||
| fileList: Array<string>; | ||
| } | ||
| declare function deleteFile(options: deleteFileOptions, config: any): Promise<{ | ||
| fileList: any; | ||
| requestId: any; | ||
| }>; | ||
| export { deleteFile }; |
| interface downloadFileOptions { | ||
| fileID: string; | ||
| } | ||
| declare function downloadFile(options: downloadFileOptions, config: any): Promise<{ | ||
| statusCode: number; | ||
| fileContent: any; | ||
| }>; | ||
| export { downloadFile }; |
| interface getTempFileURLOptions { | ||
| fileList: Array<string>; | ||
| } | ||
| declare function getTempFileURL(options: getTempFileURLOptions, config: any): Promise<{ | ||
| fileList: any; | ||
| requestId: any; | ||
| }>; | ||
| export { getTempFileURL }; |
| import { uploadFile } from './uploadFile'; | ||
| import { getTempFileURL } from './getTempFileURL'; | ||
| import { deleteFile } from './deleteFile'; | ||
| import { downloadFile } from './downloadFile'; | ||
| export { uploadFile, getTempFileURL, deleteFile, downloadFile }; |
| /// <reference types="node" /> | ||
| import { ReadStream } from 'fs'; | ||
| interface uploadFileOptions { | ||
| cloudPath: string; | ||
| fileContent: Buffer | ReadStream; | ||
| } | ||
| declare function uploadFile(options: uploadFileOptions, config: any): Promise<{ | ||
| fileID: any; | ||
| requestId: any; | ||
| statusCode: number; | ||
| }>; | ||
| export { uploadFile }; |
| declare function logger(): any; | ||
| export { logger }; |
+10
-0
| # ChangeLog (QQMiniApp/qq-server-sdk) | ||
| ## [2020-04-10, Version 1.0.3](http://git.code.oa.com/QQMiniApp/qq-server-sdk/-/tags/1.0.3) | ||
| ### Bug fixes | ||
| - [[```dd7378bd```](http://git.code.oa.com/QQMiniApp/qq-server-sdk/commit/dd7378bdf44f6545dbbb3a0af85d8b9f599ebee3)] __-__ cloud.init参数修复 (loviselu) | ||
| ## [2020-04-10, Version 1.0.2](http://git.code.oa.com/QQMiniApp/qq-server-sdk/-/tags/1.0.2) | ||
@@ -4,0 +14,0 @@ |
+255
-51
@@ -298,3 +298,3 @@ module.exports = | ||
| const errCode = err ? err.errCode : undefined; | ||
| const errMsg = ((err === null || err === void 0 ? void 0 : err.errMsg) || err.toString() || 'unknown error') + '; ' + appendMsg; | ||
| const errMsg = (err ? err.errMsg || err.toString() || 'unknown error' : '') + '; ' + appendMsg; | ||
| return new error_CloudSDKError({ | ||
@@ -312,7 +312,3 @@ errCode, | ||
| function returnAsFinalCloudSDKError(err, apiName) { | ||
| if (err && isSDKError(err)) { | ||
| return err; | ||
| } | ||
| const e = returnAsCloudSDKError(err, `at ${apiName} api; `); | ||
| const e = returnAsCloudSDKError(err); | ||
| e.errMsg = apiFailMsg(apiName, e.errMsg); | ||
@@ -506,2 +502,11 @@ return e; | ||
| } | ||
| } // eslint-disable-next-line max-params | ||
| function assertArrayNotEmpty(target, name, funcName, ErrorClass = error_CloudSDKError) { | ||
| if (!Array.isArray(target) || target.length === 0) { | ||
| throw new ErrorClass({ | ||
| errMsg: `parameter ${name} of function ${funcName} must be a none empty array` | ||
| }); | ||
| } | ||
| } | ||
@@ -518,9 +523,9 @@ | ||
| if (!options) { | ||
| throw returnAsFinalCloudSDKError({ | ||
| errMsg: 'Params for callFunction must be an object instead of ' + typeof options | ||
| }, apiName); | ||
| } | ||
| try { | ||
| if (!options) { | ||
| throw { | ||
| errMsg: 'Params for callFunction must be an object instead of ' + typeof options | ||
| }; | ||
| } | ||
| try { | ||
| assertType(options, { | ||
@@ -535,25 +540,220 @@ name: 'string' | ||
| } | ||
| const res = await this.getTcbInstance({ | ||
| config: options.config, | ||
| type: 'function' | ||
| }).callFunction({ | ||
| name: options.name, | ||
| data: options.data | ||
| }); | ||
| if (res.code && TCB_ERR_CODE[res.code] !== 0) { | ||
| throw { | ||
| errCode: TCB_ERR_CODE[res.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: `requestID ${res.requestId}, ${res.message}`, | ||
| requestId: res.requestId | ||
| }; | ||
| } else { | ||
| return { | ||
| result: res.result, | ||
| requestId: res.requestId | ||
| }; | ||
| } | ||
| } catch (err) { | ||
| throw returnAsFinalCloudSDKError(err, apiName); | ||
| } | ||
| } | ||
| const res = await this.getTcbInstance({ | ||
| config: options.config, | ||
| type: 'function' | ||
| }).callFunction({ | ||
| name: options.name, | ||
| data: options.data | ||
| }); | ||
| if (res.code && TCB_ERR_CODE[res.code] !== 0) { | ||
| throw returnAsFinalCloudSDKError({ | ||
| errCode: TCB_ERR_CODE[res.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: `requestID ${res.requestId}, ${res.message}`, | ||
| requestId: res.requestId | ||
| }, apiName); | ||
| } else { | ||
| // CONCATENATED MODULE: ./src/tool/getQQContext.ts | ||
| function getQQContext() { | ||
| const qqContext = { | ||
| OPENID: process.env.QQ_OPENID, | ||
| APPID: process.env.QQ_APPID, | ||
| ENV: process.env.TCB_ENV || process.env.SCF_NAMESPACE, | ||
| // SOURCE: process.env.TCB_SOURCE, //QQ环境下这个值不准,先不返回 | ||
| CLIENTIP: process.env.TCB_SOURCE_IP || '' | ||
| }; | ||
| return qqContext; | ||
| } | ||
| // CONCATENATED MODULE: ./src/tool/logger.ts | ||
| function logger() { | ||
| return external_tcb_admin_node_["logger"](); | ||
| } | ||
| // CONCATENATED MODULE: ./src/storage/uploadFile.ts | ||
| async function uploadFile(options, config) { | ||
| const apiName = 'uploadFile'; | ||
| try { | ||
| const tcbInstance = this.getTcbInstance(config); | ||
| let statusCode = 200; | ||
| assertRequiredParam(options.cloudPath, 'cloudPath', apiName); | ||
| assertRequiredParam(options.fileContent, 'fileContent', apiName); | ||
| const res = await tcbInstance.uploadFile({ | ||
| cloudPath: options.cloudPath, | ||
| fileContent: options.fileContent | ||
| }, { | ||
| onResponseReceived(resp) { | ||
| statusCode = resp ? resp.statusCode : statusCode; | ||
| } | ||
| }); | ||
| if (res.code && TCB_ERR_CODE[res.code] !== 0) { | ||
| throw { | ||
| errCode: TCB_ERR_CODE[res.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: res.message | ||
| }; | ||
| } else { | ||
| return { | ||
| fileID: res.fileID, | ||
| requestId: res.requestId, | ||
| statusCode | ||
| }; | ||
| } | ||
| } catch (err) { | ||
| throw returnAsFinalCloudSDKError(err, apiName); | ||
| } | ||
| } | ||
| // CONCATENATED MODULE: ./src/storage/getTempFileURL.ts | ||
| async function getTempFileURL(options, config) { | ||
| const apiName = 'getTempFileURL'; | ||
| try { | ||
| assertArrayNotEmpty(options.fileList, 'fileList', apiName); | ||
| const tcbInstance = this.getTcbInstance(config); | ||
| const res = await tcbInstance.getTempFileURL({ | ||
| fileList: options.fileList | ||
| }); | ||
| if (res.code && TCB_ERR_CODE[res.code] !== 0) { | ||
| throw { | ||
| errCode: TCB_ERR_CODE[res.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: res.message | ||
| }; | ||
| } else { | ||
| const fileList = (res.fileList || []).filter(s => Boolean(s)).map((f, i) => { | ||
| if (f.code && TCB_ERR_CODE[f.code] !== 0) { | ||
| const code = TCB_ERR_CODE[f.code] || TCB_ERR_CODE.SYS_ERR; | ||
| return { | ||
| fileID: f.fileID, | ||
| status: TCB_ERR_CODE[f.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: ERR_CODE[code], | ||
| maxAge: f.maxAge, | ||
| tempFileURL: '' | ||
| }; | ||
| } | ||
| return { | ||
| fileID: f.fileID, | ||
| status: 0, | ||
| errMsg: 'ok', | ||
| maxAge: f.maxAge, | ||
| tempFileURL: f.tempFileURL | ||
| }; | ||
| }); | ||
| return { | ||
| fileList: fileList, | ||
| requestId: res.requestId | ||
| }; | ||
| } | ||
| } catch (err) { | ||
| throw returnAsFinalCloudSDKError(err, apiName); | ||
| } | ||
| } | ||
| // CONCATENATED MODULE: ./src/storage/deleteFile.ts | ||
| async function deleteFile(options, config) { | ||
| const apiName = 'deleteFile'; | ||
| try { | ||
| assertArrayNotEmpty(options.fileList, 'fileList', apiName); | ||
| const tcbInstance = this.getTcbInstance(config); | ||
| const res = await tcbInstance.deleteFile({ | ||
| fileList: options.fileList | ||
| }); | ||
| if (res.code && TCB_ERR_CODE[res.code] !== 0) { | ||
| throw { | ||
| errCode: TCB_ERR_CODE[res.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: res.message | ||
| }; | ||
| } else { | ||
| const fileList = (res.fileList || []).filter(s => Boolean(s)).map(f => { | ||
| if (f.code && TCB_ERR_CODE[f.code] !== 0) { | ||
| const code = TCB_ERR_CODE[f.code] || TCB_ERR_CODE.SYS_ERR; | ||
| return { | ||
| fileID: f.fileID, | ||
| status: TCB_ERR_CODE[f.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: ERR_CODE[code] | ||
| }; | ||
| } | ||
| return { | ||
| fileID: f.fileID, | ||
| status: 0, | ||
| errMsg: 'ok' | ||
| }; | ||
| }); | ||
| return { | ||
| fileList: fileList, | ||
| requestId: res.requestId | ||
| }; | ||
| } | ||
| } catch (err) { | ||
| throw returnAsFinalCloudSDKError(err, apiName); | ||
| } | ||
| } | ||
| // CONCATENATED MODULE: ./src/storage/downloadFile.ts | ||
| async function downloadFile(options, config) { | ||
| const apiName = 'downloadFile'; | ||
| try { | ||
| assertType(options.fileID, 'string', 'fileID'); | ||
| const tcbInstance = this.getTcbInstance(config); | ||
| const statusCode = 200; | ||
| const res = await tcbInstance.downloadFile({ | ||
| fileID: options.fileID | ||
| }); | ||
| if (res.code && TCB_ERR_CODE[res.code] !== 0) { | ||
| throw { | ||
| errCode: TCB_ERR_CODE[res.code] || TCB_ERR_CODE.SYS_ERR, | ||
| errMsg: res.message || res.code | ||
| }; | ||
| } | ||
| return { | ||
| result: res.result, | ||
| requestId: res.requestId | ||
| statusCode: statusCode, | ||
| fileContent: res.fileContent | ||
| }; | ||
| } catch (err) { | ||
| throw returnAsFinalCloudSDKError(err, apiName); | ||
| } | ||
@@ -563,26 +763,8 @@ } | ||
| // CONCATENATED MODULE: ./src/tool/getQQContext.ts | ||
| // CONCATENATED MODULE: ./src/storage/index.ts | ||
| function getQQContext(context) { | ||
| const { | ||
| environment, | ||
| environ | ||
| } = external_tcb_admin_node_["parseContext"](context); | ||
| const env = environment || environ || {}; | ||
| const { | ||
| QQ_OPENID, | ||
| QQ_APPID | ||
| } = env; | ||
| const qqContext = { | ||
| OPENID: QQ_OPENID, | ||
| APPID: QQ_APPID, | ||
| ENV: external_tcb_admin_node_["getCurrentEnv"](), | ||
| SOURCE: process.env.TCB_SOURCE, | ||
| CLIENTIP: process.env.TCB_SOURCE_IP || '' | ||
| }; | ||
| return qqContext; | ||
| } | ||
| // CONCATENATED MODULE: ./src/cloud/index.ts | ||
@@ -601,2 +783,4 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } | ||
| class cloud_Cloud { | ||
@@ -607,2 +791,6 @@ get callFunction() { | ||
| get logger() { | ||
| return logger.bind(this); | ||
| } | ||
| get getQQContext() { | ||
@@ -612,2 +800,18 @@ return getQQContext.bind(this); | ||
| get uploadFile() { | ||
| return this.wrapCommonAPICheck(uploadFile); | ||
| } | ||
| get getTempFileURL() { | ||
| return this.wrapCommonAPICheck(getTempFileURL); | ||
| } | ||
| get deleteFile() { | ||
| return this.wrapCommonAPICheck(deleteFile); | ||
| } | ||
| get downloadFile() { | ||
| return this.wrapCommonAPICheck(downloadFile); | ||
| } | ||
| constructor() { | ||
@@ -663,6 +867,6 @@ this.inited = false; | ||
| if (typeof this.config.env === 'string') { | ||
| if (typeof this.config.env === 'object') { | ||
| env = this.config.env[type] || this.config.env['default']; | ||
| } else { | ||
| env = this.config.env; | ||
| } else if (typeof this.config.env === 'object') { | ||
| env = this.config.env[type]; | ||
| } | ||
@@ -669,0 +873,0 @@ |
+1
-1
| { | ||
| "name": "qq-server-sdk", | ||
| "version": "1.0.3", | ||
| "version": "1.1.0", | ||
| "description": "qq mini program cloud server sdk", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
@@ -7,3 +7,8 @@ interface Config { | ||
| get callFunction(): (...args: any[]) => any; | ||
| get logger(): any; | ||
| get getQQContext(): any; | ||
| get uploadFile(): (...args: any[]) => any; | ||
| get getTempFileURL(): (...args: any[]) => any; | ||
| get deleteFile(): (...args: any[]) => any; | ||
| get downloadFile(): (...args: any[]) => any; | ||
| config: Config; | ||
@@ -19,4 +24,4 @@ private inited; | ||
| }): any; | ||
| private translateEnv; | ||
| translateEnv(type?: string): any; | ||
| } | ||
| export { Cloud }; |
@@ -1,8 +0,7 @@ | ||
| declare function getQQContext(context: object): { | ||
| OPENID: any; | ||
| APPID: any; | ||
| ENV: any; | ||
| SOURCE: string; | ||
| declare function getQQContext(): { | ||
| OPENID: string; | ||
| APPID: string; | ||
| ENV: string; | ||
| CLIENTIP: string; | ||
| }; | ||
| export { getQQContext }; |
@@ -10,2 +10,3 @@ import { CloudSDKError } from './error'; | ||
| }): void; | ||
| export { assertType, assertObjectOptionalType, assertObjectNotEmpty, assertRequiredParam }; | ||
| declare function assertArrayNotEmpty(target: any, name: any, funcName: any, ErrorClass?: typeof CloudSDKError): void; | ||
| export { assertType, assertObjectOptionalType, assertObjectNotEmpty, assertRequiredParam, assertArrayNotEmpty }; |
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
Found 4 instances
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Environment variable access
Supply chain riskPackage accesses environment variables, which may be a sign of credential stuffing or data theft.
33369
24.9%20
42.86%934
27.42%0
-100%7
133.33%