@cloudbase/app 2.26.0 → 2.26.2
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/dist/cjs/index.d.ts +2 -0
- package/dist/cjs/index.js +43 -7
- package/dist/cjs/index.node.d.ts +6 -0
- package/dist/cjs/index.node.js +21 -0
- package/dist/cjs/libs/adapter-node/constants.d.ts +33 -0
- package/dist/cjs/libs/adapter-node/constants.js +38 -0
- package/dist/cjs/libs/adapter-node/context.d.ts +13 -0
- package/dist/cjs/libs/adapter-node/context.js +162 -0
- package/dist/cjs/libs/adapter-node/index.d.ts +23 -0
- package/dist/cjs/libs/adapter-node/index.js +124 -0
- package/dist/cjs/libs/adapter-node/metadata.d.ts +14 -0
- package/dist/cjs/libs/adapter-node/metadata.js +130 -0
- package/dist/cjs/libs/adapter-node/request.d.ts +38 -0
- package/dist/cjs/libs/adapter-node/request.js +440 -0
- package/dist/cjs/libs/adapter-node/tool.d.ts +2 -0
- package/dist/cjs/libs/adapter-node/tool.js +227 -0
- package/dist/cjs/libs/adapter-node/types.d.ts +78 -0
- package/dist/cjs/libs/adapter-node/types.js +3 -0
- package/dist/cjs/libs/adapter-node/utils.d.ts +17 -0
- package/dist/cjs/libs/adapter-node/utils.js +221 -0
- package/dist/cjs/libs/request.d.ts +1 -0
- package/dist/cjs/libs/request.js +34 -19
- package/dist/esm/index.d.ts +2 -0
- package/dist/esm/index.js +43 -7
- package/dist/esm/index.node.d.ts +6 -0
- package/dist/esm/index.node.js +13 -0
- package/dist/esm/libs/adapter-node/constants.d.ts +33 -0
- package/dist/esm/libs/adapter-node/constants.js +35 -0
- package/dist/esm/libs/adapter-node/context.d.ts +13 -0
- package/dist/esm/libs/adapter-node/context.js +156 -0
- package/dist/esm/libs/adapter-node/index.d.ts +23 -0
- package/dist/esm/libs/adapter-node/index.js +118 -0
- package/dist/esm/libs/adapter-node/metadata.d.ts +14 -0
- package/dist/esm/libs/adapter-node/metadata.js +123 -0
- package/dist/esm/libs/adapter-node/request.d.ts +38 -0
- package/dist/esm/libs/adapter-node/request.js +437 -0
- package/dist/esm/libs/adapter-node/tool.d.ts +2 -0
- package/dist/esm/libs/adapter-node/tool.js +223 -0
- package/dist/esm/libs/adapter-node/types.d.ts +78 -0
- package/dist/esm/libs/adapter-node/types.js +2 -0
- package/dist/esm/libs/adapter-node/utils.d.ts +17 -0
- package/dist/esm/libs/adapter-node/utils.js +205 -0
- package/dist/esm/libs/request.d.ts +1 -0
- package/dist/esm/libs/request.js +34 -19
- package/dist/miniprogram/index.js +1 -1
- package/package.json +32 -4
- package/src/index.node.ts +22 -0
- package/src/index.ts +91 -7
- package/src/libs/adapter-node/constants.ts +42 -0
- package/src/libs/adapter-node/context.ts +238 -0
- package/src/libs/adapter-node/index.ts +166 -0
- package/src/libs/adapter-node/metadata.ts +69 -0
- package/src/libs/adapter-node/request.ts +486 -0
- package/src/libs/adapter-node/tool.ts +223 -0
- package/src/libs/adapter-node/types.ts +116 -0
- package/src/libs/adapter-node/utils.ts +182 -0
- package/src/libs/request.ts +125 -113
- package/webpack/web.prod.js +14 -13
- package/webpack/webpack.miniprogram.js +10 -3
package/src/libs/request.ts
CHANGED
|
@@ -113,10 +113,11 @@ export class CloudbaseRequest implements ICloudbaseRequest {
|
|
|
113
113
|
*/
|
|
114
114
|
constructor(config: ICloudbaseRequestConfig & { throw?: boolean }) {
|
|
115
115
|
this.config = config
|
|
116
|
-
const reqConfig: IRequestConfig = {
|
|
116
|
+
const reqConfig: IRequestConfig & { auth: ICloudbaseRequestConfig['auth'] } = {
|
|
117
117
|
timeout: this.config.timeout,
|
|
118
118
|
timeoutMsg: `[@cloudbase/js-sdk] 请求在${this.config.timeout / 1000}s内未完成,已中断`,
|
|
119
119
|
restrictedMethods: ['post', 'put'],
|
|
120
|
+
auth: config.auth,
|
|
120
121
|
}
|
|
121
122
|
this.reqClass = new Platform.adapter.reqClass(reqConfig)
|
|
122
123
|
this.throwWhenRequestFail = config.throw || false
|
|
@@ -201,138 +202,146 @@ export class CloudbaseRequest implements ICloudbaseRequest {
|
|
|
201
202
|
search?: string
|
|
202
203
|
defaultQuery?: KV<any>
|
|
203
204
|
headers?: KV<string>
|
|
205
|
+
endPointMode?: 'CLOUD_API' | 'GATEWAY'
|
|
204
206
|
},
|
|
205
207
|
customReqOpts?: ICustomReqOpts,
|
|
206
208
|
): Promise<ResponseObject> {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
+
try {
|
|
210
|
+
const tcbTraceKey = `x-tcb-trace_${this.config.env}`
|
|
211
|
+
let contentType = 'application/x-www-form-urlencoded'
|
|
212
|
+
|
|
213
|
+
const tmpObj: KV<any> = {
|
|
214
|
+
action,
|
|
215
|
+
dataVersion: DATA_VERSION,
|
|
216
|
+
env: this.config.env,
|
|
217
|
+
...params,
|
|
218
|
+
}
|
|
209
219
|
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
dataVersion: DATA_VERSION,
|
|
213
|
-
env: this.config.env,
|
|
214
|
-
...params,
|
|
215
|
-
}
|
|
220
|
+
if (ACTIONS_WITHOUT_ACCESSTOKEN.indexOf(action) === -1) {
|
|
221
|
+
const app = this.config._fromApp
|
|
216
222
|
|
|
217
|
-
|
|
218
|
-
|
|
223
|
+
if (!app.oauthInstance) {
|
|
224
|
+
throw new Error('you can\'t request without auth')
|
|
225
|
+
}
|
|
219
226
|
|
|
220
|
-
|
|
221
|
-
|
|
227
|
+
const { oauthInstance } = app
|
|
228
|
+
const oauthClient = oauthInstance.oauth2client
|
|
229
|
+
tmpObj.access_token = (await this.getOauthAccessTokenV2(oauthClient)).accessToken
|
|
222
230
|
}
|
|
223
231
|
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
232
|
+
// 拼body和content-type
|
|
233
|
+
let payload
|
|
234
|
+
if (action === 'storage.uploadFile') {
|
|
235
|
+
payload = new FormData()
|
|
236
|
+
Object.keys(payload).forEach((key) => {
|
|
237
|
+
if (Object.prototype.hasOwnProperty.call(payload, key) && payload[key] !== undefined) {
|
|
238
|
+
payload.append(key, tmpObj[key])
|
|
239
|
+
}
|
|
240
|
+
})
|
|
241
|
+
contentType = 'multipart/form-data'
|
|
242
|
+
} else {
|
|
243
|
+
contentType = 'application/json;charset=UTF-8'
|
|
244
|
+
payload = {}
|
|
245
|
+
Object.keys(tmpObj).forEach((key) => {
|
|
246
|
+
if (tmpObj[key] !== undefined) {
|
|
247
|
+
payload[key] = tmpObj[key]
|
|
248
|
+
}
|
|
249
|
+
})
|
|
250
|
+
}
|
|
251
|
+
const opts: any = {
|
|
252
|
+
headers: {
|
|
253
|
+
'content-type': contentType,
|
|
254
|
+
...this.getDefaultHeaders(),
|
|
255
|
+
...options?.headers,
|
|
256
|
+
},
|
|
257
|
+
}
|
|
258
|
+
if (options?.onUploadProgress) {
|
|
259
|
+
opts.onUploadProgress = options.onUploadProgress
|
|
260
|
+
}
|
|
228
261
|
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
payload = new FormData()
|
|
233
|
-
Object.keys(payload).forEach((key) => {
|
|
234
|
-
if (Object.prototype.hasOwnProperty.call(payload, key) && payload[key] !== undefined) {
|
|
235
|
-
payload.append(key, tmpObj[key])
|
|
236
|
-
}
|
|
237
|
-
})
|
|
238
|
-
contentType = 'multipart/form-data'
|
|
239
|
-
} else {
|
|
240
|
-
contentType = 'application/json;charset=UTF-8'
|
|
241
|
-
payload = {}
|
|
242
|
-
Object.keys(tmpObj).forEach((key) => {
|
|
243
|
-
if (tmpObj[key] !== undefined) {
|
|
244
|
-
payload[key] = tmpObj[key]
|
|
245
|
-
}
|
|
246
|
-
})
|
|
247
|
-
}
|
|
248
|
-
const opts: any = {
|
|
249
|
-
headers: {
|
|
250
|
-
'content-type': contentType,
|
|
251
|
-
...this.getDefaultHeaders(),
|
|
252
|
-
...options?.headers,
|
|
253
|
-
},
|
|
254
|
-
}
|
|
255
|
-
if (options?.onUploadProgress) {
|
|
256
|
-
opts.onUploadProgress = options.onUploadProgress
|
|
257
|
-
}
|
|
262
|
+
if (this.config.region) {
|
|
263
|
+
opts.headers['X-TCB-Region'] = this.config.region
|
|
264
|
+
}
|
|
258
265
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
266
|
+
const traceHeader = this.localCache.getStore(tcbTraceKey)
|
|
267
|
+
if (traceHeader) {
|
|
268
|
+
opts.headers['X-TCB-Trace'] = traceHeader
|
|
269
|
+
}
|
|
262
270
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
271
|
+
// 发出请求
|
|
272
|
+
// 新的 url 需要携带 env 参数进行 CORS 校验
|
|
273
|
+
// 请求链接支持添加动态 query 参数,方便用户调试定位请求
|
|
274
|
+
const parse = options?.parse !== undefined ? options.parse : params.parse
|
|
275
|
+
const inQuery = options?.inQuery !== undefined ? options.inQuery : params.inQuery
|
|
276
|
+
const search = options?.search !== undefined ? options.search : params.search
|
|
267
277
|
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
278
|
+
let formatQuery: Record<string, any> = {
|
|
279
|
+
...(options?.defaultQuery || {}),
|
|
280
|
+
env: this.config.env,
|
|
281
|
+
}
|
|
282
|
+
// 尝试解析响应数据为 JSON
|
|
283
|
+
parse && (formatQuery.parse = true)
|
|
284
|
+
inQuery
|
|
285
|
+
&& (formatQuery = {
|
|
286
|
+
...inQuery,
|
|
287
|
+
...formatQuery,
|
|
288
|
+
})
|
|
289
|
+
|
|
290
|
+
const endPointMode = options?.endPointMode || this.config.endPointMode || 'CLOUD_API'
|
|
291
|
+
|
|
292
|
+
const url = getEndPointInfo(this.config.env, endPointMode)
|
|
293
|
+
let BASE_URL = url.baseUrl
|
|
294
|
+
const PROTOCOL = url.protocol
|
|
295
|
+
|
|
296
|
+
if (endPointMode === 'GATEWAY') {
|
|
297
|
+
if (/^((database)\.)|(auth\.wsWebSign)/.test(action)) {
|
|
298
|
+
const url = getEndPointInfo(this.config.env, 'CLOUD_API')
|
|
299
|
+
BASE_URL = `${url.baseUrl.match(/\/\/([^/?#]*)/)[0]}/web`
|
|
300
|
+
}
|
|
301
|
+
}
|
|
274
302
|
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
})
|
|
286
|
-
|
|
287
|
-
const endPointMode = this.config.endPointMode || 'CLOUD_API'
|
|
288
|
-
|
|
289
|
-
const url = getEndPointInfo(this.config.env, endPointMode)
|
|
290
|
-
let BASE_URL = url.baseUrl
|
|
291
|
-
const PROTOCOL = url.protocol
|
|
292
|
-
|
|
293
|
-
if (endPointMode === 'GATEWAY') {
|
|
294
|
-
if (/^((database)\.)|(auth\.wsWebSign)/.test(action)) {
|
|
295
|
-
const url = getEndPointInfo(this.config.env, 'CLOUD_API')
|
|
296
|
-
BASE_URL = `${url.baseUrl.match(/\/\/([^/?#]*)/)[0]}/web`
|
|
303
|
+
// 生成请求 url
|
|
304
|
+
let newUrl
|
|
305
|
+
if (options.pathname) {
|
|
306
|
+
newUrl = formatUrl(
|
|
307
|
+
PROTOCOL,
|
|
308
|
+
`${getBaseEndPoint(this.config.env, endPointMode)?.replace(/^https?:/, '')}/${options.pathname}`,
|
|
309
|
+
formatQuery,
|
|
310
|
+
)
|
|
311
|
+
} else {
|
|
312
|
+
newUrl = formatUrl(PROTOCOL, BASE_URL, formatQuery)
|
|
297
313
|
}
|
|
298
|
-
}
|
|
299
314
|
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
newUrl = formatUrl(
|
|
304
|
-
PROTOCOL,
|
|
305
|
-
`${getBaseEndPoint(this.config.env, endPointMode)?.replace(/^https?:/, '')}/${options.pathname}`,
|
|
306
|
-
formatQuery,
|
|
307
|
-
)
|
|
308
|
-
} else {
|
|
309
|
-
newUrl = formatUrl(PROTOCOL, BASE_URL, formatQuery)
|
|
310
|
-
}
|
|
315
|
+
if (search) {
|
|
316
|
+
newUrl += search
|
|
317
|
+
}
|
|
311
318
|
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
319
|
+
const res: ResponseObject = await this.post(
|
|
320
|
+
{
|
|
321
|
+
url: newUrl,
|
|
322
|
+
data: payload,
|
|
323
|
+
...opts,
|
|
324
|
+
},
|
|
325
|
+
customReqOpts,
|
|
326
|
+
)
|
|
315
327
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
},
|
|
322
|
-
customReqOpts,
|
|
323
|
-
)
|
|
328
|
+
// 保存 trace header
|
|
329
|
+
const resTraceHeader = res.header?.['x-tcb-trace']
|
|
330
|
+
if (resTraceHeader) {
|
|
331
|
+
this.localCache.setStore(tcbTraceKey, resTraceHeader)
|
|
332
|
+
}
|
|
324
333
|
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
this.localCache.setStore(tcbTraceKey, resTraceHeader)
|
|
329
|
-
}
|
|
334
|
+
if ((Number(res.status) !== 200 && Number(res.statusCode) !== 200) || !res.data) {
|
|
335
|
+
throw new Error('network request error')
|
|
336
|
+
}
|
|
330
337
|
|
|
331
|
-
|
|
332
|
-
|
|
338
|
+
return res
|
|
339
|
+
} catch (err) {
|
|
340
|
+
try {
|
|
341
|
+
err.requestId = err.requestId || options?.headers['x-request-id'] || options?.headers['X-Request-Id'] || ''
|
|
342
|
+
} catch (error) {}
|
|
343
|
+
throw err
|
|
333
344
|
}
|
|
334
|
-
|
|
335
|
-
return res
|
|
336
345
|
}
|
|
337
346
|
|
|
338
347
|
public async fetch(options: IFetchOptions & { token?: string; customReqOpts?: ICustomReqOpts },): Promise<ResponseObject> {
|
|
@@ -355,6 +364,9 @@ export class CloudbaseRequest implements ICloudbaseRequest {
|
|
|
355
364
|
const result = await doFetch()
|
|
356
365
|
return result
|
|
357
366
|
} catch (err) {
|
|
367
|
+
try {
|
|
368
|
+
err.requestId = err.requestId || headers['x-request-id'] || headers['X-Request-Id'] || ''
|
|
369
|
+
} catch (error) {}
|
|
358
370
|
if (err?.code === 'ACCESS_TOKEN_EXPIRED') {
|
|
359
371
|
// 如果是因为 token 过期失败,刷 token 后再试一次
|
|
360
372
|
if (typeof this.config?._fromApp?.oauthInstance?.authApi?.refreshTokenForce !== 'function') {
|
package/webpack/web.prod.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
1
2
|
const path = require('path')
|
|
2
3
|
const webpack = require('webpack')
|
|
3
4
|
const TerserPlugin = require('terser-webpack-plugin')
|
|
@@ -5,7 +6,7 @@ const TerserPlugin = require('terser-webpack-plugin')
|
|
|
5
6
|
module.exports = function (options) {
|
|
6
7
|
const { context, entry, output, mode, watch, externals, definePlugin = {}, optimization = {} } = options
|
|
7
8
|
const isDevelopment = mode !== 'production'
|
|
8
|
-
|
|
9
|
+
const plugins = [
|
|
9
10
|
new webpack.DefinePlugin(definePlugin),
|
|
10
11
|
// new BundleAnalyzerPlugin()
|
|
11
12
|
].filter((item) => !!item)
|
|
@@ -82,19 +83,19 @@ module.exports = function (options) {
|
|
|
82
83
|
...optimization,
|
|
83
84
|
...(isDevelopment
|
|
84
85
|
? {
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
86
|
+
minimize: false,
|
|
87
|
+
removeAvailableModules: false,
|
|
88
|
+
concatenateModules: true,
|
|
89
|
+
}
|
|
89
90
|
: {
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
minimizer: [
|
|
92
|
+
new TerserPlugin({
|
|
93
|
+
test: /\.js(\?.*)?$/i,
|
|
94
|
+
cache: false,
|
|
95
|
+
parallel: true,
|
|
96
|
+
}),
|
|
97
|
+
],
|
|
98
|
+
}),
|
|
98
99
|
},
|
|
99
100
|
}
|
|
100
101
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
1
2
|
const path = require('path')
|
|
3
|
+
const { ignoreNodeDepsPlugins } = require('../../../webpack.ignore-node-deps')
|
|
2
4
|
|
|
3
5
|
const params = {
|
|
4
6
|
context: path.resolve(__dirname, '../'),
|
|
@@ -8,17 +10,22 @@ const params = {
|
|
|
8
10
|
output: {
|
|
9
11
|
path: path.resolve(__dirname, '../dist/miniprogram'),
|
|
10
12
|
filename: 'index.js',
|
|
11
|
-
library:
|
|
13
|
+
library: 'tcboauth',
|
|
12
14
|
libraryTarget: 'umd',
|
|
13
15
|
umdNamedDefine: true,
|
|
14
16
|
globalObject: 'typeof window !== "undefined"?window:this',
|
|
15
17
|
},
|
|
16
18
|
externals: {},
|
|
17
19
|
definePlugin: {
|
|
18
|
-
'process.env.NODE_ENV': JSON.stringify('production'),
|
|
20
|
+
'process.env.NODE_ENV': JSON.stringify('production'),
|
|
19
21
|
'process.env.IS_MP_BUILD': 'true',
|
|
22
|
+
'process.env.IS_BROWSER_BUILD': 'true',
|
|
20
23
|
'globalThis.IS_MP_BUILD': true,
|
|
21
24
|
},
|
|
22
25
|
}
|
|
23
26
|
|
|
24
|
-
|
|
27
|
+
const config = require('./web.prod.js')(params)
|
|
28
|
+
|
|
29
|
+
config.plugins.push(...ignoreNodeDepsPlugins)
|
|
30
|
+
|
|
31
|
+
module.exports = config
|