@actdim/dynstruct 1.2.4 → 1.2.6

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.
@@ -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,EASlB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAsD,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAkChH,qBAAa,gBAAgB;IAKzB,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,CAAM;IAGtB,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;IAmErC,UAAU,IAAI,eAAe;YAWtB,YAAY;IAUpB,WAAW;IAuDjB,IAAW,MAAM,IAAI,MAAM,CAE1B;IAaK,cAAc;IAsCd,UAAU;IA0BV,MAAM,CAAC,WAAW,EAAE,eAAe;IA6CnC,QAAQ;IAsCR,OAAO;IAgCP,WAAW;IA6CX,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC;IASnC,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,cAAmB;CAOlF"}
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,EASlB,MAAM,qBAAqB,CAAC;AAK7B,OAAO,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAC;AACnD,OAAO,EAAsD,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAkChH,qBAAa,gBAAgB;IAKzB,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,CAAM;IAGtB,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;IAmErC,UAAU,IAAI,eAAe;YAWtB,YAAY;IAUpB,WAAW;IAsDjB,IAAW,MAAM,IAAI,MAAM,CAE1B;IAaK,cAAc;IAsCd,UAAU;IA0BV,MAAM,CAAC,WAAW,EAAE,eAAe;IA6CnC,QAAQ;IAsCR,OAAO;IAgCP,WAAW;IA6CX,MAAM,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC;IASnC,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,cAAmB;CAOlF"}
@@ -1,7 +1,7 @@
1
- import { $CONTEXT_GET as m, $ACL_GET as f, $AUTH_SIGNIN as c, $AUTH_SIGNOUT as y, $AUTH_REFRESH as T, $AUTH_ENSURE as k, $CONFIG_GET as w, $AUTH_SIGNIN_REQUEST as C, AccessLevel as d } from "./securityContracts.es.js";
1
+ import { $CONTEXT_GET as m, $ACL_GET as f, $AUTH_SIGNIN as l, $AUTH_SIGNOUT as y, $AUTH_REFRESH as T, $AUTH_ENSURE as k, $CONFIG_GET as w, $AUTH_SIGNIN_REQUEST as C, AccessLevel as d } from "./securityContracts.es.js";
2
2
  import { getValuePrefixer as E } from "@actdim/utico/typeCore";
3
3
  import "jwt-decode";
4
- import { getResponseResult as l } from "../../net/request.es.js";
4
+ import { getResponseResult as c } from "../../net/request.es.js";
5
5
  import { ApiError as u } from "../../net/apiError.es.js";
6
6
  import { $CONFIG_GET as p, $STORE_GET as r, $STORE_REMOVE as o, $STORE_SET as h } from "../appContracts.es.js";
7
7
  const v = {
@@ -29,28 +29,28 @@ class _ {
29
29
  acl;
30
30
  fetcher = window;
31
31
  init;
32
- constructor(e) {
33
- this.msgBus = e, this.init = this.updateConfig(), this.msgBus.provide({
32
+ constructor(s) {
33
+ this.msgBus = s, this.init = this.updateConfig(), this.msgBus.provide({
34
34
  channel: m,
35
- callback: async (s) => (await this.init, this.getContext())
35
+ callback: async (e) => (await this.init, this.getContext())
36
36
  }), this.msgBus.provide({
37
37
  channel: f,
38
- callback: async (s) => (await this.init, this.getAcl(s.payload))
38
+ callback: async (e) => (await this.init, this.getAcl(e.payload))
39
39
  }), this.msgBus.provide({
40
- channel: c,
41
- callback: async (s) => (await this.init, this.signIn(s.payload))
40
+ channel: l,
41
+ callback: async (e) => (await this.init, this.signIn(e.payload))
42
42
  }), this.msgBus.provide({
43
43
  channel: y,
44
- callback: async (s) => (await this.init, this.signOut())
44
+ callback: async (e) => (await this.init, this.signOut())
45
45
  }), this.msgBus.provide({
46
46
  channel: T,
47
- callback: async (s) => (await this.init, this.refreshAuth())
47
+ callback: async (e) => (await this.init, this.refreshAuth())
48
48
  }), this.msgBus.provide({
49
49
  channel: k,
50
- callback: async (s) => (await this.init, this.ensureAuth())
50
+ callback: async (e) => (await this.init, this.ensureAuth())
51
51
  }), this.msgBus.provide({
52
52
  channel: w,
53
- callback: async (s) => (await this.msgBus.request({
53
+ callback: async (e) => (await this.msgBus.request({
54
54
  channel: p
55
55
  })).payload?.security
56
56
  });
@@ -66,44 +66,45 @@ class _ {
66
66
  };
67
67
  }
68
68
  async updateConfig() {
69
- const e = await this.msgBus.request({
69
+ const s = await this.msgBus.request({
70
70
  channel: p
71
71
  });
72
- this.domainConfig = e.payload.security;
73
- const s = E(`${this.domainConfig?.id}/`);
74
- this.storageKeys = s(v), await this.restoreData();
72
+ this.domainConfig = s.payload.security;
73
+ const e = E(`${this.domainConfig?.id}/`);
74
+ this.storageKeys = e(v), await this.restoreData();
75
75
  }
76
76
  async restoreData() {
77
- this.accessToken = (await this.msgBus.request({
77
+ let s = await this.msgBus.request({
78
78
  channel: r,
79
79
  payload: {
80
80
  key: this.storageKeys.accessToken
81
81
  }
82
- })).payload.data?.value, this.refreshToken = (await this.msgBus.request({
82
+ });
83
+ this.accessToken = s.payload.data?.value, s = await this.msgBus.request({
83
84
  channel: r,
84
85
  payload: {
85
86
  key: this.storageKeys.refreshToken
86
87
  }
87
- })).payload.data?.value, this.userCredentials = (await this.msgBus.request({
88
+ }), this.refreshToken = s.payload.data?.value, s = await this.msgBus.request({
88
89
  channel: r,
89
90
  payload: {
90
91
  key: this.storageKeys.userCredentials
91
92
  }
92
- })).payload.data?.value || {
93
+ }), this.userCredentials = s.payload.data?.value || {
93
94
  userName: null,
94
95
  password: null
95
- }, this.authInfo = (await this.msgBus.request({
96
+ }, s = await this.msgBus.request({
96
97
  channel: r,
97
98
  payload: {
98
99
  key: this.storageKeys.authInfo
99
100
  }
100
- })).payload.data?.value, this.acl = (await this.msgBus.request({
101
+ }), this.authInfo = s.payload.data?.value, s = await this.msgBus.request({
101
102
  channel: r,
102
103
  payload: {
103
104
  key: this.storageKeys.acl
104
105
  }
105
- })).payload.data?.value || null, this.accessToken && this.msgBus.request({
106
- channel: c,
106
+ }), this.acl = s.payload.data?.value || null, this.accessToken && this.msgBus.send({
107
+ channel: l,
107
108
  group: "out",
108
109
  payload: this.getContext()
109
110
  });
@@ -151,10 +152,10 @@ class _ {
151
152
  }
152
153
  async ensureAuth() {
153
154
  this.accessToken = null, this.acl = null;
154
- const e = this.msgBus.once({
155
- channel: c,
155
+ const s = this.msgBus.once({
156
+ channel: l,
156
157
  group: "out"
157
- }), s = async () => {
158
+ }), e = async () => {
158
159
  throw await this.msgBus.once({
159
160
  channel: y,
160
161
  group: "out"
@@ -165,13 +166,13 @@ class _ {
165
166
  payload: {
166
167
  callbackUrl: window.location.pathname + window.location.search
167
168
  }
168
- }), await Promise.race([e, s]);
169
+ }), await Promise.race([s, e]);
169
170
  }
170
- async signIn(e) {
171
- let s = this.domainConfig.routes?.authSignIn;
172
- s = s.replace(/[?&]$/, "");
173
- const n = JSON.stringify(e), t = {
174
- url: s,
171
+ async signIn(s) {
172
+ let e = this.domainConfig.routes?.authSignIn;
173
+ e = e.replace(/[?&]$/, "");
174
+ const n = JSON.stringify(s), t = {
175
+ url: e,
175
176
  body: n,
176
177
  method: "POST",
177
178
  headers: {
@@ -181,10 +182,10 @@ class _ {
181
182
  }, i = {
182
183
  ...t,
183
184
  status: "executing"
184
- }, a = await this.fetcher.fetch(s, t);
185
- await l(a, i), u.assert(a, i), this.authInfo = a.resolved.json;
185
+ }, a = await this.fetcher.fetch(e, t);
186
+ await c(a, i), u.assert(a, i), this.authInfo = a.resolved.json;
186
187
  const g = this.authInfo;
187
- return this.userCredentials = e, this.accessToken = g.accessToken, this.refreshToken = g.refreshToken, this.saveData(), this.getContext();
188
+ return this.userCredentials = s, this.accessToken = g.accessToken, this.refreshToken = g.refreshToken, this.saveData(), this.getContext();
188
189
  }
189
190
  async saveData() {
190
191
  await this.msgBus.request({
@@ -220,29 +221,29 @@ class _ {
220
221
  });
221
222
  }
222
223
  async signOut() {
223
- let e = this.domainConfig.routes?.authSignOut;
224
- e && (e = e.replace(/[?&]$/, ""));
225
- const s = {
226
- url: e,
224
+ let s = this.domainConfig.routes?.authSignOut;
225
+ s && (s = s.replace(/[?&]$/, ""));
226
+ const e = {
227
+ url: s,
227
228
  method: "POST",
228
229
  headers: {
229
230
  "Content-Type": "application/json",
230
231
  Accept: "text/plain"
231
232
  }
232
233
  }, n = {
233
- ...s,
234
+ ...e,
234
235
  status: "executing"
235
- }, t = await this.fetcher.fetch(e, s);
236
- await l(t, n), u.assert(t, n), this.clearSavedData();
236
+ }, t = await this.fetcher.fetch(s, e);
237
+ await c(t, n), u.assert(t, n), this.clearSavedData();
237
238
  }
238
239
  async refreshAuth() {
239
- let e = this.domainConfig.routes?.authRefresh;
240
- e && (e = e.replace(/[?&]$/, ""));
241
- let s = {
240
+ let s = this.domainConfig.routes?.authRefresh;
241
+ s && (s = s.replace(/[?&]$/, ""));
242
+ let e = {
242
243
  refreshToken: this.refreshToken
243
244
  };
244
- const n = JSON.stringify(s), t = {
245
- url: e,
245
+ const n = JSON.stringify(e), t = {
246
+ url: s,
246
247
  body: n,
247
248
  method: "POST",
248
249
  // useAuth: true,
@@ -253,17 +254,17 @@ class _ {
253
254
  }, i = {
254
255
  ...t,
255
256
  status: "executing"
256
- }, a = await this.fetcher.fetch(e, t);
257
- return await l(a, i), u.assert(a, i), s = a.resolved.json, this.accessToken = s.accessToken, this.refreshToken = s.refreshToken, this.saveData(), this.getContext();
257
+ }, a = await this.fetcher.fetch(s, t);
258
+ return await c(a, i), u.assert(a, i), e = a.resolved.json, this.accessToken = e.accessToken, this.refreshToken = e.refreshToken, this.saveData(), this.getContext();
258
259
  }
259
- async getAcl(e) {
260
+ async getAcl(s) {
260
261
  return {
261
262
  [d.Full]: ""
262
263
  };
263
264
  }
264
265
  // authorize
265
- async verifyAccess(e, s = d.Full) {
266
- return this.getAcl(e), !1;
266
+ async verifyAccess(s, e = d.Full) {
267
+ return this.getAcl(s), !1;
267
268
  }
268
269
  }
269
270
  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 $AUTH_SIGNIN,\r\n $AUTH_SIGNOUT,\r\n $AUTH_SIGNIN_REQUEST,\r\n $CONTEXT_GET,\r\n $ACL_GET,\r\n $AUTH_REFRESH,\r\n $AUTH_ENSURE,\r\n $CONFIG_GET as $SECURITY_CONFIG_GET\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 { $CONFIG_GET, $STORE_GET, $STORE_REMOVE, $STORE_SET, 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 // signInInfo\r\n authInfo: \"AUTH_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 {\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 authInfo: any;\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.updateConfig();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: $CONTEXT_GET,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $ACL_GET,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_SIGNIN,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.signIn(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_SIGNOUT,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.signOut();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_REFRESH,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.refreshAuth();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_ENSURE,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.ensureAuth();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $SECURITY_CONFIG_GET,\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.request({\r\n channel: $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 authInfo: this.authInfo,\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 updateConfig() {\r\n const msg = await this.msgBus.request({\r\n channel: $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.restoreData();\r\n }\r\n\r\n async restoreData() {\r\n this.accessToken = (\r\n await this.msgBus.request({\r\n channel: $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: $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: $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 this.authInfo = (\r\n await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.authInfo\r\n }\r\n })\r\n ).payload.data?.value;\r\n\r\n this.acl = (\r\n await this.msgBus.request({\r\n channel: $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: $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 clearSavedData() {\r\n this.accessToken = null;\r\n await this.msgBus.request({\r\n channel: $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: $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: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.authInfo = null;\r\n await this.msgBus.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.authInfo\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async ensureAuth() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.once({\r\n channel: $AUTH_SIGNIN,\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.once({\r\n channel: $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: $AUTH_SIGNIN_REQUEST,\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 signIn(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 // TODO:\r\n // application/x-www-form-urlencoded?\r\n // ?userName=&password=\r\n // userName:password (BASIC)\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 this.authInfo = response.resolved.json;\r\n const tokens = this.authInfo 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.saveData();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveData() {\r\n await this.msgBus.request({\r\n channel: $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: $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: $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: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.authInfo,\r\n value: this.authInfo ? this.authInfo : null\r\n }\r\n });\r\n await this.msgBus.request({\r\n channel: $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 signOut() {\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.saveData();\r\n this.clearSavedData();\r\n }\r\n\r\n async refreshAuth() {\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.saveData();\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","$CONTEXT_GET","msg","$ACL_GET","$AUTH_SIGNIN","$AUTH_SIGNOUT","$AUTH_REFRESH","$AUTH_ENSURE","$SECURITY_CONFIG_GET","$CONFIG_GET","prefixer","getValuePrefixer","$STORE_GET","$STORE_REMOVE","signIn","signOut","$AUTH_SIGNIN_REQUEST","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","$STORE_SET","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 $AUTH_SIGNIN,\r\n $AUTH_SIGNOUT,\r\n $AUTH_SIGNIN_REQUEST,\r\n $CONTEXT_GET,\r\n $ACL_GET,\r\n $AUTH_REFRESH,\r\n $AUTH_ENSURE,\r\n $CONFIG_GET as $SECURITY_CONFIG_GET\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 { $CONFIG_GET, $STORE_GET, $STORE_REMOVE, $STORE_SET, 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 // signInInfo\r\n authInfo: \"AUTH_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 {\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 authInfo: any;\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.updateConfig();\r\n\r\n // TODO: support custom requests\r\n\r\n this.msgBus.provide({\r\n channel: $CONTEXT_GET,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.getContext();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $ACL_GET,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.getAcl(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_SIGNIN,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.signIn(msg.payload);\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_SIGNOUT,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.signOut();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_REFRESH,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.refreshAuth();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $AUTH_ENSURE,\r\n callback: async (msg) => {\r\n await this.init;\r\n return this.ensureAuth();\r\n }\r\n });\r\n\r\n this.msgBus.provide({\r\n channel: $SECURITY_CONFIG_GET,\r\n callback: async (msg) => {\r\n return (\r\n await this.msgBus.request({\r\n channel: $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 authInfo: this.authInfo,\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 updateConfig() {\r\n const msg = await this.msgBus.request({\r\n channel: $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.restoreData();\r\n }\r\n\r\n async restoreData() {\r\n let msg = await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.accessToken\r\n }\r\n });\r\n this.accessToken = msg.payload.data?.value;\r\n\r\n msg = await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.refreshToken\r\n }\r\n });\r\n this.refreshToken = msg.payload.data?.value;\r\n\r\n msg = await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.userCredentials = msg.payload.data?.value || {\r\n userName: null,\r\n password: null\r\n };\r\n\r\n msg = await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.authInfo\r\n }\r\n });\r\n\r\n this.authInfo = msg.payload.data?.value;\r\n\r\n msg = await this.msgBus.request({\r\n channel: $STORE_GET,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n })\r\n this.acl = msg.payload.data?.value || null;\r\n\r\n if (this.accessToken) {\r\n this.msgBus.send({\r\n channel: $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 clearSavedData() {\r\n this.accessToken = null;\r\n await this.msgBus.request({\r\n channel: $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: $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: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.userCredentials\r\n }\r\n });\r\n this.authInfo = null;\r\n await this.msgBus.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.authInfo\r\n }\r\n });\r\n this.acl = null;\r\n await this.msgBus.request({\r\n channel: $STORE_REMOVE,\r\n payload: {\r\n key: this.storageKeys.acl\r\n }\r\n });\r\n }\r\n\r\n async ensureAuth() {\r\n this.accessToken = null;\r\n this.acl = null;\r\n\r\n const signIn = this.msgBus.once({\r\n channel: $AUTH_SIGNIN,\r\n group: \"out\"\r\n });\r\n\r\n const signOut = async () => {\r\n await this.msgBus.once({\r\n channel: $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: $AUTH_SIGNIN_REQUEST,\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 signIn(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 // TODO:\r\n // application/x-www-form-urlencoded?\r\n // ?userName=&password=\r\n // userName:password (BASIC)\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 this.authInfo = response.resolved.json;\r\n const tokens = this.authInfo 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.saveData();\r\n\r\n return this.getContext();\r\n }\r\n\r\n async saveData() {\r\n await this.msgBus.request({\r\n channel: $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: $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: $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: $STORE_SET,\r\n payload: {\r\n key: this.storageKeys.authInfo,\r\n value: this.authInfo ? this.authInfo : null\r\n }\r\n });\r\n await this.msgBus.request({\r\n channel: $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 signOut() {\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.saveData();\r\n this.clearSavedData();\r\n }\r\n\r\n async refreshAuth() {\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.saveData();\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","$CONTEXT_GET","msg","$ACL_GET","$AUTH_SIGNIN","$AUTH_SIGNOUT","$AUTH_REFRESH","$AUTH_ENSURE","$SECURITY_CONFIG_GET","$CONFIG_GET","prefixer","getValuePrefixer","$STORE_GET","$STORE_REMOVE","signIn","signOut","$AUTH_SIGNIN_REQUEST","credentials","url","content","requestParams","request","response","getResponseResult","ApiError","tokens","$STORE_SET","obj","AccessLevel","accessLevel"],"mappings":"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"}
@@ -1,15 +1,15 @@
1
1
  import { getFC as c, useComponent as l } from "../../componentModel/react.es.js";
2
2
  import { PersistentStore as y } from "@actdim/utico/store/persistentStore";
3
3
  const m = (s) => {
4
- let t, n;
4
+ let a, n;
5
5
  async function r() {
6
- a = await y.open(n.storeName);
6
+ t = await y.open(n.storeName);
7
7
  }
8
- let a, i;
8
+ let t, i;
9
9
  const o = new Promise((e) => {
10
10
  i = e;
11
11
  });
12
- return t = l({
12
+ return a = l({
13
13
  props: {
14
14
  storeName: ""
15
15
  },
@@ -17,13 +17,13 @@ const m = (s) => {
17
17
  provide: {
18
18
  "APP.STORE.GET": {
19
19
  in: {
20
- callback: async (e) => (await o, (await a.get(e.payload.key))?.data.value)
20
+ callback: async (e) => (await o, await t.get(e.payload.key))
21
21
  }
22
22
  },
23
23
  "APP.STORE.SET": {
24
24
  in: {
25
25
  callback: async (e) => {
26
- await o, await a.set(
26
+ await o, await t.set(
27
27
  {
28
28
  key: e.payload.key
29
29
  },
@@ -35,7 +35,7 @@ const m = (s) => {
35
35
  "APP.STORE.REMOVE": {
36
36
  in: {
37
37
  callback: async (e) => {
38
- await o, await a.delete(e.payload.key);
38
+ await o, await t.delete(e.payload.key);
39
39
  }
40
40
  }
41
41
  }
@@ -46,10 +46,10 @@ const m = (s) => {
46
46
  r();
47
47
  }
48
48
  }
49
- }, s), n = t.model, r().then(() => i()), t;
50
- }, u = c(m);
49
+ }, s), n = a.model, r().then(() => i()), a;
50
+ }, w = c(m);
51
51
  export {
52
- u as StorageService,
52
+ w as StorageService,
53
53
  m as useStorageService
54
54
  };
55
55
  //# sourceMappingURL=StorageService.es.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StorageService.es.js","sources":["../../../src/services/react/StorageService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n Component,\r\n ComponentModel,\r\n ComponentDef,\r\n} from '@/componentModel/contracts';\r\nimport { getFC, useComponent } from '@/componentModel/react';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport { BaseAppMsgChannels, BaseAppMsgStruct } from '@/appDomain/appContracts';\r\nimport { PropsWithChildren } from 'react';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: PropsWithChildren & {\r\n storeName?: string;\r\n };\r\n msgScope: {\r\n provide: BaseAppMsgChannels<'APP.STORE.GET' | 'APP.STORE.SET' | 'APP.STORE.REMOVE'>;\r\n };\r\n }\r\n>;\r\n\r\nexport const useStorageService = (params: ComponentParams<Struct>) => {\r\n let c: Component<Struct>;\r\n let m: ComponentModel<Struct>;\r\n\r\n async function _updateStoreAsync() {\r\n store = await PersistentStore.open(m.storeName);\r\n }\r\n\r\n let store: PersistentStore;\r\n let ready: () => void;\r\n const init = new Promise<void>((res) => {\r\n ready = res;\r\n });\r\n\r\n const def: ComponentDef<Struct> = {\r\n props: {\r\n storeName: '',\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP.STORE.GET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n const item = await store.get(msg.payload.key);\r\n return item?.data.value;\r\n },\r\n },\r\n },\r\n 'APP.STORE.SET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.set(\r\n {\r\n key: msg.payload.key,\r\n },\r\n msg.payload.value,\r\n );\r\n },\r\n },\r\n },\r\n 'APP.STORE.REMOVE': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.delete(msg.payload.key);\r\n },\r\n },\r\n },\r\n },\r\n },\r\n events: {\r\n onChangeStoreName: () => {\r\n _updateStoreAsync();\r\n },\r\n },\r\n };\r\n\r\n c = useComponent(def, params);\r\n m = c.model;\r\n _updateStoreAsync().then(() => ready());\r\n return c;\r\n};\r\n\r\nexport type StorageServiceStruct = Struct;\r\nexport const StorageService: React.FC<ComponentParams<Struct>> = getFC(useStorageService);\r\n"],"names":["useStorageService","params","c","m","_updateStoreAsync","store","PersistentStore","ready","init","res","useComponent","msg","StorageService","getFC"],"mappings":";;AAwBO,MAAMA,IAAoB,CAACC,MAAoC;AAClE,MAAIC,GACAC;AAEJ,iBAAeC,IAAoB;AAC/B,IAAAC,IAAQ,MAAMC,EAAgB,KAAKH,EAAE,SAAS;AAAA,EAClD;AAEA,MAAIE,GACAE;AACJ,QAAMC,IAAO,IAAI,QAAc,CAACC,MAAQ;AACpC,IAAAF,IAAQE;AAAA,EACZ,CAAC;AA+CD,SAAAP,IAAIQ,EA7C8B;AAAA,IAC9B,OAAO;AAAA,MACH,WAAW;AAAA,IAAA;AAAA,IAEf,WAAW;AAAA,MACP,SAAS;AAAA,QACL,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOC,OACb,MAAMH,IACO,MAAMH,EAAM,IAAIM,EAAI,QAAQ,GAAG,IAC/B,KAAK;AAAA,UACtB;AAAA,QACJ;AAAA,QAEJ,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM;AAAA,gBACR;AAAA,kBACI,KAAKM,EAAI,QAAQ;AAAA,gBAAA;AAAA,gBAErBA,EAAI,QAAQ;AAAA,cAAA;AAAA,YAEpB;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,oBAAoB;AAAA,UAChB,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM,OAAOM,EAAI,QAAQ,GAAG;AAAA,YACtC;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,mBAAmB,MAAM;AACrB,QAAAP,EAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EACJ,GAGkBH,CAAM,GAC5BE,IAAID,EAAE,OACNE,IAAoB,KAAK,MAAMG,GAAO,GAC/BL;AACX,GAGaU,IAAoDC,EAAMb,CAAiB;"}
1
+ {"version":3,"file":"StorageService.es.js","sources":["../../../src/services/react/StorageService.tsx"],"sourcesContent":["import {\r\n ComponentParams,\r\n ComponentStruct,\r\n Component,\r\n ComponentModel,\r\n ComponentDef,\r\n} from '@/componentModel/contracts';\r\nimport { getFC, useComponent } from '@/componentModel/react';\r\nimport { PersistentStore } from '@actdim/utico/store/persistentStore';\r\nimport { BaseAppMsgChannels, BaseAppMsgStruct } from '@/appDomain/appContracts';\r\nimport { PropsWithChildren } from 'react';\r\n\r\ntype Struct = ComponentStruct<\r\n BaseAppMsgStruct,\r\n {\r\n props: PropsWithChildren & {\r\n storeName?: string;\r\n };\r\n msgScope: {\r\n provide: BaseAppMsgChannels<'APP.STORE.GET' | 'APP.STORE.SET' | 'APP.STORE.REMOVE'>;\r\n };\r\n }\r\n>;\r\n\r\nexport const useStorageService = (params: ComponentParams<Struct>) => {\r\n let c: Component<Struct>;\r\n let m: ComponentModel<Struct>;\r\n\r\n async function _updateStoreAsync() {\r\n store = await PersistentStore.open(m.storeName);\r\n }\r\n\r\n let store: PersistentStore;\r\n let ready: () => void;\r\n const init = new Promise<void>((res) => {\r\n ready = res;\r\n });\r\n\r\n const def: ComponentDef<Struct> = {\r\n props: {\r\n storeName: '',\r\n },\r\n msgBroker: {\r\n provide: {\r\n 'APP.STORE.GET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n const item = await store.get(msg.payload.key); \r\n return item;\r\n },\r\n },\r\n },\r\n 'APP.STORE.SET': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.set(\r\n {\r\n key: msg.payload.key,\r\n },\r\n msg.payload.value,\r\n );\r\n },\r\n },\r\n },\r\n 'APP.STORE.REMOVE': {\r\n in: {\r\n callback: async (msg) => {\r\n await init;\r\n await store.delete(msg.payload.key);\r\n },\r\n },\r\n },\r\n },\r\n },\r\n events: {\r\n onChangeStoreName: () => {\r\n _updateStoreAsync();\r\n },\r\n },\r\n };\r\n\r\n c = useComponent(def, params);\r\n m = c.model;\r\n _updateStoreAsync().then(() => ready());\r\n return c;\r\n};\r\n\r\nexport type StorageServiceStruct = Struct;\r\nexport const StorageService: React.FC<ComponentParams<Struct>> = getFC(useStorageService);\r\n"],"names":["useStorageService","params","c","m","_updateStoreAsync","store","PersistentStore","ready","init","res","useComponent","msg","StorageService","getFC"],"mappings":";;AAwBO,MAAMA,IAAoB,CAACC,MAAoC;AAClE,MAAIC,GACAC;AAEJ,iBAAeC,IAAoB;AAC/B,IAAAC,IAAQ,MAAMC,EAAgB,KAAKH,EAAE,SAAS;AAAA,EAClD;AAEA,MAAIE,GACAE;AACJ,QAAMC,IAAO,IAAI,QAAc,CAACC,MAAQ;AACpC,IAAAF,IAAQE;AAAA,EACZ,CAAC;AA+CD,SAAAP,IAAIQ,EA7C8B;AAAA,IAC9B,OAAO;AAAA,MACH,WAAW;AAAA,IAAA;AAAA,IAEf,WAAW;AAAA,MACP,SAAS;AAAA,QACL,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOC,OACb,MAAMH,GACO,MAAMH,EAAM,IAAIM,EAAI,QAAQ,GAAG;AAAA,UAEhD;AAAA,QACJ;AAAA,QAEJ,iBAAiB;AAAA,UACb,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM;AAAA,gBACR;AAAA,kBACI,KAAKM,EAAI,QAAQ;AAAA,gBAAA;AAAA,gBAErBA,EAAI,QAAQ;AAAA,cAAA;AAAA,YAEpB;AAAA,UAAA;AAAA,QACJ;AAAA,QAEJ,oBAAoB;AAAA,UAChB,IAAI;AAAA,YACA,UAAU,OAAOA,MAAQ;AACrB,oBAAMH,GACN,MAAMH,EAAM,OAAOM,EAAI,QAAQ,GAAG;AAAA,YACtC;AAAA,UAAA;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ;AAAA,IAEJ,QAAQ;AAAA,MACJ,mBAAmB,MAAM;AACrB,QAAAP,EAAA;AAAA,MACJ;AAAA,IAAA;AAAA,EACJ,GAGkBH,CAAM,GAC5BE,IAAID,EAAE,OACNE,IAAoB,KAAK,MAAMG,GAAO,GAC/BL;AACX,GAGaU,IAAoDC,EAAMb,CAAiB;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actdim/dynstruct",
3
- "version": "1.2.4",
3
+ "version": "1.2.6",
4
4
  "description": "A type-safe component system for large-scale apps: explicit dependencies, message bus communication, and structure-first, declarative design",
5
5
  "author": "Pavel Borodaev",
6
6
  "license": "Proprietary",