@cloudbase/oauth 1.0.1-alpha.0 → 1.3.1-beta

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 (102) hide show
  1. package/app/index.d.ts +29 -0
  2. package/app/index.js +54 -0
  3. package/app/index.js.map +1 -0
  4. package/app/internal.d.ts +12 -0
  5. package/app/internal.js +25 -0
  6. package/app/internal.js.map +1 -0
  7. package/app/openuri.d.ts +20 -0
  8. package/app/openuri.js +105 -0
  9. package/app/openuri.js.map +1 -0
  10. package/app/request.d.ts +19 -0
  11. package/app/request.js +52 -0
  12. package/app/request.js.map +1 -0
  13. package/app/storage.d.ts +41 -0
  14. package/app/storage.js +35 -0
  15. package/app/storage.js.map +1 -0
  16. package/{dist/auth → auth}/consts.d.ts +21 -9
  17. package/auth/consts.js +79 -0
  18. package/auth/consts.js.map +1 -0
  19. package/auth/index.d.ts +242 -0
  20. package/auth/index.js +551 -0
  21. package/auth/index.js.map +1 -0
  22. package/auth/models.d.ts +286 -0
  23. package/auth/models.js +4 -0
  24. package/auth/models.js.map +1 -0
  25. package/captcha/index.d.ts +45 -0
  26. package/captcha/index.js +135 -0
  27. package/captcha/index.js.map +1 -0
  28. package/function/index.d.ts +38 -0
  29. package/function/index.js +80 -0
  30. package/function/index.js.map +1 -0
  31. package/index.d.ts +14 -0
  32. package/index.js +24 -0
  33. package/index.js.map +1 -0
  34. package/{dist/oauth2client → oauthclient}/consts.d.ts +1 -22
  35. package/oauthclient/consts.js +53 -0
  36. package/oauthclient/consts.js.map +1 -0
  37. package/oauthclient/index.d.ts +18 -0
  38. package/oauthclient/index.js +21 -0
  39. package/oauthclient/index.js.map +1 -0
  40. package/oauthclient/interface.d.ts +29 -0
  41. package/oauthclient/interface.js +10 -0
  42. package/oauthclient/interface.js.map +1 -0
  43. package/oauthclient/models.d.ts +40 -0
  44. package/oauthclient/models.js +3 -0
  45. package/oauthclient/models.js.map +1 -0
  46. package/oauthclient/oauthclient.d.ts +146 -0
  47. package/oauthclient/oauthclient.js +414 -0
  48. package/oauthclient/oauthclient.js.map +1 -0
  49. package/package.json +13 -28
  50. package/utils/promise.d.ts +18 -0
  51. package/utils/promise.js +48 -0
  52. package/utils/promise.js.map +1 -0
  53. package/utils/uuid.d.ts +5 -0
  54. package/utils/uuid.js +16 -0
  55. package/utils/uuid.js.map +1 -0
  56. package/.eslintignore +0 -2
  57. package/.eslintrc +0 -26
  58. package/CHANGELOG.md +0 -30
  59. package/Dockerfile +0 -15
  60. package/README.md +0 -183
  61. package/_exmaple/assets/scripts/function/function.ts +0 -99
  62. package/_exmaple/assets/scripts/index.ts +0 -101
  63. package/_exmaple/assets/scripts/request.ts +0 -11
  64. package/_exmaple/index.html +0 -15
  65. package/_exmaple/package.json +0 -33
  66. package/_exmaple/tsconfig.json +0 -71
  67. package/_exmaple/typings.d.ts +0 -0
  68. package/_exmaple/webpack.config.js +0 -42
  69. package/dist/auth/apis.d.ts +0 -55
  70. package/dist/auth/apis.js +0 -568
  71. package/dist/auth/consts.js +0 -61
  72. package/dist/auth/models.d.ts +0 -354
  73. package/dist/auth/models.js +0 -3
  74. package/dist/captcha/captcha.d.ts +0 -35
  75. package/dist/captcha/captcha.js +0 -267
  76. package/dist/index.d.ts +0 -14
  77. package/dist/index.js +0 -63
  78. package/dist/oauth2client/consts.js +0 -73
  79. package/dist/oauth2client/interface.d.ts +0 -15
  80. package/dist/oauth2client/interface.js +0 -10
  81. package/dist/oauth2client/models.d.ts +0 -47
  82. package/dist/oauth2client/models.js +0 -3
  83. package/dist/oauth2client/oauth2client.d.ts +0 -71
  84. package/dist/oauth2client/oauth2client.js +0 -640
  85. package/dist/utils/function/single-promise.d.ts +0 -5
  86. package/dist/utils/function/single-promise.js +0 -89
  87. package/dist/utils/uuid.d.ts +0 -1
  88. package/dist/utils/uuid.js +0 -12
  89. package/publish.sh +0 -2
  90. package/src/auth/apis.ts +0 -642
  91. package/src/auth/consts.ts +0 -57
  92. package/src/auth/models.ts +0 -444
  93. package/src/captcha/captcha.ts +0 -222
  94. package/src/index.ts +0 -49
  95. package/src/oauth2client/consts.ts +0 -69
  96. package/src/oauth2client/interface.ts +0 -57
  97. package/src/oauth2client/models.ts +0 -61
  98. package/src/oauth2client/oauth2client.ts +0 -620
  99. package/src/utils/function/single-promise.ts +0 -40
  100. package/src/utils/uuid.ts +0 -11
  101. package/tsconfig.json +0 -44
  102. package/wiki/README.md +0 -75
package/app/index.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ import { RequestFn as requestFn, RequestOptions as requestOptions } from "./request";
2
+ import { OpenURIWithCallback as openURIWithCallback } from "./openuri";
3
+ import { Storage as storage } from "./storage";
4
+ export interface Options {
5
+ env: string;
6
+ region?: string;
7
+ apiOrigin?: string;
8
+ clientId?: string;
9
+ clientSecret?: string;
10
+ custom?: any;
11
+ request?: requestFn;
12
+ storage?: storage;
13
+ openURIWithCallback?: openURIWithCallback;
14
+ }
15
+ export declare function initializeApp(options: Options): App;
16
+ export interface App {
17
+ readonly options: Options;
18
+ }
19
+ export declare class AppImpl implements App {
20
+ private readonly _options;
21
+ private readonly _container;
22
+ constructor(options: Options);
23
+ get options(): Options;
24
+ get container(): Map<string, any>;
25
+ }
26
+ export declare type RequestFn = requestFn;
27
+ export declare type RequestOptions = requestOptions;
28
+ export declare type OpenURIWithCallback = openURIWithCallback;
29
+ export declare type Storage = storage;
package/app/index.js ADDED
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppImpl = exports.initializeApp = void 0;
4
+ const request_1 = require("./request");
5
+ const openuri_1 = require("./openuri");
6
+ const storage_1 = require("./storage");
7
+ function initializeApp(options) {
8
+ return new AppImpl(options);
9
+ }
10
+ exports.initializeApp = initializeApp;
11
+ class AppImpl {
12
+ constructor(options) {
13
+ this._container = new Map();
14
+ if (!options.region) {
15
+ options.region = 'ap-shanghai';
16
+ }
17
+ if (!options.apiOrigin) {
18
+ options.apiOrigin = `https://${options.env}.${options.region}.tcb-api.tencentcloudapi.com`;
19
+ }
20
+ let storageEnv = options.env;
21
+ if (!options.clientId) {
22
+ options.clientId = '';
23
+ }
24
+ else {
25
+ storageEnv = options.clientId;
26
+ }
27
+ if (!options.storage) {
28
+ options.storage = new storage_1.DefaultStorage({ env: storageEnv });
29
+ }
30
+ if (!options.openURIWithCallback) {
31
+ options.openURIWithCallback = openuri_1.defaultOpenURIWithCallback;
32
+ }
33
+ let baseRequest = options.request;
34
+ if (!baseRequest) {
35
+ baseRequest = request_1.defaultRequest;
36
+ }
37
+ const apiOrigin = options.apiOrigin;
38
+ options.request = async (url, options) => {
39
+ if (url.startsWith('/')) {
40
+ url = apiOrigin + url;
41
+ }
42
+ return baseRequest(url, options);
43
+ };
44
+ this._options = options;
45
+ }
46
+ get options() {
47
+ return this._options;
48
+ }
49
+ get container() {
50
+ return this._container;
51
+ }
52
+ }
53
+ exports.AppImpl = AppImpl;
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/app/index.ts"],"names":[],"mappings":";;;AAAA,uCAAmG;AACnG,uCAAiG;AACjG,uCAA6D;AAgB7D,SAAgB,aAAa,CACzB,OAAgB;IAEhB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;AAChC,CAAC;AAJD,sCAIC;AAMD,MAAa,OAAO;IAIhB,YAAY,OAAgB;QAFX,eAAU,GAAG,IAAI,GAAG,EAAe,CAAC;QAGjD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACjB,OAAO,CAAC,MAAM,GAAG,aAAa,CAAA;SACjC;QACD,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;YACpB,OAAO,CAAC,SAAS,GAAG,WAAW,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,MAAM,8BAA8B,CAAA;SAC7F;QACD,IAAI,UAAU,GAAG,OAAO,CAAC,GAAG,CAAA;QAC5B,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE;YACnB,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAA;SACxB;aAAM;YACH,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAA;SAChC;QACD,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE;YAClB,OAAO,CAAC,OAAO,GAAG,IAAI,wBAAc,CAAC,EAAC,GAAG,EAAE,UAAU,EAAC,CAAC,CAAC;SAC3D;QACD,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE;YAC9B,OAAO,CAAC,mBAAmB,GAAG,oCAA0B,CAAC;SAC5D;QACD,IAAI,WAAW,GAAG,OAAO,CAAC,OAAO,CAAA;QACjC,IAAI,CAAC,WAAW,EAAE;YACd,WAAW,GAAG,wBAAc,CAAA;SAC/B;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;QACnC,OAAO,CAAC,OAAO,GAAG,KAAK,EACnB,GAAW,EACX,OAAwB,EACd,EAAE;YACZ,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;gBACrB,GAAG,GAAG,SAAS,GAAG,GAAG,CAAC;aACzB;YACD,OAAO,WAAW,CAAI,GAAG,EAAE,OAAO,CAAC,CAAA;QACvC,CAAC,CAAA;QACD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC5B,CAAC;IAED,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,UAAU,CAAC;IAC3B,CAAC;CACJ;AA/CD,0BA+CC"}
@@ -0,0 +1,12 @@
1
+ import { App } from "./index";
2
+ /**
3
+ *
4
+ * @param app - App instance
5
+ * @param name - service name
6
+ * @param creator - new T
7
+ *
8
+ * @returns the provider for the service with the matching name
9
+ *
10
+ * @internal
11
+ */
12
+ export declare function _getComponent<T>(app: App, name: string, creator: () => T): T;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports._getComponent = void 0;
4
+ /**
5
+ *
6
+ * @param app - App instance
7
+ * @param name - service name
8
+ * @param creator - new T
9
+ *
10
+ * @returns the provider for the service with the matching name
11
+ *
12
+ * @internal
13
+ */
14
+ function _getComponent(app, name, creator) {
15
+ const container = app.container;
16
+ let component = container.get(name);
17
+ if (component) {
18
+ return component;
19
+ }
20
+ component = creator();
21
+ container.set(name, component);
22
+ return component;
23
+ }
24
+ exports._getComponent = _getComponent;
25
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.js","sourceRoot":"","sources":["../../src/app/internal.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;GASG;AACH,SAAgB,aAAa,CACzB,GAAQ,EACR,IAAY,EACZ,OAAgB;IAEhB,MAAM,SAAS,GAAI,GAAe,CAAC,SAAS,CAAA;IAC5C,IAAI,SAAS,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACnC,IAAI,SAAS,EAAE;QACX,OAAO,SAAc,CAAA;KACxB;IACD,SAAS,GAAG,OAAO,EAAE,CAAA;IACrB,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAA;IAC9B,OAAO,SAAS,CAAA;AACpB,CAAC;AAbD,sCAaC"}
@@ -0,0 +1,20 @@
1
+ export declare type OpenURIWithCallback = (url: string, opts?: OpenURIOptions) => Promise<{
2
+ [key: string]: string;
3
+ }>;
4
+ export interface OpenURIOptions {
5
+ width: string;
6
+ height: string;
7
+ }
8
+ /**
9
+ * default use iframe to open url can return callback
10
+ * for example : open https://example.com/callback?rediret_uri=http://127.0.0.1:8080/
11
+ * the it is done, it will callback http://127.0.0.1:8080/?data1=x&data2=3
12
+ *
13
+ * for example : open https://example.com/callback?rediret_uri=http://127.0.0.1:8080/?__iframe==on
14
+ * window.addEventListener('message', function(e) {
15
+ console.log(e)
16
+ alert('data from domain2 ---> ' + e.data);
17
+ }, false);
18
+ *
19
+ */
20
+ export declare const defaultOpenURIWithCallback: OpenURIWithCallback;
package/app/openuri.js ADDED
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultOpenURIWithCallback = void 0;
4
+ /**
5
+ * default use iframe to open url can return callback
6
+ * for example : open https://example.com/callback?rediret_uri=http://127.0.0.1:8080/
7
+ * the it is done, it will callback http://127.0.0.1:8080/?data1=x&data2=3
8
+ *
9
+ * for example : open https://example.com/callback?rediret_uri=http://127.0.0.1:8080/?__iframe==on
10
+ * window.addEventListener('message', function(e) {
11
+ console.log(e)
12
+ alert('data from domain2 ---> ' + e.data);
13
+ }, false);
14
+ *
15
+ */
16
+ const defaultOpenURIWithCallback = (url, opts) => {
17
+ let iframeTag = '__iframe';
18
+ if (window.location.search.indexOf(iframeTag) > 0) {
19
+ document.body.style.display = 'none';
20
+ }
21
+ if (!opts) {
22
+ opts = {
23
+ width: '355px',
24
+ height: '355px'
25
+ };
26
+ }
27
+ if (document.getElementById('_iframe_panel_wrap') === null) {
28
+ var elementDiv = document.createElement('div');
29
+ elementDiv.style.cssText =
30
+ 'background-color: rgba(0, 0, 0, 0.7);position: fixed;left: 0px;right: 0px;top: 0px;bottom: 0px;padding: 9vw 0 0 0;display: none;z-index:100;';
31
+ elementDiv.setAttribute('id', '_iframe_panel_wrap');
32
+ document.body.appendChild(elementDiv);
33
+ }
34
+ const target = document.getElementById('_iframe_panel_wrap'), iframe = document.createElement('iframe');
35
+ target.innerHTML = '';
36
+ const openURL = new URL(url);
37
+ const redirectUri = openURL.searchParams.get('redirect_uri');
38
+ if (redirectUri) {
39
+ const redirectUrl = new URL(redirectUri);
40
+ redirectUrl.searchParams.append(iframeTag, "on");
41
+ openURL.searchParams.set('redirect_uri', redirectUrl.href);
42
+ url = openURL.href;
43
+ }
44
+ iframe.setAttribute('src', url);
45
+ iframe.setAttribute('id', '_iframe_panel_wrap_iframe');
46
+ iframe.style.cssText = `min-width:${opts.width};display:block;height:${opts.height};margin:0 auto;background-color: rgb(255, 255, 255);border: none;`;
47
+ target.appendChild(iframe);
48
+ target.style.display = 'block';
49
+ let callBack = new Callback();
50
+ // handle callback from iframe post message
51
+ window.addEventListener('message', e => {
52
+ if (e.origin == openURL.origin && callBack.callFunc) {
53
+ target.style.display = 'none';
54
+ const data = JSON.parse(e.data);
55
+ try {
56
+ callBack.callFunc(data);
57
+ }
58
+ catch (e) {
59
+ }
60
+ }
61
+ }, false);
62
+ return new Promise((resolve, reject) => {
63
+ callBack.callFunc = data => {
64
+ if (data.error) {
65
+ return reject(data);
66
+ }
67
+ return resolve(data);
68
+ };
69
+ // handle callback from iframe redirect uri
70
+ iframe.onload = () => {
71
+ try {
72
+ var windowLocation = window.location;
73
+ var iframeLocation = iframe.contentWindow.location;
74
+ if (iframeLocation.host +
75
+ iframeLocation.pathname ===
76
+ windowLocation.host +
77
+ windowLocation.pathname) {
78
+ target.style.display = 'none';
79
+ const iframeUrlParams = new URLSearchParams(iframeLocation.search);
80
+ const data = {};
81
+ iframeUrlParams.forEach((v, k) => {
82
+ data[k] = v;
83
+ });
84
+ if (data.error) {
85
+ return reject({
86
+ error: iframeUrlParams.get('error'),
87
+ error_description: iframeUrlParams.get('error_description')
88
+ });
89
+ }
90
+ return resolve(data);
91
+ }
92
+ else {
93
+ target.style.display = 'block';
94
+ }
95
+ }
96
+ catch (error) {
97
+ target.style.display = 'block';
98
+ }
99
+ };
100
+ });
101
+ };
102
+ exports.defaultOpenURIWithCallback = defaultOpenURIWithCallback;
103
+ class Callback {
104
+ }
105
+ //# sourceMappingURL=openuri.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openuri.js","sourceRoot":"","sources":["../../src/app/openuri.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export interface RequestOptions {
2
+ body?: any | null;
3
+ headers?: any | null;
4
+ method?: string;
5
+ [key: string]: any;
6
+ }
7
+ export declare enum ErrorType {
8
+ UNREACHABLE = "unreachable"
9
+ }
10
+ export declare type RequestFn = <T>(url: string, options?: RequestOptions) => Promise<T>;
11
+ /** An Error For all concern **/
12
+ export interface ResponseError {
13
+ error: string;
14
+ error_description?: string;
15
+ error_uri?: string;
16
+ details?: any;
17
+ request_id?: string;
18
+ }
19
+ export declare const defaultRequest: RequestFn;
package/app/request.js ADDED
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.defaultRequest = exports.ErrorType = void 0;
4
+ var ErrorType;
5
+ (function (ErrorType) {
6
+ ErrorType["UNREACHABLE"] = "unreachable";
7
+ })(ErrorType = exports.ErrorType || (exports.ErrorType = {}));
8
+ const defaultRequest = async (url, options) => {
9
+ let result;
10
+ let responseError;
11
+ // Objects must be copied to prevent modification of data such as body.
12
+ const copyOptions = Object.assign({}, options);
13
+ if (!copyOptions.method) {
14
+ copyOptions.method = 'GET';
15
+ }
16
+ if (copyOptions.body && typeof copyOptions.body !== 'string') {
17
+ copyOptions.body = JSON.stringify(copyOptions.body, (key, value) => {
18
+ if (value && value !== '') {
19
+ return value;
20
+ }
21
+ });
22
+ }
23
+ const requestId = copyOptions.headers['x-request-id'];
24
+ try {
25
+ const responseResult = await fetch(url, copyOptions);
26
+ const jsonResponse = await responseResult.json();
27
+ if (jsonResponse.error || responseResult.status >= 400) {
28
+ responseError = jsonResponse;
29
+ responseError.error_uri = new URL(url).pathname;
30
+ responseError.request_id = requestId;
31
+ }
32
+ else {
33
+ result = jsonResponse;
34
+ }
35
+ }
36
+ catch (error) {
37
+ responseError = {
38
+ error: ErrorType.UNREACHABLE,
39
+ error_description: error.message,
40
+ error_uri: new URL(url).pathname,
41
+ request_id: requestId,
42
+ };
43
+ }
44
+ if (responseError) {
45
+ throw responseError;
46
+ }
47
+ else {
48
+ return result;
49
+ }
50
+ };
51
+ exports.defaultRequest = defaultRequest;
52
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../src/app/request.ts"],"names":[],"mappings":";;;AAQA,IAAY,SAEX;AAFD,WAAY,SAAS;IACjB,wCAA2B,CAAA;AAC/B,CAAC,EAFW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAEpB;AAaM,MAAM,cAAc,GAAc,KAAK,EAC1C,GAAW,EACX,OAAwB,EACd,EAAE;IACZ,IAAI,MAAS,CAAC;IACd,IAAI,aAA4B,CAAC;IACjC,uEAAuE;IACvE,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IAC/C,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;QACrB,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC;KAC9B;IACD,IAAI,WAAW,CAAC,IAAI,IAAI,OAAO,WAAW,CAAC,IAAI,KAAK,QAAQ,EAAE;QAC1D,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;YAC/D,IAAI,KAAK,IAAI,KAAK,KAAK,EAAE,EAAE;gBACvB,OAAO,KAAK,CAAA;aACf;QACL,CAAC,CAAC,CAAA;KACL;IACD,MAAM,SAAS,GAAG,WAAW,CAAC,OAAO,CAAC,cAAc,CAAW,CAAC;IAChE,IAAI;QACA,MAAM,cAAc,GAAa,MAAM,KAAK,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC/D,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,CAAC;QACjD,IAAI,YAAY,CAAC,KAAK,IAAI,cAAc,CAAC,MAAM,IAAI,GAAG,EAAE;YACpD,aAAa,GAAG,YAA6B,CAAC;YAC9C,aAAa,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YAChD,aAAa,CAAC,UAAU,GAAG,SAAS,CAAC;SACxC;aAAM;YACH,MAAM,GAAG,YAAiB,CAAC;SAC9B;KACJ;IAAC,OAAO,KAAK,EAAE;QACZ,aAAa,GAAG;YACZ,KAAK,EAAE,SAAS,CAAC,WAAW;YAC5B,iBAAiB,EAAE,KAAK,CAAC,OAAO;YAChC,SAAS,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ;YAChC,UAAU,EAAE,SAAS;SACxB,CAAC;KACL;IACD,IAAI,aAAa,EAAE;QACf,MAAM,aAAa,CAAC;KACvB;SAAM;QACH,OAAO,MAAW,CAAC;KACtB;AACL,CAAC,CAAC;AA1CW,QAAA,cAAc,kBA0CzB"}
@@ -0,0 +1,41 @@
1
+ /** An interface of the Simple Web Storage API */
2
+ export interface Storage {
3
+ /**
4
+ * value = storage[key]
5
+ */
6
+ getItem(key: string): Promise<string | null>;
7
+ /**
8
+ * delete storage[key]
9
+ */
10
+ removeItem(key: string): Promise<void>;
11
+ /**
12
+ * storage[key] = value
13
+ */
14
+ setItem(key: string, value: string): Promise<void>;
15
+ }
16
+ export interface StorageOptions {
17
+ env: string;
18
+ }
19
+ /**
20
+ * Default Storage.
21
+ */
22
+ export declare class DefaultStorage implements Storage {
23
+ private readonly _env;
24
+ constructor(opts: StorageOptions);
25
+ /**
26
+ * Get item.
27
+ * @param {string} key
28
+ */
29
+ getItem(key: string): Promise<string | null>;
30
+ /**
31
+ * Remove item.
32
+ * @param {string} key
33
+ */
34
+ removeItem(key: string): Promise<void>;
35
+ /**
36
+ * Set item.
37
+ * @param {string} key
38
+ * @param {string} value
39
+ */
40
+ setItem(key: string, value: string): Promise<void>;
41
+ }
package/app/storage.js ADDED
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DefaultStorage = void 0;
4
+ /**
5
+ * Default Storage.
6
+ */
7
+ class DefaultStorage {
8
+ constructor(opts) {
9
+ this._env = opts.env;
10
+ }
11
+ /**
12
+ * Get item.
13
+ * @param {string} key
14
+ */
15
+ async getItem(key) {
16
+ return localStorage.getItem(key + this._env);
17
+ }
18
+ /**
19
+ * Remove item.
20
+ * @param {string} key
21
+ */
22
+ async removeItem(key) {
23
+ return localStorage.removeItem(key + this._env);
24
+ }
25
+ /**
26
+ * Set item.
27
+ * @param {string} key
28
+ * @param {string} value
29
+ */
30
+ async setItem(key, value) {
31
+ return localStorage.setItem(key + this._env, value);
32
+ }
33
+ }
34
+ exports.DefaultStorage = DefaultStorage;
35
+ //# sourceMappingURL=storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage.js","sourceRoot":"","sources":["../../src/app/storage.ts"],"names":[],"mappings":";;;AAuBA;;GAEG;AACH,MAAa,cAAc;IAGvB,YAAY,IAAoB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAA;IACxB,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW;QACrB,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU,CAAC,GAAW;QACxB,OAAO,YAAY,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO,CAAC,GAAW,EAAE,KAAa;QACpC,OAAO,YAAY,CAAC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACxD,CAAC;CACJ;AA/BD,wCA+BC"}
@@ -9,21 +9,27 @@ export declare enum ApiUrls {
9
9
  PROVIDER_TOKEN_URL = "/auth/v1/provider/token",
10
10
  PROVIDER_URI_URL = "/auth/v1/provider/uri",
11
11
  USER_ME_URL = "/auth/v1/user/me",
12
+ RESET_PASSWORD_URL = "/auth/v1/reset",
12
13
  USER_QUERY_URL = "/auth/v1/user/query",
13
- USER_PRIFILE_URL = "/auth/v1/user/profile",
14
+ USER_PROFILE_URL = "/auth/v1/user/profile",
14
15
  USER_TRANS_BY_PROVIDER_URL = "/auth/v1/user/trans/by/provider",
15
16
  VERIFICATION_URL = "/auth/v1/verification",
16
17
  VERIFY_URL = "/auth/v1/verification/verify",
17
- PROVIDER_LIST = "/auth/v1/user/provider",
18
+ PROVIDER_LIST_URL = "/auth/v1/user/provider",
18
19
  PROVIDER_UNBIND_URL = "/auth/v1/user/provider",
19
- CHECK_PWD_URL = "/auth/v1/user/sudo",
20
20
  SUDO_URL = "/auth/v1/user/sudo",
21
- BIND_CONTACT_URL = "/auth/v1/user/contact",
22
- AUTH_SET_PASSWORD = "/auth/v1/user/password",
23
- AUTH_RESET_PASSWORD = "/auth/v1/reset",
24
- AUTH_GET_DEVICE_CODE = "/auth/v1/device/code",
25
- CHECK_USERNAME = "/auth/v1/checkUsername",
26
- CHECK_IF_USER_EXIST = "/auth/v1/checkIfUserExist"
21
+ EDIT_CONTACT_URL = "/auth/v1/user/contact",
22
+ AUTH_SET_PASSWORD_URL = "/auth/v1/user/password",
23
+ CHECK_IF_USER_EXIST_URL = "/auth/v1/checkIfUserExist",
24
+ AUTHORIZE_URL = "/auth/v1/user/authorize",
25
+ AUTHORIZE_DEVICE_URL = "/auth/v1/user/device/authorize",
26
+ AUTHORIZE_DEVICE_CODE_URL = "/auth/v1/device/code",
27
+ AUTHORIZE_INFO_URL = "/auth/v1/user/authorize/info",
28
+ AUTHORIZED_URL = "/auth/v1/user/authorized",
29
+ AUTHORIZED_DELETE_URL = "/auth/v1/user/authorized/",
30
+ AUTHORIZED_DEVICES_URL = "/auth/v1/user/authorized/devices",
31
+ AUTHORIZED_DEVICES_DELETE_URL = "/auth/v1/user/authorized/devices/",
32
+ AUTH_REVOKE_ALL_URL = "/auth/v1/user/revoke/all"
27
33
  }
28
34
  export declare enum VerificationUsages {
29
35
  REGISTER = "REGISTER",
@@ -52,3 +58,9 @@ export declare enum ErrorType {
52
58
  USER_PENDING = "user_pending",
53
59
  USER_BLOCKED = "user_blocked"
54
60
  }
61
+ export declare enum DeviceAuthorizeState {
62
+ ACCOMPLISHED = "ACCOMPLISHED",
63
+ WAITING_CONNECT = "WAITING_CONNECT",
64
+ WAITING_CONSENT = "WAITING_CONSENT",
65
+ ACCESS_DENIED = "ACCESS_DENIED"
66
+ }
package/auth/consts.js ADDED
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DeviceAuthorizeState = exports.ErrorType = exports.VerificationUsages = exports.ApiUrls = void 0;
4
+ var ApiUrls;
5
+ (function (ApiUrls) {
6
+ ApiUrls["AUTH_SIGN_IN_URL"] = "/auth/v1/signin";
7
+ ApiUrls["AUTH_SIGN_IN_ANONYMOUSLY_URL"] = "/auth/v1/signin/anonymously";
8
+ ApiUrls["AUTH_SIGN_IN_WITH_PROVIDER_URL"] = "/auth/v1/signin/with/provider";
9
+ ApiUrls["AUTH_SIGN_UP_URL"] = "/auth/v1/signup";
10
+ ApiUrls["AUTH_TOKEN_URL"] = "/auth/v1/token";
11
+ ApiUrls["AUTH_REVOKE_URL"] = "/auth/v1/revoke";
12
+ ApiUrls["PROVIDER_BIND_URL"] = "/auth/v1/user/provider/bind";
13
+ ApiUrls["PROVIDER_TOKEN_URL"] = "/auth/v1/provider/token";
14
+ ApiUrls["PROVIDER_URI_URL"] = "/auth/v1/provider/uri";
15
+ ApiUrls["USER_ME_URL"] = "/auth/v1/user/me";
16
+ ApiUrls["RESET_PASSWORD_URL"] = "/auth/v1/reset";
17
+ ApiUrls["USER_QUERY_URL"] = "/auth/v1/user/query";
18
+ ApiUrls["USER_PROFILE_URL"] = "/auth/v1/user/profile";
19
+ ApiUrls["USER_TRANS_BY_PROVIDER_URL"] = "/auth/v1/user/trans/by/provider";
20
+ ApiUrls["VERIFICATION_URL"] = "/auth/v1/verification";
21
+ ApiUrls["VERIFY_URL"] = "/auth/v1/verification/verify";
22
+ ApiUrls["PROVIDER_LIST_URL"] = "/auth/v1/user/provider";
23
+ ApiUrls["PROVIDER_UNBIND_URL"] = "/auth/v1/user/provider";
24
+ ApiUrls["SUDO_URL"] = "/auth/v1/user/sudo";
25
+ ApiUrls["EDIT_CONTACT_URL"] = "/auth/v1/user/contact";
26
+ ApiUrls["AUTH_SET_PASSWORD_URL"] = "/auth/v1/user/password";
27
+ ApiUrls["CHECK_IF_USER_EXIST_URL"] = "/auth/v1/checkIfUserExist";
28
+ ApiUrls["AUTHORIZE_URL"] = "/auth/v1/user/authorize";
29
+ ApiUrls["AUTHORIZE_DEVICE_URL"] = "/auth/v1/user/device/authorize";
30
+ ApiUrls["AUTHORIZE_DEVICE_CODE_URL"] = "/auth/v1/device/code";
31
+ ApiUrls["AUTHORIZE_INFO_URL"] = "/auth/v1/user/authorize/info";
32
+ ApiUrls["AUTHORIZED_URL"] = "/auth/v1/user/authorized";
33
+ ApiUrls["AUTHORIZED_DELETE_URL"] = "/auth/v1/user/authorized/";
34
+ ApiUrls["AUTHORIZED_DEVICES_URL"] = "/auth/v1/user/authorized/devices";
35
+ ApiUrls["AUTHORIZED_DEVICES_DELETE_URL"] = "/auth/v1/user/authorized/devices/";
36
+ ApiUrls["AUTH_REVOKE_ALL_URL"] = "/auth/v1/user/revoke/all";
37
+ })(ApiUrls = exports.ApiUrls || (exports.ApiUrls = {}));
38
+ var VerificationUsages;
39
+ (function (VerificationUsages) {
40
+ VerificationUsages["REGISTER"] = "REGISTER";
41
+ VerificationUsages["SIGN_IN"] = "SIGN_IN";
42
+ VerificationUsages["PASSWORD_RESET"] = "PASSWORD_RESET";
43
+ VerificationUsages["EMAIL_ADDRESS_CHANGE"] = "EMAIL_ADDRESS_CHANGE";
44
+ VerificationUsages["PHONE_NUMBER_CHANGE"] = "PHONE_NUMBER_CHANGE";
45
+ })(VerificationUsages = exports.VerificationUsages || (exports.VerificationUsages = {}));
46
+ var ErrorType;
47
+ (function (ErrorType) {
48
+ ErrorType["INVALID_ARGUMENT"] = "invalid_argument";
49
+ ErrorType["DEADLINE_EXCEEDED"] = "deadline_exceeded";
50
+ ErrorType["NOT_FOUND"] = "not_found";
51
+ ErrorType["ALREADY_EXISTS"] = "already_exists";
52
+ ErrorType["PERMISSION_DENIED"] = "permission_denied";
53
+ ErrorType["ABORTED"] = "aborted";
54
+ ErrorType["OUT_OF_RANGE"] = "out_of_range";
55
+ ErrorType["UNIMPLEMENTED"] = "unimplemented";
56
+ ErrorType["INTERNAL"] = "internal";
57
+ ErrorType["UNAVAILABLE"] = "unavailable";
58
+ ErrorType["DATA_LOSS"] = "data_loss";
59
+ // CommonError
60
+ ErrorType["CAPTCHA_REQUIRED"] = "captcha_required";
61
+ ErrorType["CAPTCHA_INVALID"] = "captcha_invalid";
62
+ ErrorType["INVALID_PASSWORD"] = "invalid_password";
63
+ ErrorType["PASSWORD_NOT_SET"] = "password_not_set";
64
+ ErrorType["INVALID_STATUS"] = "invalid_status";
65
+ ErrorType["USER_PENDING"] = "user_pending";
66
+ ErrorType["USER_BLOCKED"] = "user_blocked";
67
+ })(ErrorType = exports.ErrorType || (exports.ErrorType = {}));
68
+ var DeviceAuthorizeState;
69
+ (function (DeviceAuthorizeState) {
70
+ // 完成
71
+ DeviceAuthorizeState["ACCOMPLISHED"] = "ACCOMPLISHED";
72
+ // 等待连接
73
+ DeviceAuthorizeState["WAITING_CONNECT"] = "WAITING_CONNECT";
74
+ // 等待用户点击同意界面
75
+ DeviceAuthorizeState["WAITING_CONSENT"] = "WAITING_CONSENT";
76
+ // 用户拒绝授权
77
+ DeviceAuthorizeState["ACCESS_DENIED"] = "ACCESS_DENIED";
78
+ })(DeviceAuthorizeState = exports.DeviceAuthorizeState || (exports.DeviceAuthorizeState = {}));
79
+ //# sourceMappingURL=consts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consts.js","sourceRoot":"","sources":["../../src/auth/consts.ts"],"names":[],"mappings":";;;AAAA,IAAY,OAgCX;AAhCD,WAAY,OAAO;IACf,+CAAoC,CAAA;IACpC,uEAA4D,CAAA;IAC5D,2EAAgE,CAAA;IAChE,+CAAoC,CAAA;IACpC,4CAAiC,CAAA;IACjC,8CAAmC,CAAA;IACnC,4DAAiD,CAAA;IACjD,yDAA8C,CAAA;IAC9C,qDAA0C,CAAA;IAC1C,2CAAgC,CAAA;IAChC,gDAAqC,CAAA;IACrC,iDAAsC,CAAA;IACtC,qDAA0C,CAAA;IAC1C,yEAA8D,CAAA;IAC9D,qDAA0C,CAAA;IAC1C,sDAA2C,CAAA;IAC3C,uDAA4C,CAAA;IAC5C,yDAA8C,CAAA;IAC9C,0CAA+B,CAAA;IAC/B,qDAA0C,CAAA;IAC1C,2DAAgD,CAAA;IAChD,gEAAqD,CAAA;IACrD,oDAAyC,CAAA;IACzC,kEAAuD,CAAA;IACvD,6DAAkD,CAAA;IAClD,8DAAmD,CAAA;IACnD,sDAA2C,CAAA;IAC3C,8DAAmD,CAAA;IACnD,sEAA2D,CAAA;IAC3D,8EAAmE,CAAA;IACnE,2DAAgD,CAAA;AACpD,CAAC,EAhCW,OAAO,GAAP,eAAO,KAAP,eAAO,QAgClB;AAED,IAAY,kBAMX;AAND,WAAY,kBAAkB;IAC1B,2CAAqB,CAAA;IACrB,yCAAmB,CAAA;IACnB,uDAAiC,CAAA;IACjC,mEAA6C,CAAA;IAC7C,iEAA2C,CAAA;AAC/C,CAAC,EANW,kBAAkB,GAAlB,0BAAkB,KAAlB,0BAAkB,QAM7B;AAED,IAAY,SAoBX;AApBD,WAAY,SAAS;IACjB,kDAAqC,CAAA;IACrC,oDAAuC,CAAA;IACvC,oCAAuB,CAAA;IACvB,8CAAiC,CAAA;IACjC,oDAAuC,CAAA;IACvC,gCAAmB,CAAA;IACnB,0CAA6B,CAAA;IAC7B,4CAA+B,CAAA;IAC/B,kCAAqB,CAAA;IACrB,wCAA2B,CAAA;IAC3B,oCAAuB,CAAA;IACvB,cAAc;IACd,kDAAqC,CAAA;IACrC,gDAAmC,CAAA;IACnC,kDAAqC,CAAA;IACrC,kDAAqC,CAAA;IACrC,8CAAiC,CAAA;IACjC,0CAA6B,CAAA;IAC7B,0CAA6B,CAAA;AACjC,CAAC,EApBW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAoBpB;AAED,IAAY,oBASX;AATD,WAAY,oBAAoB;IAC5B,KAAK;IACL,qDAA6B,CAAA;IAC7B,OAAO;IACR,2DAAmC,CAAA;IACnC,aAAa;IACb,2DAAmC,CAAA;IACnC,SAAS;IACT,uDAA+B,CAAA;AAClC,CAAC,EATW,oBAAoB,GAApB,4BAAoB,KAApB,4BAAoB,QAS/B"}