@actdim/dynstruct 0.9.8 → 1.0.0
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/appDomain/appContracts.d.ts +6 -0
- package/dist/appDomain/appContracts.d.ts.map +1 -1
- package/dist/appDomain/appContracts.es.js +7 -6
- package/dist/appDomain/appContracts.es.js.map +1 -1
- package/dist/appDomain/security/securityProvider.d.ts.map +1 -1
- package/dist/appDomain/security/securityProvider.es.js +6 -6
- package/dist/appDomain/security/securityProvider.es.js.map +1 -1
- package/dist/componentModel/componentModel.es.js +75 -76
- package/dist/componentModel/componentModel.es.js.map +1 -1
- package/dist/componentModel/scope.d.ts +0 -5
- package/dist/componentModel/scope.d.ts.map +1 -1
- package/dist/componentModel/scope.es.js +26 -68
- package/dist/componentModel/scope.es.js.map +1 -1
- package/dist/net/client.es.js +22 -22
- package/dist/net/client.es.js.map +1 -1
- package/dist/net/request.d.ts.map +1 -1
- package/dist/net/request.es.js +32 -27
- package/dist/net/request.es.js.map +1 -1
- package/package.json +38 -34
- package/dist/componentModel/componentModel.d.ts +0 -129
- package/dist/componentModel/componentModel.d.ts.map +0 -1
|
@@ -3,6 +3,7 @@ import { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityBusSt
|
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
export declare const $NAV_GOTO = "APP-NAV-GOTO";
|
|
5
5
|
export declare const $NAV_GET_CONTEXT = "APP-NAV-CONTEXT";
|
|
6
|
+
export declare const $NAV_READ_HISTORY = "APP-NAV-READ-HISTORY";
|
|
6
7
|
export declare const $NOTICE = "APP-NOTICE";
|
|
7
8
|
export declare const $CONFIG_GET = "APP-CONFIG-GET";
|
|
8
9
|
export declare const $FETCH = "APP-FETCH";
|
|
@@ -34,6 +35,7 @@ export type NavContext = {
|
|
|
34
35
|
params?: NavRouteParams;
|
|
35
36
|
navType?: NavAction;
|
|
36
37
|
};
|
|
38
|
+
export type NavHistory = Array<NavContext>;
|
|
37
39
|
export type AppError<TModule = Module> = {
|
|
38
40
|
module: TModule;
|
|
39
41
|
type: string;
|
|
@@ -67,6 +69,10 @@ export type BaseAppBusStruct = BaseApiBusStruct & MsgBusStructFactory<{
|
|
|
67
69
|
in: void;
|
|
68
70
|
out: NavContext;
|
|
69
71
|
};
|
|
72
|
+
[$NAV_READ_HISTORY]: {
|
|
73
|
+
in: number;
|
|
74
|
+
out: NavContext;
|
|
75
|
+
};
|
|
70
76
|
[$FETCH]: {
|
|
71
77
|
in: {
|
|
72
78
|
url: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACtG,OAAO,EAAE,wBAAwB,IAAI,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACrI,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,eAAO,MAAM,SAAS,iBAAiB,CAAC;AACxC,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
const E = "APP-NAV-GOTO", T = "APP-NAV-CONTEXT", O = "APP-
|
|
1
|
+
const E = "APP-NAV-GOTO", T = "APP-NAV-CONTEXT", O = "APP-NAV-READ-HISTORY", P = "APP-NOTICE", A = "APP-CONFIG-GET", V = "APP-FETCH", N = "APP-KV-STORE-GET", R = "APP-KV-STORE-SET", _ = "APP-KV-STORE-REMOVE";
|
|
2
2
|
export {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
A as $CONFIG_GET,
|
|
4
|
+
V as $FETCH,
|
|
5
|
+
N as $KV_STORE_GET,
|
|
6
6
|
_ as $KV_STORE_REMOVE,
|
|
7
|
-
|
|
7
|
+
R as $KV_STORE_SET,
|
|
8
8
|
T as $NAV_GET_CONTEXT,
|
|
9
9
|
E as $NAV_GOTO,
|
|
10
|
-
O as $
|
|
10
|
+
O as $NAV_READ_HISTORY,
|
|
11
|
+
P as $NOTICE
|
|
11
12
|
};
|
|
12
13
|
//# sourceMappingURL=appContracts.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { $CG_ERROR, MsgBus, MsgBusStructBase, MsgBusStructFactory } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityBusStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\n\r\nexport const $NAV_GOTO = \"APP-NAV-GOTO\";\r\nexport const $NAV_GET_CONTEXT = \"APP-NAV-CONTEXT\";\r\n// TOAST\r\nexport const $NOTICE = \"APP-NOTICE\";\r\nexport const $CONFIG_GET = \"APP-CONFIG-GET\";\r\n// ERROR?\r\nexport const $FETCH = \"APP-FETCH\";\r\n\r\nexport const $KV_STORE_GET = \"APP-KV-STORE-GET\";\r\nexport const $KV_STORE_SET = \"APP-KV-STORE-SET\";\r\nexport const $KV_STORE_REMOVE = \"APP-KV-STORE-REMOVE\";\r\n// TODO: has, clear, entries\r\n\r\nexport type Module = \"security\" | \"api-client\";\r\n\r\nexport type NavPath = {\r\n /**\r\n * A URL pathname, beginning with a /.\r\n */\r\n pathname: string;\r\n /**\r\n * A URL search string, beginning with a ?.\r\n */\r\n search: string;\r\n /**\r\n * A URL fragment identifier, beginning with a #.\r\n */\r\n hash: string;\r\n};\r\n\r\nexport type NavLocation<State = any> = NavPath & {\r\n /**\r\n * A value of arbitrary data associated with this location.\r\n */\r\n state: State;\r\n /**\r\n * A unique string associated with this location. May be used to safely store\r\n * and retrieve data in some other storage API, like `localStorage`.\r\n *\r\n * Note: This value is always \"default\" on the initial location.\r\n */\r\n key: string;\r\n};\r\n\r\nexport type NavAction =\r\n /**\r\n * A POP indicates a change to an arbitrary index in the history stack, such\r\n * as a back or forward navigation. It does not describe the direction of the\r\n * navigation, only that the current index changed.\r\n *\r\n * Note: This is the default action for newly created history objects.\r\n */\r\n | \"POP\"\r\n /**\r\n * A PUSH indicates a new entry being added to the history stack, such as when\r\n * a link is clicked and a new page loads. When this happens, all subsequent\r\n * entries in the stack are lost.\r\n */\r\n | \"PUSH\"\r\n /**\r\n * A REPLACE indicates the entry at the current index in the history stack\r\n * being replaced by a new one.\r\n */\r\n | \"REPLACE\";\r\n\r\n// AppRouteParams\r\nexport type NavRouteParams = Record<string, string | undefined>;\r\n\r\n// AppRoute\r\nexport type NavRoute<TParams extends NavRouteParams = NavRouteParams> = {\r\n path(params?: TParams): string;\r\n match(path: string): TParams;\r\n element: ReactNode;\r\n defaultParams?: TParams;\r\n};\r\n\r\nexport type NavRoutes = Record<string, NavRoute>;\r\n\r\nexport type NavContext = {\r\n // route?: NavRoute;\r\n location?: NavLocation;\r\n searchParams?: URLSearchParams;\r\n params?: NavRouteParams;\r\n navType?: NavAction;\r\n};\r\n\r\n// OperationContext?\r\nexport type AppError<TModule = Module> = {\r\n module: TModule;\r\n // code: string;\r\n type: string;\r\n title?: string;\r\n source?: any;\r\n details?: any;\r\n // instance?: string;\r\n timestamp?: string;\r\n // errors: AppError[];\r\n traceId?: string;\r\n field?: string;\r\n reason?: string;\r\n};\r\n\r\n// Base(App)Api(Msg)BusStruct\r\nexport type BaseApiBusStruct = BaseSecurityBusStruct &\r\n MsgBusStructFactory<{\r\n // \"GET-VERSION\"?: {\r\n // in: any;\r\n // };\r\n }>;\r\n\r\n// BaseAppMsgBusStruct\r\nexport type BaseAppBusStruct = BaseApiBusStruct &\r\n MsgBusStructFactory<\r\n {\r\n [$NOTICE]: {\r\n in: {\r\n text: string;\r\n title?: string;\r\n type: any;\r\n };\r\n out: void;\r\n };\r\n [$CONFIG_GET]: {\r\n in: void;\r\n out: BaseAppDomainConfig;\r\n };\r\n [$NAV_GOTO]: {\r\n in: string | number;\r\n out: void;\r\n };\r\n [$NAV_GET_CONTEXT]: {\r\n in: void;\r\n out: NavContext;\r\n };\r\n [$FETCH]: {\r\n in: {\r\n url: string;\r\n params: RequestInit;\r\n };\r\n out: Response;\r\n };\r\n [$KV_STORE_GET]: {\r\n in: {\r\n key: string;\r\n useEncryption?: boolean;\r\n };\r\n out: string;\r\n };\r\n [$KV_STORE_SET]: {\r\n in: {\r\n key: string;\r\n value: any;\r\n useEncryption?: boolean;\r\n };\r\n out: void;\r\n };\r\n [$KV_STORE_REMOVE]: {\r\n in: {\r\n key: string;\r\n };\r\n out: void;\r\n };\r\n } & MsgBusStructBase\r\n >;\r\n\r\nexport type BaseApiConfig = {\r\n url?: string;\r\n versions?: string[];\r\n};\r\n\r\n// BaseApp(Domain)Config\r\nexport type BaseAppDomainConfig<\r\n TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig,\r\n TApiConfig extends BaseApiConfig = BaseApiConfig\r\n> = {\r\n id: string;\r\n name?: string;\r\n baseUrl: string;\r\n security: TSecurityDomainConfig;\r\n apis: Record<string, TApiConfig>;\r\n // HATEOAS? (React Admin)\r\n};\r\n\r\nexport type BaseAppContext<TMsgBusStruct extends BaseAppBusStruct = BaseAppBusStruct> = {\r\n msgBus: MsgBus<TMsgBusStruct>;\r\n};\r\n"],"names":["$NAV_GOTO","$NAV_GET_CONTEXT","$NOTICE","$CONFIG_GET","$FETCH","$KV_STORE_GET","$KV_STORE_SET","$KV_STORE_REMOVE"],"mappings":"AAIO,MAAMA,IAAY,gBACZC,IAAmB,
|
|
1
|
+
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { $CG_ERROR, MsgBus, MsgBusStructBase, MsgBusStructFactory } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityBusStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\n\r\nexport const $NAV_GOTO = \"APP-NAV-GOTO\";\r\nexport const $NAV_GET_CONTEXT = \"APP-NAV-CONTEXT\";\r\nexport const $NAV_READ_HISTORY = \"APP-NAV-READ-HISTORY\";\r\n// TOAST\r\nexport const $NOTICE = \"APP-NOTICE\";\r\nexport const $CONFIG_GET = \"APP-CONFIG-GET\";\r\n// ERROR?\r\nexport const $FETCH = \"APP-FETCH\";\r\n\r\nexport const $KV_STORE_GET = \"APP-KV-STORE-GET\";\r\nexport const $KV_STORE_SET = \"APP-KV-STORE-SET\";\r\nexport const $KV_STORE_REMOVE = \"APP-KV-STORE-REMOVE\";\r\n// TODO: has, clear, entries\r\n\r\nexport type Module = \"security\" | \"api-client\";\r\n\r\nexport type NavPath = {\r\n /**\r\n * A URL pathname, beginning with a /.\r\n */\r\n pathname: string;\r\n /**\r\n * A URL search string, beginning with a ?.\r\n */\r\n search: string;\r\n /**\r\n * A URL fragment identifier, beginning with a #.\r\n */\r\n hash: string;\r\n};\r\n\r\nexport type NavLocation<State = any> = NavPath & {\r\n /**\r\n * A value of arbitrary data associated with this location.\r\n */\r\n state: State;\r\n /**\r\n * A unique string associated with this location. May be used to safely store\r\n * and retrieve data in some other storage API, like `localStorage`.\r\n *\r\n * Note: This value is always \"default\" on the initial location.\r\n */\r\n key: string;\r\n};\r\n\r\nexport type NavAction =\r\n /**\r\n * A POP indicates a change to an arbitrary index in the history stack, such\r\n * as a back or forward navigation. It does not describe the direction of the\r\n * navigation, only that the current index changed.\r\n *\r\n * Note: This is the default action for newly created history objects.\r\n */\r\n | \"POP\"\r\n /**\r\n * A PUSH indicates a new entry being added to the history stack, such as when\r\n * a link is clicked and a new page loads. When this happens, all subsequent\r\n * entries in the stack are lost.\r\n */\r\n | \"PUSH\"\r\n /**\r\n * A REPLACE indicates the entry at the current index in the history stack\r\n * being replaced by a new one.\r\n */\r\n | \"REPLACE\";\r\n\r\n// AppRouteParams\r\nexport type NavRouteParams = Record<string, string | undefined>;\r\n\r\n// AppRoute\r\nexport type NavRoute<TParams extends NavRouteParams = NavRouteParams> = {\r\n path(params?: TParams): string;\r\n match(path: string): TParams;\r\n element: ReactNode;\r\n defaultParams?: TParams;\r\n};\r\n\r\nexport type NavRoutes = Record<string, NavRoute>;\r\n\r\nexport type NavContext = {\r\n // route?: NavRoute;\r\n location?: NavLocation;\r\n searchParams?: URLSearchParams;\r\n params?: NavRouteParams;\r\n navType?: NavAction;\r\n};\r\n\r\nexport type NavHistory = Array<NavContext>;\r\n\r\n// OperationContext?\r\nexport type AppError<TModule = Module> = {\r\n module: TModule;\r\n // code: string;\r\n type: string;\r\n title?: string;\r\n source?: any;\r\n details?: any;\r\n // instance?: string;\r\n timestamp?: string;\r\n // errors: AppError[];\r\n traceId?: string;\r\n field?: string;\r\n reason?: string;\r\n};\r\n\r\n// Base(App)Api(Msg)BusStruct\r\nexport type BaseApiBusStruct = BaseSecurityBusStruct &\r\n MsgBusStructFactory<{\r\n // \"GET-VERSION\"?: {\r\n // in: any;\r\n // };\r\n }>;\r\n\r\n// BaseAppMsgBusStruct\r\nexport type BaseAppBusStruct = BaseApiBusStruct &\r\n MsgBusStructFactory<\r\n {\r\n [$NOTICE]: {\r\n in: {\r\n text: string;\r\n title?: string;\r\n type: any;\r\n };\r\n out: void;\r\n };\r\n [$CONFIG_GET]: {\r\n in: void;\r\n out: BaseAppDomainConfig;\r\n };\r\n [$NAV_GOTO]: {\r\n in: string | number;\r\n out: void;\r\n };\r\n [$NAV_GET_CONTEXT]: {\r\n in: void;\r\n out: NavContext;\r\n };\r\n [$NAV_READ_HISTORY]: {\r\n in: number;\r\n out: NavContext;\r\n };\r\n [$FETCH]: {\r\n in: {\r\n url: string;\r\n params: RequestInit;\r\n };\r\n out: Response;\r\n };\r\n [$KV_STORE_GET]: {\r\n in: {\r\n key: string;\r\n useEncryption?: boolean;\r\n };\r\n out: string;\r\n };\r\n [$KV_STORE_SET]: {\r\n in: {\r\n key: string;\r\n value: any;\r\n useEncryption?: boolean;\r\n };\r\n out: void;\r\n };\r\n [$KV_STORE_REMOVE]: {\r\n in: {\r\n key: string;\r\n };\r\n out: void;\r\n };\r\n } & MsgBusStructBase\r\n >;\r\n\r\nexport type BaseApiConfig = {\r\n url?: string;\r\n versions?: string[];\r\n};\r\n\r\n// BaseApp(Domain)Config\r\nexport type BaseAppDomainConfig<\r\n TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig,\r\n TApiConfig extends BaseApiConfig = BaseApiConfig\r\n> = {\r\n id: string;\r\n name?: string;\r\n baseUrl: string;\r\n security: TSecurityDomainConfig;\r\n apis: Record<string, TApiConfig>;\r\n // HATEOAS? (React Admin)\r\n};\r\n\r\nexport type BaseAppContext<TMsgBusStruct extends BaseAppBusStruct = BaseAppBusStruct> = {\r\n msgBus: MsgBus<TMsgBusStruct>;\r\n};\r\n"],"names":["$NAV_GOTO","$NAV_GET_CONTEXT","$NAV_READ_HISTORY","$NOTICE","$CONFIG_GET","$FETCH","$KV_STORE_GET","$KV_STORE_SET","$KV_STORE_REMOVE"],"mappings":"AAIO,MAAMA,IAAY,gBACZC,IAAmB,mBACnBC,IAAoB,wBAEpBC,IAAU,cACVC,IAAc,kBAEdC,IAAS,aAETC,IAAgB,oBAChBC,IAAgB,oBAChBC,IAAmB;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityProvider.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,iBAAiB,EACjB,UAAU,EAEV,eAAe,EAEf,eAAe,EAClB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiC5D,qBAAa,gBAAgB,CAAC,SAAS,GAAG,GAAG;IAKzC,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,YAAY,CAA2B;IAE/C,OAAO,CAAC,WAAW,CAAqB;IAExC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,QAAQ,CAAY;IAG5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,CAAC,OAAO,CAA8E;IAE7F,OAAO,CAAC,IAAI,CAAe;gBAEf,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC;IA8DrC,UAAU,IAAI,eAAe;YAWtB,iBAAiB;
|
|
1
|
+
{"version":3,"file":"securityProvider.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityProvider.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,WAAW,EACX,iBAAiB,EACjB,UAAU,EAEV,eAAe,EAEf,eAAe,EAClB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAiC5D,qBAAa,gBAAgB,CAAC,SAAS,GAAG,GAAG;IAKzC,OAAO,CAAC,MAAM,CAA2B;IAEzC,OAAO,CAAC,YAAY,CAA2B;IAE/C,OAAO,CAAC,WAAW,CAAqB;IAExC,OAAO,CAAC,WAAW,CAAS;IAE5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,eAAe,CAAkB;IAEzC,OAAO,CAAC,QAAQ,CAAY;IAG5B,OAAO,CAAC,YAAY,CAAS;IAE7B,OAAO,CAAC,cAAc,CAAS;IAG/B,OAAO,CAAC,GAAG,CAAM;IAEjB,OAAO,CAAC,OAAO,CAA8E;IAE7F,OAAO,CAAC,IAAI,CAAe;gBAEf,MAAM,EAAE,MAAM,CAAC,gBAAgB,CAAC;IA8DrC,UAAU,IAAI,eAAe;YAWtB,iBAAiB;IAUzB,gBAAgB;IAqDtB,IAAW,MAAM,IAAI,MAAM,CAE1B;IAaK,mBAAmB;IA+BnB,gBAAgB;IA0BhB,WAAW,CAAC,WAAW,EAAE,eAAe;IA0CxC,aAAa;IA+Bb,YAAY;IAgCZ,YAAY;IA4CZ,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC;IASnC,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,cAAmB;CAOlF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { AccessLevel as h } from "./securityContracts.es.js";
|
|
2
2
|
import { getValuePrefixer as l } from "@actdim/utico/typeCore";
|
|
3
3
|
import "jwt-decode";
|
|
4
|
-
import { getResponseResult as
|
|
5
|
-
import { ApiError as
|
|
4
|
+
import { getResponseResult as r } from "../../net/request.es.js";
|
|
5
|
+
import { ApiError as c } from "../../net/apiError.es.js";
|
|
6
6
|
const u = {
|
|
7
7
|
accessToken: "ACCESS_TOKEN",
|
|
8
8
|
refreshToken: "REFRESH_TOKEN",
|
|
@@ -69,7 +69,7 @@ class E {
|
|
|
69
69
|
});
|
|
70
70
|
this.domainConfig = s.payload.security;
|
|
71
71
|
const e = l(`${this.domainConfig.id}/`);
|
|
72
|
-
this.storageKeys = e(u);
|
|
72
|
+
this.storageKeys = e(u), await this.restoreDataAsync();
|
|
73
73
|
}
|
|
74
74
|
async restoreDataAsync() {
|
|
75
75
|
this.accessToken = (await this.msgBus.dispatchAsync({
|
|
@@ -172,7 +172,7 @@ class E {
|
|
|
172
172
|
...t,
|
|
173
173
|
status: "executing"
|
|
174
174
|
}, a = await this.fetcher.fetch(e, t);
|
|
175
|
-
await
|
|
175
|
+
await r(a, i), c.assert(a, i);
|
|
176
176
|
let o = a.resolved.json;
|
|
177
177
|
return this.userCredentials = s, this.accessToken = o.accessToken, this.refreshToken = o.refreshToken, this.saveDataAsync(), this.getContext();
|
|
178
178
|
}
|
|
@@ -217,7 +217,7 @@ class E {
|
|
|
217
217
|
...e,
|
|
218
218
|
status: "executing"
|
|
219
219
|
}, t = await this.fetcher.fetch(s, e);
|
|
220
|
-
await
|
|
220
|
+
await r(t, n), c.assert(t, n), this.clearSavedDataAsync();
|
|
221
221
|
}
|
|
222
222
|
async refreshAsync() {
|
|
223
223
|
let s = this.domainConfig.routes?.authRefresh;
|
|
@@ -238,7 +238,7 @@ class E {
|
|
|
238
238
|
...t,
|
|
239
239
|
status: "executing"
|
|
240
240
|
}, a = await this.fetcher.fetch(s, t);
|
|
241
|
-
return await
|
|
241
|
+
return await r(a, i), c.assert(a, i), e = a.resolved.json, this.accessToken = e.accessToken, this.refreshToken = e.refreshToken, this.saveDataAsync(), this.getContext();
|
|
242
242
|
}
|
|
243
243
|
async getAcl(s) {
|
|
244
244
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityProvider.es.js","sources":["../../../src/appDomain/security/securityProvider.ts"],"sourcesContent":["import {\r\n AccessLevel,\r\n IAccessDescriptor,\r\n ISecurable,\r\n BaseSecurityDomainConfig,\r\n UserCredentials,\r\n SecurityTokens,\r\n SecurityContext\r\n} from \"./securityContracts\";\r\nimport { getValuePrefixer } from \"@actdim/utico/typeCore\";\r\nimport { jwtDecode } from \"jwt-decode\";\r\nimport { getResponseResult, IRequestParams, IRequestState, IResponseState } from \"@/net/request\";\r\nimport { ApiError } from \"@/net/apiError\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseAppBusStruct } from \"@/appDomain/appContracts\";\r\n\r\nconst userNameClaim = \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\";\r\n\r\n// JwtTokenPayload\r\ntype TokenPayload = {\r\n [userNameClaim]: string;\r\n};\r\n\r\n// Access denied\r\n// Insufficient privileges to perform this operation\r\nconst defaultAccessDeniedReason = \"Insufficient privileges. Contact your system Administrator.\";\r\n\r\nconst storageKeys = {\r\n accessToken: \"ACCESS_TOKEN\",\r\n refreshToken: \"REFRESH_TOKEN\",\r\n acl: \"ACL\",\r\n userCredentials: \"USER_CREDENTIALS\",\r\n userInfo: \"USER_INFO\"\r\n};\r\n\r\nfunction decodeJWTToken<T extends TokenPayload>(token: string): T {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n return jwtDecode<T>(this.accessToken);\r\n } catch {\r\n // something wrong with the token\r\n return null;\r\n }\r\n}\r\n\r\nexport class SecurityProvider<TUserInfo = any> {\r\n // private isAuthenticated: boolean;\r\n\r\n // private isExpired: boolean;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private domainConfig: BaseSecurityDomainConfig;\r\n\r\n private storageKeys: typeof storageKeys;\r\n\r\n private accessToken: string;\r\n\r\n private refreshToken: string;\r\n\r\n private userCredentials: UserCredentials;\r\n\r\n private userInfo: TUserInfo;\r\n\r\n // private authority: string;\r\n private authProvider: string;\r\n\r\n private tokenExpiresAt: string;\r\n\r\n // RBAC vs ABAC vs PBAC: https://habr.com/ru/companies/otus/articles/698080/\r\n private acl: any;\r\n\r\n private fetcher: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> } = window;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(msgBus: MsgBus<BaseAppBusStruct>) {\r\n this.msgBus = msgBus;\r\n\r\n this.init = this.updateConfigAsync();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONTEXT\",\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-ACL\",\r\n callback: (msg) => {\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n callback: (msg) => {\r\n return this.signInAsync(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n callback: (msg) => {\r\n return this.signOutAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\",\r\n callback: (msg) => {\r\n return this.refreshAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\",\r\n callback: (msg) => {\r\n return this.requestAuthorize();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONFIG\",\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n })\r\n ).payload?.security;\r\n }\r\n });\r\n }\r\n\r\n public getContext(): SecurityContext {\r\n return {\r\n accessToken: this.accessToken,\r\n refreshToken: this.refreshToken,\r\n userInfo: this.userInfo,\r\n authProvider: this.authProvider,\r\n domain: this.domain,\r\n tokenExpiresAt: this.tokenExpiresAt\r\n };\r\n }\r\n\r\n private async updateConfigAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n this.domainConfig = msg.payload.security;\r\n const prefixer = getValuePrefixer<typeof storageKeys>(`${this.domainConfig.id}/`);\r\n this.storageKeys = prefixer(storageKeys);\r\n }\r\n\r\n async restoreDataAsync() {\r\n this.accessToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload;\r\n this.refreshToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload;\r\n let value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload;\r\n\r\n this.userCredentials = value\r\n ? JSON.parse(value)\r\n : {\r\n username: undefined,\r\n password: undefined\r\n };\r\n\r\n value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload;\r\n\r\n this.acl = value ? JSON.parse(value) : {};\r\n\r\n if (this.accessToken) {\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n payload: this.getContext()\r\n });\r\n }\r\n }\r\n\r\n public get domain(): string {\r\n return this.domainConfig.id;\r\n }\r\n\r\n // cleanUserAndActionsStorage = (): void => {\r\n // const obsoleteKeysRegexMatch = /^(user|actions)@.+$/;\r\n // for (let i = localStorage.length - 1; i >= 0; i--) {\r\n // const key = localStorage.key(i);\r\n // if (key && obsoleteKeysRegexMatch.test(key)) {\r\n // localStorage.removeItem(key);\r\n // }\r\n // }\r\n // };\r\n\r\n // removeSavedData\r\n async clearSavedDataAsync() {\r\n this.accessToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n });\r\n this.refreshToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n });\r\n this.userCredentials = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async requestAuthorize() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n group: \"out\"\r\n });\r\n throw new Error(\"Auth failed: login aborted\");\r\n };\r\n\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-REQUEST-AUTH-SIGNIN\",\r\n payload: {\r\n callbackUrl: window.location.pathname + window.location.search\r\n }\r\n });\r\n await Promise.race([signIn, signOut]);\r\n }\r\n\r\n async signInAsync(credentials: UserCredentials) {\r\n let url = this.domainConfig.routes?.authSignIn;\r\n\r\n url = url.replace(/[?&]$/, \"\");\r\n\r\n const content = JSON.stringify(credentials);\r\n\r\n // application/x-www-form-urlencoded?\r\n // username=&password=\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n let tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.userCredentials = credentials;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveDataAsync() {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.accessToken,\r\n value: this.accessToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken,\r\n value: this.refreshToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? JSON.stringify(this.userCredentials) : \"\"\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? JSON.stringify(this.acl) : \"\"\r\n }\r\n });\r\n }\r\n\r\n async signOutAsync() {\r\n let url = this.domainConfig.routes?.authSignOut;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n // this.accessToken = null;\r\n // this.refreshToken = null;\r\n // this.userCredentials = null;\r\n // this.acl = null;\r\n // this.saveDataAsync();\r\n this.clearSavedDataAsync();\r\n }\r\n\r\n async refreshAsync() {\r\n let url = this.domainConfig.routes?.authRefresh;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n let tokens: SecurityTokens = {\r\n refreshToken: this.refreshToken\r\n };\r\n\r\n const content = JSON.stringify(tokens);\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n // useAuth: true,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.userInfo = ...; // TODO\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async getAcl<T extends ISecurable>(obj: T) {\r\n // TODO: read from this.acl\r\n\r\n return {\r\n [AccessLevel.Full]: \"\"\r\n } as IAccessDescriptor;\r\n }\r\n\r\n // authorize\r\n async verifyAccess<T extends ISecurable>(obj: T, accessLevel = AccessLevel.Full) {\r\n const acl = this.getAcl(obj);\r\n\r\n // TODO: check accessDescriptors\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["storageKeys","SecurityProvider","msgBus","msg","prefixer","getValuePrefixer","value","signIn","signOut","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","obj","AccessLevel","accessLevel"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"securityProvider.es.js","sources":["../../../src/appDomain/security/securityProvider.ts"],"sourcesContent":["import {\r\n AccessLevel,\r\n IAccessDescriptor,\r\n ISecurable,\r\n BaseSecurityDomainConfig,\r\n UserCredentials,\r\n SecurityTokens,\r\n SecurityContext\r\n} from \"./securityContracts\";\r\nimport { getValuePrefixer } from \"@actdim/utico/typeCore\";\r\nimport { jwtDecode } from \"jwt-decode\";\r\nimport { getResponseResult, IRequestParams, IRequestState, IResponseState } from \"@/net/request\";\r\nimport { ApiError } from \"@/net/apiError\";\r\nimport { MsgBus } from \"@actdim/msgmesh/msgBusCore\";\r\nimport { BaseAppBusStruct } from \"@/appDomain/appContracts\";\r\n\r\nconst userNameClaim = \"http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name\";\r\n\r\n// JwtTokenPayload\r\ntype TokenPayload = {\r\n [userNameClaim]: string;\r\n};\r\n\r\n// Access denied\r\n// Insufficient privileges to perform this operation\r\nconst defaultAccessDeniedReason = \"Insufficient privileges. Contact your system Administrator.\";\r\n\r\nconst storageKeys = {\r\n accessToken: \"ACCESS_TOKEN\",\r\n refreshToken: \"REFRESH_TOKEN\",\r\n acl: \"ACL\",\r\n userCredentials: \"USER_CREDENTIALS\",\r\n userInfo: \"USER_INFO\"\r\n};\r\n\r\nfunction decodeJWTToken<T extends TokenPayload>(token: string): T {\r\n if (!token) {\r\n return null;\r\n }\r\n try {\r\n return jwtDecode<T>(this.accessToken);\r\n } catch {\r\n // something wrong with the token\r\n return null;\r\n }\r\n}\r\n\r\nexport class SecurityProvider<TUserInfo = any> {\r\n // private isAuthenticated: boolean;\r\n\r\n // private isExpired: boolean;\r\n\r\n private msgBus: MsgBus<BaseAppBusStruct>;\r\n\r\n private domainConfig: BaseSecurityDomainConfig;\r\n\r\n private storageKeys: typeof storageKeys;\r\n\r\n private accessToken: string;\r\n\r\n private refreshToken: string;\r\n\r\n private userCredentials: UserCredentials;\r\n\r\n private userInfo: TUserInfo;\r\n\r\n // private authority: string;\r\n private authProvider: string;\r\n\r\n private tokenExpiresAt: string;\r\n\r\n // RBAC vs ABAC vs PBAC: https://habr.com/ru/companies/otus/articles/698080/\r\n private acl: any;\r\n\r\n private fetcher: { fetch(url: RequestInfo, init?: RequestInit): Promise<Response> } = window;\r\n\r\n private init: Promise<any>;\r\n\r\n constructor(msgBus: MsgBus<BaseAppBusStruct>) {\r\n this.msgBus = msgBus;\r\n\r\n this.init = this.updateConfigAsync();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONTEXT\",\r\n callback: (msg) => {\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-ACL\",\r\n callback: (msg) => {\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n callback: (msg) => {\r\n return this.signInAsync(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n callback: (msg) => {\r\n return this.signOutAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-AUTH-REFRESH\",\r\n callback: (msg) => {\r\n return this.refreshAsync();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-REQUEST-AUTH\",\r\n callback: (msg) => {\r\n return this.requestAuthorize();\r\n }\r\n });\r\n\r\n // HELPER\r\n this.msgBus.provide({\r\n channel: \"APP-SECURITY-GET-CONFIG\",\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n })\r\n ).payload?.security;\r\n }\r\n });\r\n }\r\n\r\n public getContext(): SecurityContext {\r\n return {\r\n accessToken: this.accessToken,\r\n refreshToken: this.refreshToken,\r\n userInfo: this.userInfo,\r\n authProvider: this.authProvider,\r\n domain: this.domain,\r\n tokenExpiresAt: this.tokenExpiresAt\r\n };\r\n }\r\n\r\n private async updateConfigAsync() {\r\n const msg = await this.msgBus.dispatchAsync({\r\n channel: \"APP-CONFIG-GET\"\r\n });\r\n this.domainConfig = msg.payload.security;\r\n const prefixer = getValuePrefixer<typeof storageKeys>(`${this.domainConfig.id}/`);\r\n this.storageKeys = prefixer(storageKeys);\r\n await this.restoreDataAsync();\r\n }\r\n\r\n async restoreDataAsync() {\r\n this.accessToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload;\r\n this.refreshToken = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload;\r\n let value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload;\r\n\r\n this.userCredentials = value\r\n ? JSON.parse(value)\r\n : {\r\n username: undefined,\r\n password: undefined\r\n };\r\n\r\n value = (\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload;\r\n\r\n this.acl = value ? JSON.parse(value) : {};\r\n\r\n if (this.accessToken) {\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\",\r\n payload: this.getContext()\r\n });\r\n }\r\n }\r\n\r\n public get domain(): string {\r\n return this.domainConfig.id;\r\n }\r\n\r\n // cleanUserAndActionsStorage = (): void => {\r\n // const obsoleteKeysRegexMatch = /^(user|actions)@.+$/;\r\n // for (let i = localStorage.length - 1; i >= 0; i--) {\r\n // const key = localStorage.key(i);\r\n // if (key && obsoleteKeysRegexMatch.test(key)) {\r\n // localStorage.removeItem(key);\r\n // }\r\n // }\r\n // };\r\n\r\n // removeSavedData\r\n async clearSavedDataAsync() {\r\n this.accessToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n });\r\n this.refreshToken = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n });\r\n this.userCredentials = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-REMOVE\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async requestAuthorize() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNIN\",\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.onceAsync({\r\n channel: \"APP-SECURITY-AUTH-SIGNOUT\",\r\n group: \"out\"\r\n });\r\n throw new Error(\"Auth failed: login aborted\");\r\n };\r\n\r\n this.msgBus.dispatch({\r\n channel: \"APP-SECURITY-REQUEST-AUTH-SIGNIN\",\r\n payload: {\r\n callbackUrl: window.location.pathname + window.location.search\r\n }\r\n });\r\n await Promise.race([signIn, signOut]);\r\n }\r\n\r\n async signInAsync(credentials: UserCredentials) {\r\n let url = this.domainConfig.routes?.authSignIn;\r\n\r\n url = url.replace(/[?&]$/, \"\");\r\n\r\n const content = JSON.stringify(credentials);\r\n\r\n // application/x-www-form-urlencoded?\r\n // username=&password=\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n let tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.userCredentials = credentials;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveDataAsync() {\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.accessToken,\r\n value: this.accessToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken,\r\n value: this.refreshToken || null\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? JSON.stringify(this.userCredentials) : \"\"\r\n }\r\n });\r\n await this.msgBus.dispatchAsync({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? JSON.stringify(this.acl) : \"\"\r\n }\r\n });\r\n }\r\n\r\n async signOutAsync() {\r\n let url = this.domainConfig.routes?.authSignOut;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n method: \"POST\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n // this.accessToken = null;\r\n // this.refreshToken = null;\r\n // this.userCredentials = null;\r\n // this.acl = null;\r\n // this.saveDataAsync();\r\n this.clearSavedDataAsync();\r\n }\r\n\r\n async refreshAsync() {\r\n let url = this.domainConfig.routes?.authRefresh;\r\n if (url) {\r\n url = url.replace(/[?&]$/, \"\");\r\n }\r\n\r\n let tokens: SecurityTokens = {\r\n refreshToken: this.refreshToken\r\n };\r\n\r\n const content = JSON.stringify(tokens);\r\n\r\n const requestParams: IRequestParams = {\r\n url: url,\r\n body: content,\r\n method: \"POST\",\r\n // useAuth: true,\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n Accept: \"text/plain\"\r\n }\r\n };\r\n\r\n const request: IRequestState = {\r\n ...requestParams,\r\n status: \"executing\"\r\n };\r\n\r\n const response: IResponseState = await this.fetcher.fetch(url, requestParams);\r\n await getResponseResult(response, request);\r\n ApiError.assert(response, request);\r\n\r\n tokens = response.resolved.json as SecurityTokens;\r\n\r\n this.accessToken = tokens.accessToken;\r\n this.refreshToken = tokens.refreshToken;\r\n // this.userInfo = ...; // TODO\r\n // this.acl = ...;\r\n\r\n this.saveDataAsync();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async getAcl<T extends ISecurable>(obj: T) {\r\n // TODO: read from this.acl\r\n\r\n return {\r\n [AccessLevel.Full]: \"\"\r\n } as IAccessDescriptor;\r\n }\r\n\r\n // authorize\r\n async verifyAccess<T extends ISecurable>(obj: T, accessLevel = AccessLevel.Full) {\r\n const acl = this.getAcl(obj);\r\n\r\n // TODO: check accessDescriptors\r\n\r\n return false;\r\n }\r\n}\r\n"],"names":["storageKeys","SecurityProvider","msgBus","msg","prefixer","getValuePrefixer","value","signIn","signOut","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","obj","AccessLevel","accessLevel"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
const P = {
|
|
1
|
+
import { useLayoutEffect as k, useEffect as B } from "react";
|
|
2
|
+
import { observer as R } from "mobx-react-lite";
|
|
3
|
+
import { observable as P, runInAction as E } from "mobx";
|
|
4
|
+
import { useLazyRef as G } from "../reactHooks.es.js";
|
|
5
|
+
const O = {
|
|
7
6
|
$isBinding: Symbol("$isBinding")
|
|
8
7
|
};
|
|
9
|
-
class
|
|
8
|
+
class $ {
|
|
10
9
|
// getter
|
|
11
10
|
get;
|
|
12
11
|
// setter
|
|
@@ -14,58 +13,58 @@ class k {
|
|
|
14
13
|
converter;
|
|
15
14
|
validator;
|
|
16
15
|
readOnly;
|
|
17
|
-
constructor(t, o, i,
|
|
18
|
-
this.get = t, this.set = o, this.converter = i, this.validator =
|
|
16
|
+
constructor(t, o, i, l) {
|
|
17
|
+
this.get = t, this.set = o, this.converter = i, this.validator = l, this.readOnly = !!o, this[O.$isBinding] = !0;
|
|
19
18
|
}
|
|
20
|
-
[
|
|
19
|
+
[O.$isBinding];
|
|
21
20
|
}
|
|
22
|
-
function
|
|
23
|
-
return e[
|
|
21
|
+
function w(e) {
|
|
22
|
+
return e[O.$isBinding] === !0;
|
|
24
23
|
}
|
|
25
|
-
function
|
|
26
|
-
return new
|
|
24
|
+
function V(e, t, o, i) {
|
|
25
|
+
return new $(e, t, o, i);
|
|
27
26
|
}
|
|
28
|
-
function
|
|
29
|
-
return new
|
|
27
|
+
function _(e, t) {
|
|
28
|
+
return new $(
|
|
30
29
|
() => e[t],
|
|
31
30
|
(o) => {
|
|
32
31
|
e[t] = o;
|
|
33
32
|
}
|
|
34
33
|
);
|
|
35
34
|
}
|
|
36
|
-
const
|
|
37
|
-
function
|
|
38
|
-
const i = o.onPropChanging,
|
|
35
|
+
const j = "onGet", I = "onChanging", L = "onChange";
|
|
36
|
+
function N(e, t, o) {
|
|
37
|
+
const i = o.onPropChanging, l = o.onPropChange;
|
|
39
38
|
return new Proxy(e, {
|
|
40
|
-
get(
|
|
41
|
-
const C = o[
|
|
39
|
+
get(c, u, g) {
|
|
40
|
+
const C = o[u]?.onGet;
|
|
42
41
|
if (C)
|
|
43
42
|
return C();
|
|
44
|
-
const
|
|
45
|
-
return
|
|
43
|
+
const a = t.get(String(u));
|
|
44
|
+
return a ? a.get() : Reflect.get(c, u, g);
|
|
46
45
|
},
|
|
47
|
-
set(
|
|
48
|
-
const
|
|
49
|
-
if (
|
|
46
|
+
set(c, u, g, C) {
|
|
47
|
+
const a = c[u], y = o[u]?.onChanging;
|
|
48
|
+
if (y && !y(a, g) || i && !i(u, a, g))
|
|
50
49
|
return !0;
|
|
51
|
-
const
|
|
52
|
-
n?.set && n.set(
|
|
53
|
-
const r = o[
|
|
54
|
-
return r && r(
|
|
50
|
+
const b = E(() => Reflect.set(c, u, g, C)), n = t.get(u);
|
|
51
|
+
n?.set && n.set(g);
|
|
52
|
+
const r = o[u]?.onChange;
|
|
53
|
+
return r && r(g), l && l(u, g), b;
|
|
55
54
|
}
|
|
56
55
|
});
|
|
57
56
|
}
|
|
58
|
-
function
|
|
57
|
+
function v(e) {
|
|
59
58
|
return e.replace(/^./, e[0].toUpperCase());
|
|
60
59
|
}
|
|
61
|
-
function
|
|
62
|
-
const o = e.msgBus, i = e.view,
|
|
63
|
-
let
|
|
60
|
+
function S(e, t) {
|
|
61
|
+
const o = e.msgBus, i = e.view, l = R((n) => typeof i == "function" ? i(n) : /* @__PURE__ */ React.createElement(React.Fragment, null, n.children));
|
|
62
|
+
let c = {
|
|
64
63
|
...e.props,
|
|
65
64
|
...e.methods,
|
|
66
65
|
// view: component.view,
|
|
67
66
|
// View: ViewerFC,
|
|
68
|
-
View:
|
|
67
|
+
View: l,
|
|
69
68
|
msgBus: o
|
|
70
69
|
};
|
|
71
70
|
if (e.children)
|
|
@@ -73,42 +72,42 @@ function F(e, t) {
|
|
|
73
72
|
if (typeof r == "function") {
|
|
74
73
|
const s = (h) => {
|
|
75
74
|
const f = r(h);
|
|
76
|
-
return /* @__PURE__ */
|
|
75
|
+
return /* @__PURE__ */ React.createElement(f.View, null);
|
|
77
76
|
};
|
|
78
|
-
Reflect.set(
|
|
77
|
+
Reflect.set(c, v(n), s);
|
|
79
78
|
} else
|
|
80
|
-
Reflect.set(
|
|
79
|
+
Reflect.set(c, n, r);
|
|
81
80
|
if (e.msgBroker) {
|
|
82
81
|
const n = e.msgBroker.provide;
|
|
83
82
|
if (n)
|
|
84
83
|
for (const [s, h] of Object.entries(n))
|
|
85
|
-
for (const [f,
|
|
84
|
+
for (const [f, d] of Object.entries(h))
|
|
86
85
|
o.provide({
|
|
87
|
-
...
|
|
86
|
+
...d,
|
|
88
87
|
channel: s,
|
|
89
88
|
group: f
|
|
90
89
|
});
|
|
91
90
|
const r = e.msgBroker.subscribe;
|
|
92
91
|
if (r)
|
|
93
92
|
for (const [s, h] of Object.entries(r))
|
|
94
|
-
for (const [f,
|
|
93
|
+
for (const [f, d] of Object.entries(h))
|
|
95
94
|
o.on({
|
|
96
|
-
...
|
|
95
|
+
...d,
|
|
97
96
|
channel: s,
|
|
98
97
|
group: f
|
|
99
98
|
});
|
|
100
99
|
}
|
|
101
|
-
const
|
|
100
|
+
const u = /* @__PURE__ */ new Map();
|
|
102
101
|
for (const [n, r] of Object.entries(t))
|
|
103
|
-
|
|
104
|
-
const
|
|
102
|
+
w(r) ? u.set(n, r) : Reflect.set(c, n, r);
|
|
103
|
+
const g = {};
|
|
105
104
|
if (e.props)
|
|
106
105
|
for (const n of Object.keys(e.props))
|
|
107
|
-
|
|
106
|
+
g[n] = P.ref;
|
|
108
107
|
if (e.methods)
|
|
109
108
|
for (const n of Object.keys(e.methods))
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
g[n] = !1;
|
|
110
|
+
g.View = !1, g.msgBus = !1;
|
|
112
111
|
const C = {
|
|
113
112
|
onPropChanging: t?.onPropChanging || e.events?.onPropChanging ? (n, r, s) => {
|
|
114
113
|
let h = !0, f = t.onPropChanging;
|
|
@@ -118,19 +117,19 @@ function F(e, t) {
|
|
|
118
117
|
t.onPropChange?.(String(n), r), e.events.onPropChange?.(String(n), r);
|
|
119
118
|
} : void 0
|
|
120
119
|
};
|
|
121
|
-
function
|
|
122
|
-
const r = `${
|
|
120
|
+
function a(n) {
|
|
121
|
+
const r = `${j}${v(n)}`;
|
|
123
122
|
return t[r] || e.events[r];
|
|
124
123
|
}
|
|
125
|
-
function
|
|
126
|
-
const r = `${
|
|
124
|
+
function y(n) {
|
|
125
|
+
const r = `${I}${v(n)}`;
|
|
127
126
|
return ((s, h) => {
|
|
128
|
-
let f = !0,
|
|
129
|
-
return
|
|
127
|
+
let f = !0, d = t[r];
|
|
128
|
+
return d && (f = d(s, h)), f && (d = e.events[r], d && (f = d(s, h))), f;
|
|
130
129
|
});
|
|
131
130
|
}
|
|
132
|
-
function
|
|
133
|
-
const r = `${
|
|
131
|
+
function b(n) {
|
|
132
|
+
const r = `${L}${v(n)}`;
|
|
134
133
|
return ((s) => {
|
|
135
134
|
t[r]?.(s), e.events[r]?.(s);
|
|
136
135
|
});
|
|
@@ -138,46 +137,46 @@ function F(e, t) {
|
|
|
138
137
|
if (e.props)
|
|
139
138
|
for (const n of Object.keys(e.props))
|
|
140
139
|
C[n] = {
|
|
141
|
-
onGet:
|
|
142
|
-
onChanging:
|
|
143
|
-
onChange:
|
|
140
|
+
onGet: a(n),
|
|
141
|
+
onChanging: y(n),
|
|
142
|
+
onChange: b(n)
|
|
144
143
|
};
|
|
145
|
-
return
|
|
144
|
+
return c = P(c, g), c = N(c, u, C), e.events?.onInit && e.events.onInit(c), t?.onInit && t.onInit(c), c;
|
|
146
145
|
}
|
|
147
|
-
function
|
|
148
|
-
const o =
|
|
149
|
-
return
|
|
146
|
+
function z(e, t) {
|
|
147
|
+
const o = G(() => S(e, t)), i = o.current;
|
|
148
|
+
return k(() => {
|
|
150
149
|
try {
|
|
151
150
|
e.events?.onLayout?.(i), t?.onLayout?.(i);
|
|
152
|
-
} catch (
|
|
153
|
-
e.events?.onError?.(i,
|
|
151
|
+
} catch (l) {
|
|
152
|
+
e.events?.onError?.(i, l), t?.onError?.(i, l);
|
|
154
153
|
}
|
|
155
154
|
return () => {
|
|
156
155
|
e.events?.onLayoutDestroy?.(i), t?.onLayoutDestroy?.(i), o.current = null;
|
|
157
156
|
};
|
|
158
|
-
}, []),
|
|
157
|
+
}, []), B(() => {
|
|
159
158
|
try {
|
|
160
159
|
e.events?.onReady?.(i), t?.onReady?.(i);
|
|
161
|
-
} catch (
|
|
162
|
-
e.events?.onError?.(i,
|
|
160
|
+
} catch (l) {
|
|
161
|
+
e.events?.onError?.(i, l), t?.onError?.(i, l);
|
|
163
162
|
}
|
|
164
163
|
return () => {
|
|
165
164
|
e.events?.onDestroy?.(i), t?.onDestroy?.(i);
|
|
166
165
|
};
|
|
167
166
|
}, []), o.current;
|
|
168
167
|
}
|
|
169
|
-
function
|
|
168
|
+
function H(e) {
|
|
170
169
|
return (o) => {
|
|
171
170
|
const i = e(o);
|
|
172
|
-
return /* @__PURE__ */
|
|
171
|
+
return /* @__PURE__ */ React.createElement(i.View, { ...o });
|
|
173
172
|
};
|
|
174
173
|
}
|
|
175
174
|
export {
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
175
|
+
V as bind,
|
|
176
|
+
_ as bindProp,
|
|
177
|
+
H as getFC,
|
|
178
|
+
w as isBinding,
|
|
179
|
+
O as symbols,
|
|
180
|
+
z as useComponent
|
|
182
181
|
};
|
|
183
182
|
//# sourceMappingURL=componentModel.es.js.map
|