@actdim/dynstruct 1.1.1 → 1.1.3
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 +3 -3
- package/dist/appDomain/appContracts.d.ts.map +1 -1
- package/dist/appDomain/appContracts.es.js.map +1 -1
- package/dist/appDomain/security/securityContracts.d.ts +1 -1
- package/dist/appDomain/security/securityContracts.d.ts.map +1 -1
- package/dist/appDomain/security/securityContracts.es.js.map +1 -1
- package/dist/appDomain/security/securityProvider.d.ts +1 -1
- package/dist/appDomain/security/securityProvider.d.ts.map +1 -1
- package/dist/appDomain/security/securityProvider.es.js +62 -62
- package/dist/appDomain/security/securityProvider.es.js.map +1 -1
- package/dist/componentModel/DynamicContent.d.ts +2 -2
- package/dist/componentModel/DynamicContent.d.ts.map +1 -1
- package/dist/componentModel/DynamicContent.es.js +1 -1
- package/dist/componentModel/DynamicContent.es.js.map +1 -1
- package/dist/componentModel/adapters.d.ts +13 -7
- package/dist/componentModel/adapters.d.ts.map +1 -1
- package/dist/componentModel/adapters.es.js +22 -17
- package/dist/componentModel/adapters.es.js.map +1 -1
- package/dist/componentModel/componentContext.d.ts.map +1 -1
- package/dist/componentModel/componentContext.es.js +58 -56
- package/dist/componentModel/componentContext.es.js.map +1 -1
- package/dist/componentModel/contracts.d.ts +173 -4
- package/dist/componentModel/contracts.d.ts.map +1 -1
- package/dist/componentModel/contracts.es.js +11 -1
- package/dist/componentModel/contracts.es.js.map +1 -1
- package/dist/componentModel/core.d.ts +17 -0
- package/dist/componentModel/core.d.ts.map +1 -0
- package/dist/componentModel/core.es.js +162 -0
- package/dist/componentModel/core.es.js.map +1 -0
- package/dist/componentModel/react.d.ts +5 -0
- package/dist/componentModel/react.d.ts.map +1 -0
- package/dist/componentModel/react.es.js +201 -0
- package/dist/componentModel/react.es.js.map +1 -0
- package/dist/net/client.d.ts +2 -1
- package/dist/net/client.d.ts.map +1 -1
- package/dist/net/client.es.js +46 -45
- package/dist/net/client.es.js.map +1 -1
- package/dist/services/NavService.d.ts +1 -1
- package/dist/services/NavService.d.ts.map +1 -1
- package/dist/services/NavService.es.js +9 -9
- package/dist/services/NavService.es.js.map +1 -1
- package/dist/services/StorageService.d.ts +4 -3
- package/dist/services/StorageService.d.ts.map +1 -1
- package/dist/services/StorageService.es.js +15 -15
- package/dist/services/StorageService.es.js.map +1 -1
- package/package.json +8 -7
- package/dist/componentModel/componentModel.d.ts +0 -165
- package/dist/componentModel/componentModel.d.ts.map +0 -1
- package/dist/componentModel/componentModel.es.js +0 -343
- package/dist/componentModel/componentModel.es.js.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { MsgStructBase, MsgStructFactory } from '@actdim/msgmesh/
|
|
1
|
+
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';
|
|
@@ -120,12 +120,12 @@ export type BaseApiConfig = {
|
|
|
120
120
|
url?: string;
|
|
121
121
|
versions?: string[];
|
|
122
122
|
};
|
|
123
|
-
export type BaseAppDomainConfig<TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig, TApiConfig extends BaseApiConfig = BaseApiConfig> = {
|
|
123
|
+
export type BaseAppDomainConfig<TSecurityDomainConfig extends BaseSecurityDomainConfig = BaseSecurityDomainConfig, TApiConfig extends BaseApiConfig = BaseApiConfig, TApiName extends PropertyKey = string> = {
|
|
124
124
|
id: string;
|
|
125
125
|
name?: string;
|
|
126
126
|
baseUrl: string;
|
|
127
127
|
security: TSecurityDomainConfig;
|
|
128
|
-
apis: Record<
|
|
128
|
+
apis: Record<TApiName, TApiConfig>;
|
|
129
129
|
};
|
|
130
130
|
export type BaseAppMsgChannels<TChannel extends keyof BaseAppMsgStruct | Array<keyof BaseAppMsgStruct>> = KeysOf<BaseAppMsgStruct, TChannel>;
|
|
131
131
|
export type BaseAppContext<TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct> = ComponentRegistryContext<TMsgStruct> & {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"appContracts.d.ts","sourceRoot":"","sources":["../../src/appDomain/appContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"appContracts.es.js","sources":["../../src/appDomain/appContracts.ts"],"sourcesContent":["import {
|
|
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: 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 } & 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 TApiName extends PropertyKey = string\r\n// TApiName extends keyof any = string\r\n> = {\r\n id: string;\r\n name?: string;\r\n baseUrl: string;\r\n security: TSecurityDomainConfig;\r\n apis: Record<TApiName, 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> = ComponentRegistryContext<TMsgStruct> & {\r\n // securityProvider: SecurityProvider;\r\n};\r\n\r\nexport const useBaseAppContext = <TMsgStruct extends BaseAppMsgStruct = BaseAppMsgStruct>() => useComponentContext() as BaseAppContext<TMsgStruct>;"],"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","useBaseAppContext","useComponentContext"],"mappings":";AAOO,MAAMA,IAAY,gBACZC,IAAmB,uBACnBC,IAAuB,2BACvBC,IAAoB,wBAEpBC,IAAU,cACVC,IAAc,kBAEdC,IAAS,aAETC,IAAgB,oBAChBC,IAAgB,oBAChBC,IAAmB,uBAuMnBC,IAAoB,MAA8DC,EAAA;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityContracts.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityContracts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,SAAS,EAAE,aAAa,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"securityContracts.d.ts","sourceRoot":"","sources":["../../../src/appDomain/security/securityContracts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityContracts.es.js","sources":["../../../src/appDomain/security/securityContracts.ts"],"sourcesContent":["import { MsgBus, MsgStruct, MsgStructBase } from \"@actdim/msgmesh/
|
|
1
|
+
{"version":3,"file":"securityContracts.es.js","sources":["../../../src/appDomain/security/securityContracts.ts"],"sourcesContent":["import { MsgBus, MsgStruct, MsgStructBase } from \"@actdim/msgmesh/contracts\";\r\nimport { RequireExtends, Skip } from \"@actdim/utico/typeCore\";\r\n// abstract\r\nexport enum AccessLevel {\r\n None = 0,\r\n Inherited = 1 << 0, // Unset\r\n NoRender = 1 << 1,\r\n Hidden = 1 << 2,\r\n Disabled = 1 << 3,\r\n ReadOnly = 1 << 4, // View\r\n Full = ~(~0 << 5) // Unrestricted\r\n}\r\n\r\n// HTTP RFC 7231\r\nexport type UserCredentials = {\r\n username: string;\r\n password: string;\r\n};\r\n\r\nexport type IAccessDescriptor = {\r\n // deny/grant reason(s)\r\n [P in AccessLevel]?: string;\r\n};\r\n\r\nexport const $SIGNIN = \"APP-SECURITY-AUTH-SIGNIN\";\r\nexport const $REQUEST_SIGNIN = \"APP-SECURITY-REQUEST-AUTH-SIGNIN\";\r\nexport const $SIGNOUT = \"APP-SECURITY-AUTH-SIGNOUT\";\r\nexport const $REQUEST_SIGNOUT = \"APP-SECURITY-REQUEST-AUTH-SIGNOUT\";\r\nexport const $REFRESH = \"APP-SECURITY-AUTH-REFRESH\";\r\nexport const $REQUEST_AUTH = \"APP-SECURITY-REQUEST-AUTH\";\r\nexport const $GET_ACL = \"APP-SECURITY-GET-ACL\";\r\nexport const $GET_CONTEXT = \"APP-SECURITY-GET-CONTEXT\";\r\nexport const $GET_CONFIG = \"APP-SECURITY-GET-CONFIG\";\r\n\r\nexport type SecurityTokens = {\r\n accessToken?: string;\r\n refreshToken?: string;\r\n};\r\n\r\n// Base(App)SecurityMsgStruct\r\nexport type BaseSecurityMsgStruct = RequireExtends<\r\n {\r\n [$SIGNIN]: {\r\n in: UserCredentials;\r\n out: SecurityContext;\r\n };\r\n [$REQUEST_SIGNIN]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$SIGNOUT]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$REQUEST_SIGNOUT]: {\r\n in: {\r\n callbackUrl: string;\r\n };\r\n // out: void;\r\n };\r\n [$REFRESH]: {\r\n in: Skip<SecurityTokens, \"accessToken\">;\r\n out: SecurityContext;\r\n };\r\n [$REQUEST_AUTH]: {\r\n in: void;\r\n out: void;\r\n };\r\n [$GET_ACL]: {\r\n in: ISecurable;\r\n out: IAccessDescriptor;\r\n };\r\n [$GET_CONTEXT]: {\r\n in: void;\r\n out: SecurityContext;\r\n };\r\n [$GET_CONFIG]: {\r\n in: void;\r\n out: BaseSecurityDomainConfig;\r\n }; \r\n } & MsgStructBase,\r\n MsgStruct\r\n>;\r\n\r\nexport type ISecurable = {\r\n id: string;\r\n};\r\n\r\n// AppSecurityContext\r\nexport type SecurityContext<TUserInfo = any> = {\r\n // isAuthenticated: boolean;\r\n // isExpired: boolean;\r\n accessToken: string;\r\n refreshToken: string;\r\n // sessionToken: string;\r\n // sid: string; // SID is an acronym for \"security identity\", grant recipient\r\n userInfo: TUserInfo;\r\n // authority: string;\r\n authProvider: string; // authSource\r\n domain: string; // protection space, scope of protection\r\n // authExpiresAt\r\n tokenExpiresAt: string;\r\n // acl: any;\r\n};\r\n\r\n// Base(App)Security(Domain)Config\r\nexport type BaseSecurityDomainConfig = {\r\n id: string;\r\n name?: string;\r\n authType: string;\r\n // endpoints\r\n routes: {\r\n authSignIn: string;\r\n authSignOut: string;\r\n authRefresh: string;\r\n // RFC 8414 (OIDC) — \"OAuth 2.0 Authorization Server Metadata\"\r\n // https://datatracker.ietf.org/doc/html/rfc8414 \r\n authService: string;\r\n };\r\n};\r\n"],"names":["AccessLevel","$SIGNIN","$REQUEST_SIGNIN","$SIGNOUT","$REQUEST_SIGNOUT","$REFRESH","$REQUEST_AUTH","$GET_ACL","$GET_CONTEXT","$GET_CONFIG"],"mappings":"AAGO,IAAKA,sBAAAA,OACRA,EAAAA,EAAA,OAAO,CAAA,IAAP,QACAA,EAAAA,EAAA,YAAY,CAAA,IAAZ,aACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,SAAS,CAAA,IAAT,UACAA,EAAAA,EAAA,WAAW,CAAA,IAAX,YACAA,EAAAA,EAAA,WAAW,EAAA,IAAX,YACAA,EAAAA,EAAA,OAAO,EAAA,IAAP,QAPQA,IAAAA,KAAA,CAAA,CAAA;AAqBL,MAAMC,IAAU,4BACVC,IAAkB,oCAClBC,IAAW,6BACXC,IAAmB,qCACnBC,IAAW,6BACXC,IAAgB,6BAChBC,IAAW,wBACXC,IAAe,4BACfC,IAAc;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { AccessLevel, IAccessDescriptor, ISecurable, UserCredentials, SecurityContext } from './securityContracts';
|
|
2
|
-
import { MsgBus } from '@actdim/msgmesh/
|
|
2
|
+
import { MsgBus } from '@actdim/msgmesh/contracts';
|
|
3
3
|
import { BaseAppMsgStruct } from '../appContracts';
|
|
4
4
|
export declare class SecurityProvider<TUserInfo = any> {
|
|
5
5
|
private msgBus;
|
|
@@ -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,
|
|
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;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 i } from "../../net/request.es.js";
|
|
5
|
+
import { ApiError as o } from "../../net/apiError.es.js";
|
|
6
6
|
const u = {
|
|
7
7
|
accessToken: "ACCESS_TOKEN",
|
|
8
8
|
refreshToken: "REFRESH_TOKEN",
|
|
@@ -27,28 +27,28 @@ class E {
|
|
|
27
27
|
acl;
|
|
28
28
|
fetcher = window;
|
|
29
29
|
init;
|
|
30
|
-
constructor(
|
|
31
|
-
this.msgBus =
|
|
30
|
+
constructor(e) {
|
|
31
|
+
this.msgBus = e, this.init = this.updateConfigAsync(), this.msgBus.provide({
|
|
32
32
|
channel: "APP-SECURITY-GET-CONTEXT",
|
|
33
|
-
callback: (
|
|
33
|
+
callback: (s) => this.getContext()
|
|
34
34
|
}), this.msgBus.provide({
|
|
35
35
|
channel: "APP-SECURITY-GET-ACL",
|
|
36
|
-
callback: (
|
|
36
|
+
callback: (s) => this.getAcl(s.payload)
|
|
37
37
|
}), this.msgBus.provide({
|
|
38
38
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
39
|
-
callback: (
|
|
39
|
+
callback: (s) => this.signInAsync(s.payload)
|
|
40
40
|
}), this.msgBus.provide({
|
|
41
41
|
channel: "APP-SECURITY-AUTH-SIGNOUT",
|
|
42
|
-
callback: (
|
|
42
|
+
callback: (s) => this.signOutAsync()
|
|
43
43
|
}), this.msgBus.provide({
|
|
44
44
|
channel: "APP-SECURITY-AUTH-REFRESH",
|
|
45
|
-
callback: (
|
|
45
|
+
callback: (s) => this.refreshAsync()
|
|
46
46
|
}), this.msgBus.provide({
|
|
47
47
|
channel: "APP-SECURITY-REQUEST-AUTH",
|
|
48
|
-
callback: (
|
|
48
|
+
callback: (s) => this.requestAuthorize()
|
|
49
49
|
}), this.msgBus.provide({
|
|
50
50
|
channel: "APP-SECURITY-GET-CONFIG",
|
|
51
|
-
callback: async (
|
|
51
|
+
callback: async (s) => (await this.msgBus.request({
|
|
52
52
|
channel: "APP-CONFIG-GET"
|
|
53
53
|
})).payload?.security
|
|
54
54
|
});
|
|
@@ -64,40 +64,40 @@ class E {
|
|
|
64
64
|
};
|
|
65
65
|
}
|
|
66
66
|
async updateConfigAsync() {
|
|
67
|
-
const
|
|
67
|
+
const e = await this.msgBus.request({
|
|
68
68
|
channel: "APP-CONFIG-GET"
|
|
69
69
|
});
|
|
70
|
-
this.domainConfig =
|
|
71
|
-
const
|
|
72
|
-
this.storageKeys =
|
|
70
|
+
this.domainConfig = e.payload.security;
|
|
71
|
+
const s = l(`${this.domainConfig.id}/`);
|
|
72
|
+
this.storageKeys = s(u), await this.restoreDataAsync();
|
|
73
73
|
}
|
|
74
74
|
async restoreDataAsync() {
|
|
75
|
-
this.accessToken = (await this.msgBus.
|
|
75
|
+
this.accessToken = (await this.msgBus.request({
|
|
76
76
|
channel: "APP-KV-STORE-GET",
|
|
77
77
|
payload: {
|
|
78
78
|
key: this.storageKeys.accessToken
|
|
79
79
|
}
|
|
80
|
-
})).payload, this.refreshToken = (await this.msgBus.
|
|
80
|
+
})).payload, 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
85
|
})).payload;
|
|
86
|
-
let
|
|
86
|
+
let e = (await this.msgBus.request({
|
|
87
87
|
channel: "APP-KV-STORE-GET",
|
|
88
88
|
payload: {
|
|
89
89
|
key: this.storageKeys.userCredentials
|
|
90
90
|
}
|
|
91
91
|
})).payload;
|
|
92
|
-
this.userCredentials =
|
|
92
|
+
this.userCredentials = e ? JSON.parse(e) : {
|
|
93
93
|
username: void 0,
|
|
94
94
|
password: void 0
|
|
95
|
-
},
|
|
95
|
+
}, e = (await this.msgBus.request({
|
|
96
96
|
channel: "APP-KV-STORE-GET",
|
|
97
97
|
payload: {
|
|
98
98
|
key: this.storageKeys.acl
|
|
99
99
|
}
|
|
100
|
-
})).payload, this.acl =
|
|
100
|
+
})).payload, this.acl = e ? JSON.parse(e) : {}, this.accessToken && this.msgBus.request({
|
|
101
101
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
102
102
|
group: "out",
|
|
103
103
|
payload: this.getContext()
|
|
@@ -117,22 +117,22 @@ class E {
|
|
|
117
117
|
// };
|
|
118
118
|
// removeSavedData
|
|
119
119
|
async clearSavedDataAsync() {
|
|
120
|
-
this.accessToken = null, await this.msgBus.
|
|
120
|
+
this.accessToken = null, await this.msgBus.request({
|
|
121
121
|
channel: "APP-KV-STORE-REMOVE",
|
|
122
122
|
payload: {
|
|
123
123
|
key: this.storageKeys.accessToken
|
|
124
124
|
}
|
|
125
|
-
}), this.refreshToken = null, await this.msgBus.
|
|
125
|
+
}), this.refreshToken = null, await this.msgBus.request({
|
|
126
126
|
channel: "APP-KV-STORE-REMOVE",
|
|
127
127
|
payload: {
|
|
128
128
|
key: this.storageKeys.refreshToken
|
|
129
129
|
}
|
|
130
|
-
}), this.userCredentials = null, await this.msgBus.
|
|
130
|
+
}), this.userCredentials = null, await this.msgBus.request({
|
|
131
131
|
channel: "APP-KV-STORE-REMOVE",
|
|
132
132
|
payload: {
|
|
133
133
|
key: this.storageKeys.userCredentials
|
|
134
134
|
}
|
|
135
|
-
}), this.acl = null, await this.msgBus.
|
|
135
|
+
}), this.acl = null, await this.msgBus.request({
|
|
136
136
|
channel: "APP-KV-STORE-REMOVE",
|
|
137
137
|
payload: {
|
|
138
138
|
key: this.storageKeys.acl
|
|
@@ -141,61 +141,61 @@ class E {
|
|
|
141
141
|
}
|
|
142
142
|
async requestAuthorize() {
|
|
143
143
|
this.accessToken = null, this.acl = null;
|
|
144
|
-
const
|
|
144
|
+
const e = this.msgBus.once({
|
|
145
145
|
channel: "APP-SECURITY-AUTH-SIGNIN",
|
|
146
146
|
group: "out"
|
|
147
|
-
}),
|
|
148
|
-
throw await this.msgBus.
|
|
147
|
+
}), s = async () => {
|
|
148
|
+
throw await this.msgBus.once({
|
|
149
149
|
channel: "APP-SECURITY-AUTH-SIGNOUT",
|
|
150
150
|
group: "out"
|
|
151
151
|
}), new Error("Auth failed: login aborted");
|
|
152
152
|
};
|
|
153
|
-
this.msgBus.
|
|
153
|
+
this.msgBus.send({
|
|
154
154
|
channel: "APP-SECURITY-REQUEST-AUTH-SIGNIN",
|
|
155
155
|
payload: {
|
|
156
156
|
callbackUrl: window.location.pathname + window.location.search
|
|
157
157
|
}
|
|
158
|
-
}), await Promise.race([
|
|
158
|
+
}), await Promise.race([e, s]);
|
|
159
159
|
}
|
|
160
|
-
async signInAsync(
|
|
161
|
-
let
|
|
162
|
-
|
|
163
|
-
const n = JSON.stringify(
|
|
164
|
-
url:
|
|
160
|
+
async signInAsync(e) {
|
|
161
|
+
let s = this.domainConfig.routes?.authSignIn;
|
|
162
|
+
s = s.replace(/[?&]$/, "");
|
|
163
|
+
const n = JSON.stringify(e), t = {
|
|
164
|
+
url: s,
|
|
165
165
|
body: n,
|
|
166
166
|
method: "POST",
|
|
167
167
|
headers: {
|
|
168
168
|
"Content-Type": "application/json",
|
|
169
169
|
Accept: "text/plain"
|
|
170
170
|
}
|
|
171
|
-
},
|
|
171
|
+
}, r = {
|
|
172
172
|
...t,
|
|
173
173
|
status: "executing"
|
|
174
|
-
}, a = await this.fetcher.fetch(
|
|
175
|
-
await
|
|
176
|
-
let
|
|
177
|
-
return this.userCredentials =
|
|
174
|
+
}, a = await this.fetcher.fetch(s, t);
|
|
175
|
+
await i(a, r), o.assert(a, r);
|
|
176
|
+
let c = a.resolved.json;
|
|
177
|
+
return this.userCredentials = e, this.accessToken = c.accessToken, this.refreshToken = c.refreshToken, this.saveDataAsync(), this.getContext();
|
|
178
178
|
}
|
|
179
179
|
async saveDataAsync() {
|
|
180
|
-
await this.msgBus.
|
|
180
|
+
await this.msgBus.request({
|
|
181
181
|
channel: "APP-KV-STORE-SET",
|
|
182
182
|
payload: {
|
|
183
183
|
key: this.storageKeys.accessToken,
|
|
184
184
|
value: this.accessToken || null
|
|
185
185
|
}
|
|
186
|
-
}), await this.msgBus.
|
|
186
|
+
}), await this.msgBus.request({
|
|
187
187
|
channel: "APP-KV-STORE-SET",
|
|
188
188
|
payload: {
|
|
189
189
|
key: this.storageKeys.refreshToken,
|
|
190
190
|
value: this.refreshToken || null
|
|
191
191
|
}
|
|
192
|
-
}), await this.msgBus.
|
|
192
|
+
}), await this.msgBus.request({
|
|
193
193
|
channel: "APP-KV-STORE-SET",
|
|
194
194
|
payload: {
|
|
195
195
|
key: this.storageKeys.userCredentials,
|
|
196
196
|
value: this.userCredentials ? JSON.stringify(this.userCredentials) : ""
|
|
197
197
|
}
|
|
198
|
-
}), await this.msgBus.
|
|
198
|
+
}), await this.msgBus.request({
|
|
199
199
|
channel: "APP-KV-STORE-SET",
|
|
200
200
|
payload: {
|
|
201
201
|
key: this.storageKeys.acl,
|
|
@@ -204,29 +204,29 @@ class E {
|
|
|
204
204
|
});
|
|
205
205
|
}
|
|
206
206
|
async signOutAsync() {
|
|
207
|
-
let
|
|
208
|
-
|
|
209
|
-
const
|
|
210
|
-
url:
|
|
207
|
+
let e = this.domainConfig.routes?.authSignOut;
|
|
208
|
+
e && (e = e.replace(/[?&]$/, ""));
|
|
209
|
+
const s = {
|
|
210
|
+
url: e,
|
|
211
211
|
method: "POST",
|
|
212
212
|
headers: {
|
|
213
213
|
"Content-Type": "application/json",
|
|
214
214
|
Accept: "text/plain"
|
|
215
215
|
}
|
|
216
216
|
}, n = {
|
|
217
|
-
...
|
|
217
|
+
...s,
|
|
218
218
|
status: "executing"
|
|
219
|
-
}, t = await this.fetcher.fetch(
|
|
220
|
-
await
|
|
219
|
+
}, t = await this.fetcher.fetch(e, s);
|
|
220
|
+
await i(t, n), o.assert(t, n), this.clearSavedDataAsync();
|
|
221
221
|
}
|
|
222
222
|
async refreshAsync() {
|
|
223
|
-
let
|
|
224
|
-
|
|
225
|
-
let
|
|
223
|
+
let e = this.domainConfig.routes?.authRefresh;
|
|
224
|
+
e && (e = e.replace(/[?&]$/, ""));
|
|
225
|
+
let s = {
|
|
226
226
|
refreshToken: this.refreshToken
|
|
227
227
|
};
|
|
228
|
-
const n = JSON.stringify(
|
|
229
|
-
url:
|
|
228
|
+
const n = JSON.stringify(s), t = {
|
|
229
|
+
url: e,
|
|
230
230
|
body: n,
|
|
231
231
|
method: "POST",
|
|
232
232
|
// useAuth: true,
|
|
@@ -234,20 +234,20 @@ class E {
|
|
|
234
234
|
"Content-Type": "application/json",
|
|
235
235
|
Accept: "text/plain"
|
|
236
236
|
}
|
|
237
|
-
},
|
|
237
|
+
}, r = {
|
|
238
238
|
...t,
|
|
239
239
|
status: "executing"
|
|
240
|
-
}, a = await this.fetcher.fetch(
|
|
241
|
-
return await
|
|
240
|
+
}, a = await this.fetcher.fetch(e, t);
|
|
241
|
+
return await i(a, r), o.assert(a, r), s = a.resolved.json, this.accessToken = s.accessToken, this.refreshToken = s.refreshToken, this.saveDataAsync(), this.getContext();
|
|
242
242
|
}
|
|
243
|
-
async getAcl(
|
|
243
|
+
async getAcl(e) {
|
|
244
244
|
return {
|
|
245
245
|
[h.Full]: ""
|
|
246
246
|
};
|
|
247
247
|
}
|
|
248
248
|
// authorize
|
|
249
|
-
async verifyAccess(
|
|
250
|
-
return this.getAcl(
|
|
249
|
+
async verifyAccess(e, s = h.Full) {
|
|
250
|
+
return this.getAcl(e), !1;
|
|
251
251
|
}
|
|
252
252
|
}
|
|
253
253
|
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/msgBusCore\";\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.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
|
+
{"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,6 +1,6 @@
|
|
|
1
|
-
import { Component, ComponentParams, ComponentStruct } from './
|
|
1
|
+
import { Component, ComponentParams, ComponentStruct } from './contracts';
|
|
2
2
|
import { default as React } from 'react';
|
|
3
|
-
import { MsgStruct } from '@actdim/msgmesh/
|
|
3
|
+
import { MsgStruct } from '@actdim/msgmesh/contracts';
|
|
4
4
|
export type DynamicContentStruct<TData = any, TMsgStruct extends MsgStruct = MsgStruct> = ComponentStruct<TMsgStruct, {
|
|
5
5
|
props: {
|
|
6
6
|
data: TData;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicContent.d.ts","sourceRoot":"","sources":["../../src/componentModel/DynamicContent.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"DynamicContent.d.ts","sourceRoot":"","sources":["../../src/componentModel/DynamicContent.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,SAAS,EAGT,eAAe,EACf,eAAe,EAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAGtD,MAAM,MAAM,oBAAoB,CAC5B,KAAK,GAAG,GAAG,EACX,UAAU,SAAS,SAAS,GAAG,SAAS,IACxC,eAAe,CACf,UAAU,EACV;IACI,KAAK,EAAE;QACH,IAAI,EAAE,KAAK,CAAC;QACZ,MAAM,EAAE,MAAM,KAAK,CAAC,SAAS,CAAC;KACjC,CAAC;CACL,CACJ,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,KAAK,GAAG,GAAG,EACzC,MAAM,EAAE,eAAe,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,qDAiBvD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DynamicContent.es.js","sources":["../../src/componentModel/DynamicContent.tsx"],"sourcesContent":["import {\n Component,\n ComponentDef,\n ComponentModel,\n ComponentParams,\n ComponentStruct,\n
|
|
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 componentDef: 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(componentDef, 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,EAV4D;AAAA,IAC5D,OAAO;AAAA,MACH,QAAQ;AAAA,MACR,MAAM;AAAA,IAAA;AAAA,IAEV,MAAM,CAACC,GAAGH,MACCC,EAAE,OAAA;AAAA,EACb,GAG2BF,CAAM,GACrCE,IAAID,EAAE,OACCA;AACX;"}
|
|
@@ -1,13 +1,19 @@
|
|
|
1
|
-
import { MsgBus, MsgStruct } from '@actdim/msgmesh/
|
|
2
|
-
import { RemoveSuffix } from '@actdim/utico/typeCore';
|
|
1
|
+
import { MsgBus, MsgStruct, MsgStructFactory } from '@actdim/msgmesh/contracts';
|
|
2
|
+
import { AddPrefix, Filter, Func, RemoveSuffix, Skip, ToUpper } from '@actdim/utico/typeCore';
|
|
3
3
|
export type MsgProviderAdapter = {
|
|
4
|
-
service:
|
|
4
|
+
service: any;
|
|
5
5
|
channelSelector: (service: any, methodName: string) => string;
|
|
6
6
|
};
|
|
7
7
|
export declare function registerAdapters<TMsgStruct extends MsgStruct = MsgStruct>(msgBus: MsgBus<TMsgStruct>, adapters: MsgProviderAdapter[], abortSignal?: AbortSignal): void;
|
|
8
|
-
export
|
|
9
|
-
type
|
|
10
|
-
type
|
|
11
|
-
export type
|
|
8
|
+
export type BaseServiceSuffix = 'CLIENT' | 'API' | 'SERVICE' | 'FETCHER' | 'CONTROLLER' | 'LOADER' | 'REPOSITORY' | 'PROVIDER';
|
|
9
|
+
export type ToMsgChannelPrefix<TServiceName extends string, Prefix extends string, Suffix extends string = BaseServiceSuffix> = `${Prefix}${RemoveSuffix<Uppercase<TServiceName>, Suffix>}_`;
|
|
10
|
+
type ToMsgStructSource<TService, TPrefix extends string, TSkip extends keyof TService = never> = Filter<ToUpper<AddPrefix<Skip<TService, TSkip>, TPrefix>>, Func>;
|
|
11
|
+
export type ToMsgStruct<TService, TPrefix extends string, TSkip extends keyof TService = never, TMsgStructSource = ToMsgStructSource<TService, TPrefix, TSkip>> = MsgStructFactory<{
|
|
12
|
+
[K in keyof TMsgStructSource as TMsgStructSource[K] extends Func ? (Uppercase<K extends string ? K : never>) : never]: {
|
|
13
|
+
in: TMsgStructSource[K] extends Func ? Parameters<TMsgStructSource[K]> : never;
|
|
14
|
+
out: TMsgStructSource[K] extends Func ? ReturnType<TMsgStructSource[K]> : never;
|
|
15
|
+
};
|
|
16
|
+
}>;
|
|
17
|
+
export declare function getMsgChannelSelector<TTPrefix extends string>(services: Record<TTPrefix, any>): (service: any, methodName: string) => string;
|
|
12
18
|
export {};
|
|
13
19
|
//# sourceMappingURL=adapters.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/componentModel/adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"adapters.d.ts","sourceRoot":"","sources":["../../src/componentModel/adapters.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAChF,OAAO,EAAE,SAAS,EAAQ,MAAM,EAAE,IAAI,EAAU,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAY5G,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,UAAU,SAAS,SAAS,GAAG,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE,kBAAkB,EAAE,EAAE,WAAW,CAAC,EAAE,WAAW,QAwB/J;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,GAAG,YAAY,GAAG,UAAU,CAAC;AAI/H,MAAM,MAAM,kBAAkB,CAC1B,YAAY,SAAS,MAAM,EAC3B,MAAM,SAAS,MAAM,EACrB,MAAM,SAAS,MAAM,GAAG,iBAAiB,IACzC,GAAG,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC;AAEjE,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"}
|