@actdim/dynstruct 1.1.5 → 1.1.7
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 +7 -6
- package/dist/appDomain/appContracts.d.ts.map +1 -1
- package/dist/appDomain/appContracts.es.js +8 -10
- 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 +48 -50
- package/dist/appDomain/security/securityProvider.es.js.map +1 -1
- package/dist/componentModel/DynamicContent.es.js +5 -5
- package/dist/componentModel/DynamicContent.es.js.map +1 -1
- package/dist/componentModel/adapters.d.ts +4 -3
- package/dist/componentModel/adapters.d.ts.map +1 -1
- package/dist/componentModel/adapters.es.js +10 -12
- package/dist/componentModel/adapters.es.js.map +1 -1
- package/dist/componentModel/componentContext.d.ts +2 -2
- package/dist/componentModel/componentContext.d.ts.map +1 -1
- package/dist/componentModel/componentContext.es.js +1 -1
- package/dist/componentModel/componentContext.es.js.map +1 -1
- package/dist/componentModel/contracts.d.ts +21 -21
- package/dist/componentModel/contracts.d.ts.map +1 -1
- package/dist/componentModel/contracts.es.js.map +1 -1
- package/dist/componentModel/core.d.ts.map +1 -1
- package/dist/componentModel/core.es.js +86 -86
- package/dist/componentModel/core.es.js.map +1 -1
- package/dist/componentModel/react.d.ts.map +1 -1
- package/dist/componentModel/react.es.js +130 -136
- package/dist/componentModel/react.es.js.map +1 -1
- package/dist/services/ServiceProvider.d.ts +6 -4
- package/dist/services/ServiceProvider.d.ts.map +1 -1
- package/dist/services/ServiceProvider.es.js +8 -13
- package/dist/services/ServiceProvider.es.js.map +1 -1
- package/dist/services/StorageService.d.ts +5 -14
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.es.js +37 -48
- package/dist/services/StorageService.es.js.map +1 -1
- package/dist/services/{NavService.d.ts → react/NavService.d.ts} +3 -3
- package/dist/services/react/NavService.d.ts.map +1 -0
- package/dist/services/{NavService.es.js → react/NavService.es.js} +2 -2
- package/dist/services/react/NavService.es.js.map +1 -0
- package/dist/services/react/ServiceProvider.d.ts +7 -0
- package/dist/services/react/ServiceProvider.d.ts.map +1 -0
- package/dist/services/react/ServiceProvider.es.js +24 -0
- package/dist/services/react/ServiceProvider.es.js.map +1 -0
- package/dist/services/react/StorageService.d.ts +16 -0
- package/dist/services/react/StorageService.d.ts.map +1 -0
- package/dist/services/react/StorageService.es.js +55 -0
- package/dist/services/react/StorageService.es.js.map +1 -0
- package/package.json +1 -1
- package/dist/services/NavService.d.ts.map +0 -1
- package/dist/services/NavService.es.js.map +0 -1
|
@@ -2,7 +2,8 @@ import { MsgStructBase, MsgStructFactory } from '@actdim/msgmesh/contracts';
|
|
|
2
2
|
import { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from './security/securityContracts';
|
|
3
3
|
import { ReactNode } from 'react';
|
|
4
4
|
import { KeysOf } from '@actdim/utico/typeCore';
|
|
5
|
-
import {
|
|
5
|
+
import { BaseContext } from '../componentModel/contracts';
|
|
6
|
+
import { StoreItem } from '@actdim/utico/store/storeContracts';
|
|
6
7
|
export declare const $NAV_GOTO = "APP-NAV-GOTO";
|
|
7
8
|
export declare const $NAV_GET_CONTEXT = "APP-NAV-GET-CONTEXT";
|
|
8
9
|
export declare const $NAV_CONTEXT_CHANGED = "APP-NAV-CONTEXT-CHANGED";
|
|
@@ -99,7 +100,7 @@ export type BaseAppMsgStruct<TNavRoutes extends NavRoutes = NavRoutes> = BaseApi
|
|
|
99
100
|
key: string;
|
|
100
101
|
useEncryption?: boolean;
|
|
101
102
|
};
|
|
102
|
-
out:
|
|
103
|
+
out: StoreItem;
|
|
103
104
|
};
|
|
104
105
|
[$KV_STORE_SET]: {
|
|
105
106
|
in: {
|
|
@@ -120,15 +121,15 @@ export type BaseApiConfig = {
|
|
|
120
121
|
url?: string;
|
|
121
122
|
versions?: string[];
|
|
122
123
|
};
|
|
123
|
-
export type BaseAppDomainConfig<TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig, TApiConfig extends BaseApiConfig = BaseApiConfig
|
|
124
|
+
export type BaseAppDomainConfig<TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig, TApiConfig extends BaseApiConfig = BaseApiConfig> = {
|
|
124
125
|
id: string;
|
|
125
126
|
name?: string;
|
|
126
127
|
baseUrl: string;
|
|
127
128
|
security: TSecurityDomainConfig;
|
|
128
|
-
|
|
129
|
+
defaultApi?: string;
|
|
130
|
+
apis: Record<string, TApiConfig>;
|
|
129
131
|
};
|
|
130
132
|
export type BaseAppMsgChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;
|
|
131
|
-
export type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> =
|
|
132
|
-
export declare const useBaseAppContext: <TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct>() => BaseAppContext<TMsgStruct>;
|
|
133
|
+
export type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = BaseContext<TMsgStruct> & {};
|
|
133
134
|
export {};
|
|
134
135
|
//# sourceMappingURL=appContracts.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC5E,OAAO,EAAE,wBAAwB,IAAI,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AACrI,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
const A = "APP-NAV-GOTO", O = "APP-NAV-GET-CONTEXT", P = "APP-NAV-CONTEXT-CHANGED", o = "APP-NAV-READ-HISTORY", t = "APP-NOTICE", N = "APP-CONFIG-GET", V = "APP-FETCH", n = "APP-KV-STORE-GET", C = "APP-KV-STORE-SET", s = "APP-KV-STORE-REMOVE", _ = () => E();
|
|
1
|
+
const E = "APP-NAV-GOTO", T = "APP-NAV-GET-CONTEXT", A = "APP-NAV-CONTEXT-CHANGED", O = "APP-NAV-READ-HISTORY", P = "APP-NOTICE", N = "APP-CONFIG-GET", V = "APP-FETCH", _ = "APP-KV-STORE-GET", C = "APP-KV-STORE-SET", G = "APP-KV-STORE-REMOVE";
|
|
3
2
|
export {
|
|
4
3
|
N as $CONFIG_GET,
|
|
5
4
|
V as $FETCH,
|
|
6
|
-
|
|
7
|
-
|
|
5
|
+
_ as $KV_STORE_GET,
|
|
6
|
+
G as $KV_STORE_REMOVE,
|
|
8
7
|
C as $KV_STORE_SET,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
_ as useBaseAppContext
|
|
8
|
+
A as $NAV_CONTEXT_CHANGED,
|
|
9
|
+
T as $NAV_GET_CONTEXT,
|
|
10
|
+
E as $NAV_GOTO,
|
|
11
|
+
O as $NAV_READ_HISTORY,
|
|
12
|
+
P as $NOTICE
|
|
15
13
|
};
|
|
16
14
|
//# sourceMappingURL=appContracts.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { MsgStructBase, MsgStructFactory } from \"@actdim/msgmesh/contracts\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\nimport { KeysOf } from \"@actdim/utico/typeCore\";\r\nimport { ComponentRegistryContext } from \"@/componentModel/contracts\";\r\nimport { useComponentContext } from \"@/componentModel/componentContext\";\r\n\r\nexport const $NAV_GOTO = \"APP-NAV-GOTO\";\r\nexport const $NAV_GET_CONTEXT = \"APP-NAV-GET-CONTEXT\";\r\nexport const $NAV_CONTEXT_CHANGED = \"APP-NAV-CONTEXT-CHANGED\";\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\ntype NavRouteStruct<TNavRoutes extends NavRoutes> = {\r\n [K in keyof TNavRoutes]: {\r\n route: K;\r\n params?: TNavRoutes[K][\"defaultParams\"];\r\n };\r\n}[keyof TNavRoutes];\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)ApiMsgStruct\r\nexport type BaseApiMsgStruct = BaseSecurityMsgStruct &\r\n MsgStructFactory<{\r\n // \"GET-VERSION\"?: {\r\n // in: any;\r\n // };\r\n }>;\r\n\r\n// BaseAppMsgStruct\r\nexport type BaseAppMsgStruct<TNavRoutes extends NavRoutes = NavRoutes> = BaseApiMsgStruct &\r\n MsgStructFactory<\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 ex: NavRouteStruct<TNavRoutes>;\r\n out: void;\r\n };\r\n [$NAV_GET_CONTEXT]: {\r\n in: void;\r\n out: NavContext;\r\n };\r\n [$NAV_CONTEXT_CHANGED]: {\r\n in: NavContext;\r\n out: void;\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:
|
|
1
|
+
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import { MsgStructBase, MsgStructFactory } from \"@actdim/msgmesh/contracts\";\r\nimport { BaseSecurityDomainConfig as BaseSecurityDomainConfig, BaseSecurityMsgStruct } from \"@/appDomain/security/securityContracts\";\r\nimport { ReactNode } from \"react\";\r\nimport { KeysOf } from \"@actdim/utico/typeCore\";\r\nimport { BaseContext, ComponentRegistryContext } from \"@/componentModel/contracts\";\r\nimport { useComponentContext } from \"@/componentModel/componentContext\"\r\nimport { StoreItem } from \"@actdim/utico/store/storeContracts\";\r\n\r\nexport const $NAV_GOTO = \"APP-NAV-GOTO\";\r\nexport const $NAV_GET_CONTEXT = \"APP-NAV-GET-CONTEXT\";\r\nexport const $NAV_CONTEXT_CHANGED = \"APP-NAV-CONTEXT-CHANGED\";\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\ntype NavRouteStruct<TNavRoutes extends NavRoutes> = {\r\n [K in keyof TNavRoutes]: {\r\n route: K;\r\n params?: TNavRoutes[K][\"defaultParams\"];\r\n };\r\n}[keyof TNavRoutes];\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)ApiMsgStruct\r\nexport type BaseApiMsgStruct = BaseSecurityMsgStruct &\r\n MsgStructFactory<{\r\n // \"GET-VERSION\"?: {\r\n // in: any;\r\n // };\r\n }>;\r\n\r\n// BaseAppMsgStruct\r\nexport type BaseAppMsgStruct<TNavRoutes extends NavRoutes = NavRoutes> = BaseApiMsgStruct &\r\n MsgStructFactory<\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 ex: NavRouteStruct<TNavRoutes>;\r\n out: void;\r\n };\r\n [$NAV_GET_CONTEXT]: {\r\n in: void;\r\n out: NavContext;\r\n };\r\n [$NAV_CONTEXT_CHANGED]: {\r\n in: NavContext;\r\n out: void;\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: StoreItem;\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 } & MsgStructBase\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 defaultApi?: string;\r\n apis: Record<string, TApiConfig>;\r\n // HATEOAS? (React Admin)\r\n};\r\n\r\nexport type BaseAppMsgChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;\r\n\r\nexport type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = BaseContext<TMsgStruct> & {\r\n // securityProvider: SecurityProvider;\r\n};"],"names":["$NAV_GOTO","$NAV_GET_CONTEXT","$NAV_CONTEXT_CHANGED","$NAV_READ_HISTORY","$NOTICE","$CONFIG_GET","$FETCH","$KV_STORE_GET","$KV_STORE_SET","$KV_STORE_REMOVE"],"mappings":"AAQO,MAAMA,IAAY,gBACZC,IAAmB,uBACnBC,IAAuB,2BACvBC,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,2BAA2B,CAAC;AACnD,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;
|
|
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,2BAA2B,CAAC;AACnD,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;IA+CtB,IAAW,MAAM,IAAI,MAAM,CAE1B;IAaK,mBAAmB;IA+BnB,gBAAgB;IA0BhB,WAAW,CAAC,WAAW,EAAE,eAAe;IA0CxC,aAAa;IA+Bb,YAAY;IAgCZ,YAAY;IA6CZ,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC;IASnC,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,cAAmB;CAOlF"}
|
|
@@ -27,28 +27,28 @@ class E {
|
|
|
27
27
|
acl;
|
|
28
28
|
fetcher = window;
|
|
29
29
|
init;
|
|
30
|
-
constructor(
|
|
31
|
-
this.msgBus =
|
|
30
|
+
constructor(s) {
|
|
31
|
+
this.msgBus = s, this.init = this.updateConfigAsync(), this.msgBus.provide({
|
|
32
32
|
channel: "APP-SECURITY-GET-CONTEXT",
|
|
33
|
-
callback: (
|
|
33
|
+
callback: (e) => this.getContext()
|
|
34
34
|
}), this.msgBus.provide({
|
|
35
35
|
channel: "APP-SECURITY-GET-ACL",
|
|
36
|
-
callback: (
|
|
36
|
+
callback: (e) => this.getAcl(e.payload)
|
|
37
37
|
}), this.msgBus.provide({
|
|
38
38
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
39
|
-
callback: (
|
|
39
|
+
callback: (e) => this.signInAsync(e.payload)
|
|
40
40
|
}), this.msgBus.provide({
|
|
41
41
|
channel: "APP-SECURITY-AUTH-SIGNOUT",
|
|
42
|
-
callback: (
|
|
42
|
+
callback: (e) => this.signOutAsync()
|
|
43
43
|
}), this.msgBus.provide({
|
|
44
44
|
channel: "APP-SECURITY-AUTH-REFRESH",
|
|
45
|
-
callback: (
|
|
45
|
+
callback: (e) => this.refreshAsync()
|
|
46
46
|
}), this.msgBus.provide({
|
|
47
47
|
channel: "APP-SECURITY-REQUEST-AUTH",
|
|
48
|
-
callback: (
|
|
48
|
+
callback: (e) => this.requestAuthorize()
|
|
49
49
|
}), this.msgBus.provide({
|
|
50
50
|
channel: "APP-SECURITY-GET-CONFIG",
|
|
51
|
-
callback: async (
|
|
51
|
+
callback: async (e) => (await this.msgBus.request({
|
|
52
52
|
channel: "APP-CONFIG-GET"
|
|
53
53
|
})).payload?.security
|
|
54
54
|
});
|
|
@@ -64,12 +64,12 @@ class E {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
async updateConfigAsync() {
|
|
67
|
-
const
|
|
67
|
+
const s = await this.msgBus.request({
|
|
68
68
|
channel: "APP-CONFIG-GET"
|
|
69
69
|
});
|
|
70
|
-
this.domainConfig =
|
|
71
|
-
const
|
|
72
|
-
this.storageKeys =
|
|
70
|
+
this.domainConfig = s.payload.security;
|
|
71
|
+
const e = l(`${this.domainConfig.id}/`);
|
|
72
|
+
this.storageKeys = e(u), await this.restoreDataAsync();
|
|
73
73
|
}
|
|
74
74
|
async restoreDataAsync() {
|
|
75
75
|
this.accessToken = (await this.msgBus.request({
|
|
@@ -77,27 +77,25 @@ class E {
|
|
|
77
77
|
payload: {
|
|
78
78
|
key: this.storageKeys.accessToken
|
|
79
79
|
}
|
|
80
|
-
})).payload, this.refreshToken = (await this.msgBus.request({
|
|
80
|
+
})).payload.data.value, this.refreshToken = (await this.msgBus.request({
|
|
81
81
|
channel: "APP-KV-STORE-GET",
|
|
82
82
|
payload: {
|
|
83
83
|
key: this.storageKeys.refreshToken
|
|
84
84
|
}
|
|
85
|
-
})).payload
|
|
86
|
-
let e = (await this.msgBus.request({
|
|
85
|
+
})).payload.data.value, this.userCredentials = (await this.msgBus.request({
|
|
87
86
|
channel: "APP-KV-STORE-GET",
|
|
88
87
|
payload: {
|
|
89
88
|
key: this.storageKeys.userCredentials
|
|
90
89
|
}
|
|
91
|
-
})).payload
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}, e = (await this.msgBus.request({
|
|
90
|
+
})).payload.data.value || {
|
|
91
|
+
username: null,
|
|
92
|
+
password: null
|
|
93
|
+
}, this.acl = (await this.msgBus.request({
|
|
96
94
|
channel: "APP-KV-STORE-GET",
|
|
97
95
|
payload: {
|
|
98
96
|
key: this.storageKeys.acl
|
|
99
97
|
}
|
|
100
|
-
})).payload
|
|
98
|
+
})).payload.data.value || null, this.accessToken && this.msgBus.request({
|
|
101
99
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
102
100
|
group: "out",
|
|
103
101
|
payload: this.getContext()
|
|
@@ -141,10 +139,10 @@ class E {
|
|
|
141
139
|
}
|
|
142
140
|
async requestAuthorize() {
|
|
143
141
|
this.accessToken = null, this.acl = null;
|
|
144
|
-
const
|
|
142
|
+
const s = this.msgBus.once({
|
|
145
143
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
146
144
|
group: "out"
|
|
147
|
-
}),
|
|
145
|
+
}), e = async () => {
|
|
148
146
|
throw await this.msgBus.once({
|
|
149
147
|
channel: "APP-SECURITY-AUTH-SIGNOUT",
|
|
150
148
|
group: "out"
|
|
@@ -155,13 +153,13 @@ class E {
|
|
|
155
153
|
payload: {
|
|
156
154
|
callbackUrl: window.location.pathname + window.location.search
|
|
157
155
|
}
|
|
158
|
-
}), await Promise.race([
|
|
156
|
+
}), await Promise.race([s, e]);
|
|
159
157
|
}
|
|
160
|
-
async signInAsync(
|
|
161
|
-
let
|
|
162
|
-
|
|
163
|
-
const n = JSON.stringify(
|
|
164
|
-
url:
|
|
158
|
+
async signInAsync(s) {
|
|
159
|
+
let e = this.domainConfig.routes?.authSignIn;
|
|
160
|
+
e = e.replace(/[?&]$/, "");
|
|
161
|
+
const n = JSON.stringify(s), t = {
|
|
162
|
+
url: e,
|
|
165
163
|
body: n,
|
|
166
164
|
method: "POST",
|
|
167
165
|
headers: {
|
|
@@ -171,10 +169,10 @@ class E {
|
|
|
171
169
|
}, r = {
|
|
172
170
|
...t,
|
|
173
171
|
status: "executing"
|
|
174
|
-
}, a = await this.fetcher.fetch(
|
|
172
|
+
}, a = await this.fetcher.fetch(e, t);
|
|
175
173
|
await i(a, r), o.assert(a, r);
|
|
176
174
|
let c = a.resolved.json;
|
|
177
|
-
return this.userCredentials =
|
|
175
|
+
return this.userCredentials = s, this.accessToken = c.accessToken, this.refreshToken = c.refreshToken, this.saveDataAsync(), this.getContext();
|
|
178
176
|
}
|
|
179
177
|
async saveDataAsync() {
|
|
180
178
|
await this.msgBus.request({
|
|
@@ -193,40 +191,40 @@ class E {
|
|
|
193
191
|
channel: "APP-KV-STORE-SET",
|
|
194
192
|
payload: {
|
|
195
193
|
key: this.storageKeys.userCredentials,
|
|
196
|
-
value: this.userCredentials ?
|
|
194
|
+
value: this.userCredentials ? this.userCredentials : null
|
|
197
195
|
}
|
|
198
196
|
}), await this.msgBus.request({
|
|
199
197
|
channel: "APP-KV-STORE-SET",
|
|
200
198
|
payload: {
|
|
201
199
|
key: this.storageKeys.acl,
|
|
202
|
-
value: this.acl ?
|
|
200
|
+
value: this.acl ? this.acl : null
|
|
203
201
|
}
|
|
204
202
|
});
|
|
205
203
|
}
|
|
206
204
|
async signOutAsync() {
|
|
207
|
-
let
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
url:
|
|
205
|
+
let s = this.domainConfig.routes?.authSignOut;
|
|
206
|
+
s && (s = s.replace(/[?&]$/, ""));
|
|
207
|
+
const e = {
|
|
208
|
+
url: s,
|
|
211
209
|
method: "POST",
|
|
212
210
|
headers: {
|
|
213
211
|
"Content-Type": "application/json",
|
|
214
212
|
Accept: "text/plain"
|
|
215
213
|
}
|
|
216
214
|
}, n = {
|
|
217
|
-
...
|
|
215
|
+
...e,
|
|
218
216
|
status: "executing"
|
|
219
|
-
}, t = await this.fetcher.fetch(
|
|
217
|
+
}, t = await this.fetcher.fetch(s, e);
|
|
220
218
|
await i(t, n), o.assert(t, n), this.clearSavedDataAsync();
|
|
221
219
|
}
|
|
222
220
|
async refreshAsync() {
|
|
223
|
-
let
|
|
224
|
-
|
|
225
|
-
let
|
|
221
|
+
let s = this.domainConfig.routes?.authRefresh;
|
|
222
|
+
s && (s = s.replace(/[?&]$/, ""));
|
|
223
|
+
let e = {
|
|
226
224
|
refreshToken: this.refreshToken
|
|
227
225
|
};
|
|
228
|
-
const n = JSON.stringify(
|
|
229
|
-
url:
|
|
226
|
+
const n = JSON.stringify(e), t = {
|
|
227
|
+
url: s,
|
|
230
228
|
body: n,
|
|
231
229
|
method: "POST",
|
|
232
230
|
// useAuth: true,
|
|
@@ -237,17 +235,17 @@ class E {
|
|
|
237
235
|
}, r = {
|
|
238
236
|
...t,
|
|
239
237
|
status: "executing"
|
|
240
|
-
}, a = await this.fetcher.fetch(
|
|
241
|
-
return await i(a, r), o.assert(a, r),
|
|
238
|
+
}, a = await this.fetcher.fetch(s, t);
|
|
239
|
+
return await i(a, r), o.assert(a, r), e = a.resolved.json, this.accessToken = e.accessToken, this.refreshToken = e.refreshToken, this.saveDataAsync(), this.getContext();
|
|
242
240
|
}
|
|
243
|
-
async getAcl(
|
|
241
|
+
async getAcl(s) {
|
|
244
242
|
return {
|
|
245
243
|
[h.Full]: ""
|
|
246
244
|
};
|
|
247
245
|
}
|
|
248
246
|
// authorize
|
|
249
|
-
async verifyAccess(
|
|
250
|
-
return this.getAcl(
|
|
247
|
+
async verifyAccess(s, e = h.Full) {
|
|
248
|
+
return this.getAcl(s), !1;
|
|
251
249
|
}
|
|
252
250
|
}
|
|
253
251
|
export {
|
|
@@ -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/contracts\";\r\nimport { BaseAppMsgStruct } 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<BaseAppMsgStruct>;\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<BaseAppMsgStruct>) {\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.request({\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.request({\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.request({\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.request({\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.request({\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.request({\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.request({\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.request({\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.request({\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.request({\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.request({\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.once({\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.once({\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.send({\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.request({\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.request({\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.request({\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.request({\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/contracts\";\r\nimport { BaseAppMsgStruct } 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<BaseAppMsgStruct>;\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<BaseAppMsgStruct>) {\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.request({\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.request({\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.request({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n })\r\n ).payload.data.value;\r\n this.refreshToken = (\r\n await this.msgBus.request({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n })\r\n ).payload.data.value;\r\n this.userCredentials = (\r\n await this.msgBus.request({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n })\r\n ).payload.data.value || {\r\n username: null,\r\n password: null\r\n }; \r\n\r\n this.acl = (\r\n await this.msgBus.request({\r\n channel: \"APP-KV-STORE-GET\",\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n ).payload.data.value || null;\r\n\r\n if (this.accessToken) {\r\n this.msgBus.request({\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.request({\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.request({\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.request({\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.request({\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.once({\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.once({\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.send({\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.request({\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.request({\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.request({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.userCredentials,\r\n value: this.userCredentials ? this.userCredentials : null\r\n }\r\n });\r\n await this.msgBus.request({\r\n channel: \"APP-KV-STORE-SET\",\r\n payload: {\r\n key: this.storageKeys.acl,\r\n value: this.acl ? this.acl : null\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 // const content = 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","signIn","signOut","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","obj","AccessLevel","accessLevel"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { useComponent as
|
|
2
|
-
function
|
|
1
|
+
import { useComponent as r } from "./react.es.js";
|
|
2
|
+
function c(o) {
|
|
3
3
|
let e, n;
|
|
4
|
-
return e =
|
|
4
|
+
return e = r({
|
|
5
5
|
props: {
|
|
6
6
|
render: void 0,
|
|
7
7
|
data: void 0
|
|
8
8
|
},
|
|
9
|
-
view: (
|
|
9
|
+
view: (d, i) => n.render()
|
|
10
10
|
}, o), n = e.model, e;
|
|
11
11
|
}
|
|
12
12
|
export {
|
|
13
|
-
|
|
13
|
+
c as useDynamicContent
|
|
14
14
|
};
|
|
15
15
|
//# sourceMappingURL=DynamicContent.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicContent.es.js","sources":["../../src/componentModel/DynamicContent.tsx"],"sourcesContent":["import type {\n Component,\n ComponentDef,\n ComponentModel,\n ComponentParams,\n ComponentStruct,\n} from '@/componentModel/contracts';\nimport React from 'react';\nimport { MsgStruct } from '@actdim/msgmesh/contracts';\nimport { useComponent } from './react';\n\nexport type DynamicContentStruct<\n TData = any,\n TMsgStruct extends MsgStruct = MsgStruct,\n> = ComponentStruct<\n TMsgStruct,\n {\n props: {\n data: TData;\n render: () => React.ReactNode;\n };\n }\n>;\n\nexport function useDynamicContent<TData = any>(\n params: ComponentParams<DynamicContentStruct<TData>>,\n) {\n let c: Component<DynamicContentStruct<TData>>;\n let m: ComponentModel<DynamicContentStruct<TData>>;\n const
|
|
1
|
+
{"version":3,"file":"DynamicContent.es.js","sources":["../../src/componentModel/DynamicContent.tsx"],"sourcesContent":["import type {\n Component,\n ComponentDef,\n ComponentModel,\n ComponentParams,\n ComponentStruct,\n} from '@/componentModel/contracts';\nimport React from 'react';\nimport { MsgStruct } from '@actdim/msgmesh/contracts';\nimport { useComponent } from './react';\n\nexport type DynamicContentStruct<\n TData = any,\n TMsgStruct extends MsgStruct = MsgStruct,\n> = ComponentStruct<\n TMsgStruct,\n {\n props: {\n data: TData;\n render: () => React.ReactNode;\n };\n }\n>;\n\nexport function useDynamicContent<TData = any>(\n params: ComponentParams<DynamicContentStruct<TData>>,\n) {\n let c: Component<DynamicContentStruct<TData>>;\n let m: ComponentModel<DynamicContentStruct<TData>>;\n const def: ComponentDef<DynamicContentStruct<TData>> = {\n props: {\n render: undefined,\n data: undefined,\n },\n view: (_, c) => {\n return m.render();\n },\n };\n\n c = useComponent(def, params);\n m = c.model;\n return c;\n}\n"],"names":["useDynamicContent","params","c","m","useComponent","_"],"mappings":";AAwBO,SAASA,EACZC,GACF;AACE,MAAIC,GACAC;AAWJ,SAAAD,IAAIE,EAVmD;AAAA,IACnD,OAAO;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAEV,MAAM,CAACC,GAAGH,MACCC,EAAE,OAAA;AAAA,EACb,GAGkBF,CAAM,GAC5BE,IAAID,EAAE,OACCA;AACX;"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import { MsgBus,
|
|
1
|
+
import { MsgBus, MsgStructFactory } from '@actdim/msgmesh/contracts';
|
|
2
2
|
import { AddPrefix, Filter, Func, RemoveSuffix, Skip, ToUpper } from '@actdim/utico/typeCore';
|
|
3
3
|
export type MsgProviderAdapter = {
|
|
4
4
|
service: any;
|
|
5
5
|
channelSelector: (service: any, methodName: string) => string;
|
|
6
6
|
};
|
|
7
|
-
export declare function registerAdapters
|
|
7
|
+
export declare function registerAdapters(msgBus: MsgBus<any>, adapters: MsgProviderAdapter[], abortSignal?: AbortSignal): void;
|
|
8
8
|
export type BaseServiceSuffix = 'CLIENT' | 'API' | 'SERVICE' | 'FETCHER' | 'CONTROLLER' | 'LOADER' | 'REPOSITORY' | 'PROVIDER';
|
|
9
|
-
export type
|
|
9
|
+
export type BaseWordSeparator = "-";
|
|
10
|
+
export type ToMsgChannelPrefix<TServiceName extends string, Prefix extends string, Suffix extends string = BaseServiceSuffix, WordSeparator extends string = BaseWordSeparator> = `${Prefix}${WordSeparator}${RemoveSuffix<Uppercase<TServiceName>, Suffix>}${WordSeparator}`;
|
|
10
11
|
type ToMsgStructSource<TService, TPrefix extends string, TSkip extends keyof TService = never> = Filter<ToUpper<AddPrefix<Skip<TService, TSkip>, TPrefix>>, Func>;
|
|
11
12
|
export type ToMsgStruct<TService, TPrefix extends string, TSkip extends keyof TService = never, TMsgStructSource = ToMsgStructSource<TService, TPrefix, TSkip>> = MsgStructFactory<{
|
|
12
13
|
[K in keyof TMsgStructSource as TMsgStructSource[K] extends Func ? (Uppercase<K extends string ? K : never>) : never]: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/componentModel/adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/componentModel/adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAY9F,MAAM,MAAM,kBAAkB,GAAG;IAC7B,OAAO,EAAE,GAAG,CAAC;IAEb,eAAe,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,KAAK,MAAM,CAAC;CACjE,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,QAwB9G;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAC/H,MAAM,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAIpC,MAAM,MAAM,kBAAkB,CAC1B,YAAY,SAAS,MAAM,EAC3B,MAAM,SAAS,MAAM,EACrB,MAAM,SAAS,MAAM,GAAG,iBAAiB,EACzC,aAAa,SAAS,MAAM,GAAG,iBAAiB,IAChD,GAAG,MAAM,GAAG,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,aAAa,EAAE,CAAC;AAEhG,KAAK,iBAAiB,CAAC,QAAQ,EAAE,OAAO,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,QAAQ,GAAG,KAAK,IAAI,MAAM,CACnG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC,EAClD,IAAI,CACP,CAAC;AAEF,MAAM,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,SAAS,MAAM,EAAE,KAAK,SAAS,MAAM,QAAQ,GAAG,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,gBAAgB,CAAC;KAC9K,CAAC,IAAI,MAAM,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG;QACnH,EAAE,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;QAC/E,GAAG,EAAE,gBAAgB,CAAC,CAAC,CAAC,SAAS,IAAI,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC;KACnF;CACJ,CAAC,CAAC;AAEH,wBAAgB,qBAAqB,CAAC,QAAQ,SAAS,MAAM,EACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,GAAG,CAAC,IAEvB,SAAS,GAAG,EAAE,YAAY,MAAM,YAO3C"}
|
|
@@ -1,20 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
const f = (t) => Object.getOwnPropertyNames(t).filter(
|
|
1
|
+
const s = (t) => Object.getOwnPropertyNames(t).filter(
|
|
3
2
|
(e) => e !== "constructor" && typeof t[e] == "function"
|
|
4
3
|
);
|
|
5
|
-
|
|
6
|
-
function u(t, e, n) {
|
|
4
|
+
function l(t, e, n) {
|
|
7
5
|
if (e)
|
|
8
6
|
for (const o of e) {
|
|
9
7
|
const { service: r, channelSelector: c } = o;
|
|
10
8
|
if (!r || !c)
|
|
11
9
|
throw new Error("Service and channelSelector are required for an adapter");
|
|
12
|
-
for (const a of
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
channel:
|
|
10
|
+
for (const a of s(Object.getPrototypeOf(r))) {
|
|
11
|
+
const f = c?.(r, a);
|
|
12
|
+
f && t.provide({
|
|
13
|
+
channel: f,
|
|
16
14
|
topic: "/.*/",
|
|
17
|
-
callback: (
|
|
15
|
+
callback: (i) => r[a](...i.payload || []),
|
|
18
16
|
options: {
|
|
19
17
|
abortSignal: n
|
|
20
18
|
}
|
|
@@ -22,14 +20,14 @@ function u(t, e, n) {
|
|
|
22
20
|
}
|
|
23
21
|
}
|
|
24
22
|
}
|
|
25
|
-
function
|
|
23
|
+
function p(t) {
|
|
26
24
|
return (e, n) => {
|
|
27
25
|
const o = Object.entries(t).find((r) => r[1] === e);
|
|
28
26
|
return o ? `${o[0]}${n.toUpperCase()}` : null;
|
|
29
27
|
};
|
|
30
28
|
}
|
|
31
29
|
export {
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
p as getMsgChannelSelector,
|
|
31
|
+
l as registerAdapters
|
|
34
32
|
};
|
|
35
33
|
//# sourceMappingURL=adapters.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.es.js","sources":["../../src/componentModel/adapters.ts"],"sourcesContent":["import { ClientBase } from \"@/net/client\";\r\nimport { MsgBus,
|
|
1
|
+
{"version":3,"file":"adapters.es.js","sources":["../../src/componentModel/adapters.ts"],"sourcesContent":["import { ClientBase } from \"@/net/client\";\r\nimport { MsgBus, MsgStructFactory } from \"@actdim/msgmesh/contracts\";\r\nimport { AddPrefix, Filter, Func, RemoveSuffix, Skip, ToUpper } from \"@actdim/utico/typeCore\";\r\n\r\nconst getMethodNames = (client: any) => {\r\n // return new Set(...)\r\n return Object.getOwnPropertyNames(client).filter(\r\n (name) => name !== 'constructor' && typeof client[name] === 'function',\r\n );\r\n};\r\n\r\n// const baseMethodNames = getMethodNames(ClientBase.prototype);\r\n\r\n// ServiceMsgDispatcher\r\nexport type MsgProviderAdapter = {\r\n service: any;\r\n // channelResolver/channelMapper\r\n channelSelector: (service: any, methodName: string) => string;\r\n};\r\n\r\nexport function registerAdapters(msgBus: MsgBus<any>, adapters: MsgProviderAdapter[], abortSignal?: AbortSignal) {\r\n if (adapters) {\r\n for (const adapter of adapters) {\r\n const { service, channelSelector } = adapter;\r\n if (!service || !channelSelector) {\r\n throw new Error(\"Service and channelSelector are required for an adapter\")\r\n }\r\n for (const methodName of getMethodNames(Object.getPrototypeOf(service))) {\r\n const channel = channelSelector?.(service, methodName);\r\n if (channel) {\r\n msgBus.provide({\r\n channel: channel,\r\n topic: '/.*/',\r\n callback: (msg) => {\r\n return (service[methodName] as Func)(...((msg.payload || []) as any[]));\r\n },\r\n options: {\r\n abortSignal: abortSignal\r\n }\r\n });\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nexport type BaseServiceSuffix = 'CLIENT' | 'API' | 'SERVICE' | 'FETCHER' | 'CONTROLLER' | 'LOADER' | 'REPOSITORY' | 'PROVIDER';\r\nexport type BaseWordSeparator = \"-\"; // \".\"\r\n\r\n// const suffixes = ['CLIENT', 'API', 'SERVICE'] satisfies Uppercase<BaseServiceSuffix>[];\r\n// runtime version: `${prefix}${removeSuffix(serviceName.toUpperCase(), suffixes)}_`\r\nexport type ToMsgChannelPrefix<\r\n TServiceName extends string,\r\n Prefix extends string,\r\n Suffix extends string = BaseServiceSuffix,\r\n WordSeparator extends string = BaseWordSeparator\r\n> = `${Prefix}${WordSeparator}${RemoveSuffix<Uppercase<TServiceName>, Suffix>}${WordSeparator}`;\r\n\r\ntype ToMsgStructSource<TService, TPrefix extends string, TSkip extends keyof TService = never> = Filter<\r\n ToUpper<AddPrefix<Skip<TService, TSkip>, TPrefix>>,\r\n Func\r\n>;\r\n\r\nexport type ToMsgStruct<TService, TPrefix extends string, TSkip extends keyof TService = never, TMsgStructSource = ToMsgStructSource<TService, TPrefix, TSkip>> = MsgStructFactory<{\r\n [K in keyof TMsgStructSource as TMsgStructSource[K] extends Func ? (Uppercase<K extends string ? K : never>) : never]: {\r\n in: TMsgStructSource[K] extends Func ? Parameters<TMsgStructSource[K]> : never;\r\n out: TMsgStructSource[K] extends Func ? ReturnType<TMsgStructSource[K]> : never;\r\n };\r\n}>;\r\n\r\nexport function getMsgChannelSelector<TTPrefix extends string>(\r\n services: Record<TTPrefix, any>,\r\n) {\r\n return (service: any, methodName: string) => {\r\n const entry = Object.entries(services).find((entry) => entry[1] === service);\r\n if (!entry) {\r\n return null;\r\n }\r\n return `${entry[0]}${methodName.toUpperCase()}`;\r\n };\r\n}"],"names":["getMethodNames","client","name","registerAdapters","msgBus","adapters","abortSignal","adapter","service","channelSelector","methodName","channel","msg","getMsgChannelSelector","services","entry"],"mappings":"AAIA,MAAMA,IAAiB,CAACC,MAEb,OAAO,oBAAoBA,CAAM,EAAE;AAAA,EACtC,CAACC,MAASA,MAAS,iBAAiB,OAAOD,EAAOC,CAAI,KAAM;AAAA;AAa7D,SAASC,EAAiBC,GAAqBC,GAAgCC,GAA2B;AAC7G,MAAID;AACA,eAAWE,KAAWF,GAAU;AAC5B,YAAM,EAAE,SAAAG,GAAS,iBAAAC,EAAA,IAAoBF;AACrC,UAAI,CAACC,KAAW,CAACC;AACb,cAAM,IAAI,MAAM,yDAAyD;AAE7E,iBAAWC,KAAcV,EAAe,OAAO,eAAeQ,CAAO,CAAC,GAAG;AACrE,cAAMG,IAAUF,IAAkBD,GAASE,CAAU;AACrD,QAAIC,KACAP,EAAO,QAAQ;AAAA,UACX,SAAAO;AAAA,UACA,OAAO;AAAA,UACP,UAAU,CAACC,MACCJ,EAAQE,CAAU,EAAW,GAAKE,EAAI,WAAW,CAAA,CAAa;AAAA,UAE1E,SAAS;AAAA,YACL,aAAAN;AAAA,UAAA;AAAA,QACJ,CACH;AAAA,MAET;AAAA,IACJ;AAER;AA0BO,SAASO,EACZC,GACF;AACE,SAAO,CAACN,GAAcE,MAAuB;AACzC,UAAMK,IAAQ,OAAO,QAAQD,CAAQ,EAAE,KAAK,CAACC,MAAUA,EAAM,CAAC,MAAMP,CAAO;AAC3E,WAAKO,IAGE,GAAGA,EAAM,CAAC,CAAC,GAAGL,EAAW,aAAa,KAFlC;AAAA,EAGf;AACJ;"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PropsWithChildren } from 'react';
|
|
2
|
-
import {
|
|
2
|
+
import { BaseContext } from './contracts';
|
|
3
3
|
export declare const ReactComponentContext: any;
|
|
4
4
|
export declare function ComponentContextProvider(props: PropsWithChildren<{
|
|
5
|
-
value?:
|
|
5
|
+
value?: BaseContext;
|
|
6
6
|
}>): any;
|
|
7
7
|
export declare function useComponentContext(): any;
|
|
8
8
|
//# sourceMappingURL=componentContext.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"componentContext.d.ts","sourceRoot":"","sources":["../../src/componentModel/componentContext.tsx"],"names":[],"mappings":"AAIA,OAAc,EAAiB,iBAAiB,EAAsB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"componentContext.d.ts","sourceRoot":"","sources":["../../src/componentModel/componentContext.tsx"],"names":[],"mappings":"AAIA,OAAc,EAAiB,iBAAiB,EAAsB,MAAM,OAAO,CAAC;AACpF,OAAO,EAAE,WAAW,EAA+C,MAAM,aAAa,CAAC;AAGvF,eAAO,MAAM,qBAAqB,KAAqD,CAAC;AAGxF,wBAAgB,wBAAwB,CACpC,KAAK,EAAE,iBAAiB,CAAC;IACrB,KAAK,CAAC,EAAE,WAAW,CAAC;CACvB,CAAC,OA2LL;AAGD,wBAAgB,mBAAmB,QASlC"}
|