@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.
Files changed (59) hide show
  1. package/dist/cjs/index.d.ts +2 -0
  2. package/dist/cjs/index.js +43 -7
  3. package/dist/cjs/index.node.d.ts +6 -0
  4. package/dist/cjs/index.node.js +21 -0
  5. package/dist/cjs/libs/adapter-node/constants.d.ts +33 -0
  6. package/dist/cjs/libs/adapter-node/constants.js +38 -0
  7. package/dist/cjs/libs/adapter-node/context.d.ts +13 -0
  8. package/dist/cjs/libs/adapter-node/context.js +162 -0
  9. package/dist/cjs/libs/adapter-node/index.d.ts +23 -0
  10. package/dist/cjs/libs/adapter-node/index.js +124 -0
  11. package/dist/cjs/libs/adapter-node/metadata.d.ts +14 -0
  12. package/dist/cjs/libs/adapter-node/metadata.js +130 -0
  13. package/dist/cjs/libs/adapter-node/request.d.ts +38 -0
  14. package/dist/cjs/libs/adapter-node/request.js +440 -0
  15. package/dist/cjs/libs/adapter-node/tool.d.ts +2 -0
  16. package/dist/cjs/libs/adapter-node/tool.js +227 -0
  17. package/dist/cjs/libs/adapter-node/types.d.ts +78 -0
  18. package/dist/cjs/libs/adapter-node/types.js +3 -0
  19. package/dist/cjs/libs/adapter-node/utils.d.ts +17 -0
  20. package/dist/cjs/libs/adapter-node/utils.js +221 -0
  21. package/dist/cjs/libs/request.d.ts +1 -0
  22. package/dist/cjs/libs/request.js +34 -19
  23. package/dist/esm/index.d.ts +2 -0
  24. package/dist/esm/index.js +43 -7
  25. package/dist/esm/index.node.d.ts +6 -0
  26. package/dist/esm/index.node.js +13 -0
  27. package/dist/esm/libs/adapter-node/constants.d.ts +33 -0
  28. package/dist/esm/libs/adapter-node/constants.js +35 -0
  29. package/dist/esm/libs/adapter-node/context.d.ts +13 -0
  30. package/dist/esm/libs/adapter-node/context.js +156 -0
  31. package/dist/esm/libs/adapter-node/index.d.ts +23 -0
  32. package/dist/esm/libs/adapter-node/index.js +118 -0
  33. package/dist/esm/libs/adapter-node/metadata.d.ts +14 -0
  34. package/dist/esm/libs/adapter-node/metadata.js +123 -0
  35. package/dist/esm/libs/adapter-node/request.d.ts +38 -0
  36. package/dist/esm/libs/adapter-node/request.js +437 -0
  37. package/dist/esm/libs/adapter-node/tool.d.ts +2 -0
  38. package/dist/esm/libs/adapter-node/tool.js +223 -0
  39. package/dist/esm/libs/adapter-node/types.d.ts +78 -0
  40. package/dist/esm/libs/adapter-node/types.js +2 -0
  41. package/dist/esm/libs/adapter-node/utils.d.ts +17 -0
  42. package/dist/esm/libs/adapter-node/utils.js +205 -0
  43. package/dist/esm/libs/request.d.ts +1 -0
  44. package/dist/esm/libs/request.js +34 -19
  45. package/dist/miniprogram/index.js +1 -1
  46. package/package.json +32 -4
  47. package/src/index.node.ts +22 -0
  48. package/src/index.ts +91 -7
  49. package/src/libs/adapter-node/constants.ts +42 -0
  50. package/src/libs/adapter-node/context.ts +238 -0
  51. package/src/libs/adapter-node/index.ts +166 -0
  52. package/src/libs/adapter-node/metadata.ts +69 -0
  53. package/src/libs/adapter-node/request.ts +486 -0
  54. package/src/libs/adapter-node/tool.ts +223 -0
  55. package/src/libs/adapter-node/types.ts +116 -0
  56. package/src/libs/adapter-node/utils.ts +182 -0
  57. package/src/libs/request.ts +125 -113
  58. package/webpack/web.prod.js +14 -13
  59. package/webpack/webpack.miniprogram.js +10 -3
@@ -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
- const tcbTraceKey = `x-tcb-trace_${this.config.env}`
208
- let contentType = 'application/x-www-form-urlencoded'
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
- const tmpObj: KV<any> = {
211
- action,
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
- if (ACTIONS_WITHOUT_ACCESSTOKEN.indexOf(action) === -1) {
218
- const app = this.config._fromApp
223
+ if (!app.oauthInstance) {
224
+ throw new Error('you can\'t request without auth')
225
+ }
219
226
 
220
- if (!app.oauthInstance) {
221
- throw new Error('you can\'t request without auth')
227
+ const { oauthInstance } = app
228
+ const oauthClient = oauthInstance.oauth2client
229
+ tmpObj.access_token = (await this.getOauthAccessTokenV2(oauthClient)).accessToken
222
230
  }
223
231
 
224
- const { oauthInstance } = app
225
- const oauthClient = oauthInstance.oauth2client
226
- tmpObj.access_token = (await this.getOauthAccessTokenV2(oauthClient)).accessToken
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
- // 拼body和content-type
230
- let payload
231
- if (action === 'storage.uploadFile') {
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
- if (this.config.region) {
260
- opts.headers['X-TCB-Region'] = this.config.region
261
- }
266
+ const traceHeader = this.localCache.getStore(tcbTraceKey)
267
+ if (traceHeader) {
268
+ opts.headers['X-TCB-Trace'] = traceHeader
269
+ }
262
270
 
263
- const traceHeader = this.localCache.getStore(tcbTraceKey)
264
- if (traceHeader) {
265
- opts.headers['X-TCB-Trace'] = traceHeader
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
- // 新的 url 需要携带 env 参数进行 CORS 校验
270
- // 请求链接支持添加动态 query 参数,方便用户调试定位请求
271
- const parse = options?.parse !== undefined ? options.parse : params.parse
272
- const inQuery = options?.inQuery !== undefined ? options.inQuery : params.inQuery
273
- const search = options?.search !== undefined ? options.search : params.search
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
- let formatQuery: Record<string, any> = {
276
- ...(options?.defaultQuery || {}),
277
- env: this.config.env,
278
- }
279
- // 尝试解析响应数据为 JSON
280
- parse && (formatQuery.parse = true)
281
- inQuery
282
- && (formatQuery = {
283
- ...inQuery,
284
- ...formatQuery,
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
- // 生成请求 url
301
- let newUrl
302
- if (options.pathname) {
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
- if (search) {
313
- newUrl += search
314
- }
319
+ const res: ResponseObject = await this.post(
320
+ {
321
+ url: newUrl,
322
+ data: payload,
323
+ ...opts,
324
+ },
325
+ customReqOpts,
326
+ )
315
327
 
316
- const res: ResponseObject = await this.post(
317
- {
318
- url: newUrl,
319
- data: payload,
320
- ...opts,
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
- // 保存 trace header
326
- const resTraceHeader = res.header?.['x-tcb-trace']
327
- if (resTraceHeader) {
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
- if ((Number(res.status) !== 200 && Number(res.statusCode) !== 200) || !res.data) {
332
- throw new Error('network request error')
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') {
@@ -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
- let plugins = [
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
- minimize: false,
86
- removeAvailableModules: false,
87
- concatenateModules: true,
88
- }
86
+ minimize: false,
87
+ removeAvailableModules: false,
88
+ concatenateModules: true,
89
+ }
89
90
  : {
90
- minimizer: [
91
- new TerserPlugin({
92
- test: /\.js(\?.*)?$/i,
93
- cache: false,
94
- parallel: true,
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: `tcboauth`,
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
- module.exports = require('./web.prod.js')(params)
27
+ const config = require('./web.prod.js')(params)
28
+
29
+ config.plugins.push(...ignoreNodeDepsPlugins)
30
+
31
+ module.exports = config