@vived/host 4.7.0 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js +104 -27
  2. package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
  3. package/dist/cjs/Assets/UCs/GetAssetFileUC.js +111 -34
  4. package/dist/cjs/Assets/UCs/GetAssetFileUC.js.map +1 -1
  5. package/dist/cjs/Cache/Controllers/clearCache.js +13 -0
  6. package/dist/cjs/Cache/Controllers/clearCache.js.map +1 -0
  7. package/dist/cjs/Cache/Controllers/index.js +18 -0
  8. package/dist/cjs/Cache/Controllers/index.js.map +1 -0
  9. package/dist/cjs/Cache/Entities/AssetCacheEntity.js +95 -0
  10. package/dist/cjs/Cache/Entities/AssetCacheEntity.js.map +1 -0
  11. package/dist/cjs/Cache/Entities/CacheEntity.js +54 -0
  12. package/dist/cjs/Cache/Entities/CacheEntity.js.map +1 -0
  13. package/dist/cjs/Cache/Entities/ScriptCacheEntity.js +137 -0
  14. package/dist/cjs/Cache/Entities/ScriptCacheEntity.js.map +1 -0
  15. package/dist/cjs/Cache/Entities/index.js +25 -0
  16. package/dist/cjs/Cache/Entities/index.js.map +1 -0
  17. package/dist/cjs/Cache/Factories/index.js +18 -0
  18. package/dist/cjs/Cache/Factories/index.js.map +1 -0
  19. package/dist/cjs/Cache/Factories/setupCache.js +25 -0
  20. package/dist/cjs/Cache/Factories/setupCache.js.map +1 -0
  21. package/dist/cjs/Cache/Mocks/MockCacheEntity.js +22 -0
  22. package/dist/cjs/Cache/Mocks/MockCacheEntity.js.map +1 -0
  23. package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js +19 -0
  24. package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
  25. package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js +22 -0
  26. package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
  27. package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js +17 -0
  28. package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
  29. package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js +22 -0
  30. package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
  31. package/dist/cjs/Cache/Mocks/index.js +22 -0
  32. package/dist/cjs/Cache/Mocks/index.js.map +1 -0
  33. package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js +40 -0
  34. package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
  35. package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js +49 -0
  36. package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
  37. package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js +39 -0
  38. package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
  39. package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js +48 -0
  40. package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
  41. package/dist/cjs/Cache/UCs/index.js +26 -0
  42. package/dist/cjs/Cache/UCs/index.js.map +1 -0
  43. package/dist/cjs/Cache/index.js +21 -0
  44. package/dist/cjs/Cache/index.js.map +1 -0
  45. package/dist/cjs/index.js +1 -0
  46. package/dist/cjs/index.js.map +1 -1
  47. package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js +104 -27
  48. package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
  49. package/dist/esm/Assets/UCs/GetAssetFileUC.js +111 -34
  50. package/dist/esm/Assets/UCs/GetAssetFileUC.js.map +1 -1
  51. package/dist/esm/Cache/Controllers/clearCache.js +10 -0
  52. package/dist/esm/Cache/Controllers/clearCache.js.map +1 -0
  53. package/dist/esm/Cache/Controllers/index.js +2 -0
  54. package/dist/esm/Cache/Controllers/index.js.map +1 -0
  55. package/dist/esm/Cache/Entities/AssetCacheEntity.js +90 -0
  56. package/dist/esm/Cache/Entities/AssetCacheEntity.js.map +1 -0
  57. package/dist/esm/Cache/Entities/CacheEntity.js +49 -0
  58. package/dist/esm/Cache/Entities/CacheEntity.js.map +1 -0
  59. package/dist/esm/Cache/Entities/ScriptCacheEntity.js +132 -0
  60. package/dist/esm/Cache/Entities/ScriptCacheEntity.js.map +1 -0
  61. package/dist/esm/Cache/Entities/index.js +9 -0
  62. package/dist/esm/Cache/Entities/index.js.map +1 -0
  63. package/dist/esm/Cache/Factories/index.js +2 -0
  64. package/dist/esm/Cache/Factories/index.js.map +1 -0
  65. package/dist/esm/Cache/Factories/setupCache.js +22 -0
  66. package/dist/esm/Cache/Factories/setupCache.js.map +1 -0
  67. package/dist/esm/Cache/Mocks/MockCacheEntity.js +17 -0
  68. package/dist/esm/Cache/Mocks/MockCacheEntity.js.map +1 -0
  69. package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js +14 -0
  70. package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
  71. package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js +17 -0
  72. package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
  73. package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js +12 -0
  74. package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
  75. package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js +17 -0
  76. package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
  77. package/dist/esm/Cache/Mocks/index.js +6 -0
  78. package/dist/esm/Cache/Mocks/index.js.map +1 -0
  79. package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js +35 -0
  80. package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
  81. package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js +44 -0
  82. package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
  83. package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js +34 -0
  84. package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
  85. package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js +43 -0
  86. package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
  87. package/dist/esm/Cache/UCs/index.js +10 -0
  88. package/dist/esm/Cache/UCs/index.js.map +1 -0
  89. package/dist/esm/Cache/index.js +5 -0
  90. package/dist/esm/Cache/index.js.map +1 -0
  91. package/dist/esm/index.js +1 -0
  92. package/dist/esm/index.js.map +1 -1
  93. package/dist/types/Assets/UCs/GetAssetBlobURLUC.d.ts.map +1 -1
  94. package/dist/types/Cache/Controllers/clearCache.d.ts +3 -0
  95. package/dist/types/Cache/Controllers/clearCache.d.ts.map +1 -0
  96. package/dist/types/Cache/Controllers/index.d.ts +2 -0
  97. package/dist/types/Cache/Controllers/index.d.ts.map +1 -0
  98. package/dist/types/Cache/Entities/AssetCacheEntity.d.ts +43 -0
  99. package/dist/types/Cache/Entities/AssetCacheEntity.d.ts.map +1 -0
  100. package/dist/types/Cache/Entities/CacheEntity.d.ts +57 -0
  101. package/dist/types/Cache/Entities/CacheEntity.d.ts.map +1 -0
  102. package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts +64 -0
  103. package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts.map +1 -0
  104. package/dist/types/Cache/Entities/index.d.ts +9 -0
  105. package/dist/types/Cache/Entities/index.d.ts.map +1 -0
  106. package/dist/types/Cache/Factories/index.d.ts +2 -0
  107. package/dist/types/Cache/Factories/index.d.ts.map +1 -0
  108. package/dist/types/Cache/Factories/setupCache.d.ts +6 -0
  109. package/dist/types/Cache/Factories/setupCache.d.ts.map +1 -0
  110. package/dist/types/Cache/Mocks/MockCacheEntity.d.ts +13 -0
  111. package/dist/types/Cache/Mocks/MockCacheEntity.d.ts.map +1 -0
  112. package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts +8 -0
  113. package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts.map +1 -0
  114. package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts +9 -0
  115. package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts.map +1 -0
  116. package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts +8 -0
  117. package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts.map +1 -0
  118. package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts +9 -0
  119. package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts.map +1 -0
  120. package/dist/types/Cache/Mocks/index.d.ts +6 -0
  121. package/dist/types/Cache/Mocks/index.d.ts.map +1 -0
  122. package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts +8 -0
  123. package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts.map +1 -0
  124. package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts +13 -0
  125. package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts.map +1 -0
  126. package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts +8 -0
  127. package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts.map +1 -0
  128. package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts +13 -0
  129. package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts.map +1 -0
  130. package/dist/types/Cache/UCs/index.d.ts +10 -0
  131. package/dist/types/Cache/UCs/index.d.ts.map +1 -0
  132. package/dist/types/Cache/index.d.ts +5 -0
  133. package/dist/types/Cache/index.d.ts.map +1 -0
  134. package/dist/types/index.d.ts +1 -0
  135. package/dist/types/index.d.ts.map +1 -1
  136. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreScriptInCacheUC.js","sourceRoot":"","sources":["../../../../src/Cache/UCs/StoreScriptInCacheUC.ts"],"names":[],"mappings":";;;AAuBA,4DAIC;AA3BD,sCAKqB;AACrB,qEAAkE;AAElE,MAAsB,oBAAqB,SAAQ,kBAAW;IAU5D,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,IAAA,4BAAqB,EAAC,oBAAoB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtE,CAAC;;AAZH,oDAaC;AAZiB,yBAAI,GAAG,sBAAsB,CAAC;AAchD,SAAgB,wBAAwB,CACtC,SAAoB;IAEpB,OAAO,IAAI,uBAAuB,CAAC,SAAS,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,uBAAwB,SAAQ,oBAAoB;IACxD,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAAoB,qCAAiB,CAAC,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,GAAW,EAAE,OAAe;QAC5C,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACzC,OAAO;QACT,CAAC;QAED,IAAI,CAAC;YACH,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;YACnE,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACrE,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,IAAI,CAAC,0CAA0C,GAAG,EAAE,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,GAAW;QAK3B,MAAM,WAAW,GAAG,IAAI,CAAC,iBAAiB,CAAC;QAC3C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YACzC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;QACzE,CAAC;QAED,OAAO,WAAW,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","sourcesContent":["import {\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC,\r\n getSingletonComponent\r\n} from \"@vived/core\";\r\nimport { ScriptCacheEntity } from \"../Entities/ScriptCacheEntity\";\r\n\r\nexport abstract class StoreScriptInCacheUC extends AppObjectUC {\r\n static readonly type = \"StoreScriptInCacheUC\";\r\n\r\n abstract storeScript(url: string, content: string): Promise<void>;\r\n abstract extractScriptInfo(url: string): {\r\n appId: string;\r\n version: string;\r\n scriptPath: string;\r\n };\r\n\r\n static get(appObjects: AppObjectRepo): StoreScriptInCacheUC | undefined {\r\n return getSingletonComponent(StoreScriptInCacheUC.type, appObjects);\r\n }\r\n}\r\n\r\nexport function makeStoreScriptInCacheUC(\r\n appObject: AppObject\r\n): StoreScriptInCacheUC {\r\n return new StoreScriptInCacheUCImp(appObject);\r\n}\r\n\r\nclass StoreScriptInCacheUCImp extends StoreScriptInCacheUC {\r\n private get scriptCacheEntity(): ScriptCacheEntity | undefined {\r\n return this.getCachedSingleton<ScriptCacheEntity>(ScriptCacheEntity.type);\r\n }\r\n\r\n async storeScript(url: string, content: string): Promise<void> {\r\n const scriptCache = this.scriptCacheEntity;\r\n if (!scriptCache) {\r\n this.warn(\"ScriptCacheEntity not found\");\r\n return;\r\n }\r\n\r\n try {\r\n const { appId, version, scriptPath } = this.extractScriptInfo(url);\r\n await scriptCache.storeScript(appId, version, scriptPath, content);\r\n } catch (e) {\r\n this.warn(`Error storing script in cache for URL: ${url}`);\r\n }\r\n }\r\n\r\n extractScriptInfo(url: string): {\r\n appId: string;\r\n version: string;\r\n scriptPath: string;\r\n } {\r\n const scriptCache = this.scriptCacheEntity;\r\n if (!scriptCache) {\r\n this.warn(\"ScriptCacheEntity not found\");\r\n return { appId: \"unknown\", version: \"unknown\", scriptPath: \"unknown\" };\r\n }\r\n\r\n return scriptCache.extractScriptInfo(url);\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, StoreScriptInCacheUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ /**
3
+ * Cache Use Cases
4
+ *
5
+ * Implementation of specific cache operations
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
19
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
20
+ };
21
+ Object.defineProperty(exports, "__esModule", { value: true });
22
+ __exportStar(require("./GetScriptFromCacheUC"), exports);
23
+ __exportStar(require("./StoreScriptInCacheUC"), exports);
24
+ __exportStar(require("./GetAssetFromCacheUC"), exports);
25
+ __exportStar(require("./StoreAssetInCacheUC"), exports);
26
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Cache/UCs/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;;;;;;;;;;;;;;AAEH,yDAAuC;AACvC,yDAAuC;AACvC,wDAAsC;AACtC,wDAAsC","sourcesContent":["/**\r\n * Cache Use Cases\r\n *\r\n * Implementation of specific cache operations\r\n */\r\n\r\nexport * from \"./GetScriptFromCacheUC\";\r\nexport * from \"./StoreScriptInCacheUC\";\r\nexport * from \"./GetAssetFromCacheUC\";\r\nexport * from \"./StoreAssetInCacheUC\";\r\n"]}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Entities"), exports);
18
+ __exportStar(require("./Factories"), exports);
19
+ __exportStar(require("./Mocks"), exports);
20
+ __exportStar(require("./UCs"), exports);
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Cache/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AACA,6CAA0B;AAC1B,8CAA2B;AAC3B,0CAAuB;AACvB,wCAAqB","sourcesContent":["\r\nexport * from \"./Entities\"\r\nexport * from \"./Factories\"\r\nexport * from \"./Mocks\"\r\nexport * from \"./UCs\""]}
package/dist/cjs/index.js CHANGED
@@ -18,6 +18,7 @@ __exportStar(require("./Apps"), exports);
18
18
  __exportStar(require("./AppSandbox"), exports);
19
19
  __exportStar(require("./AssetPlugin"), exports);
20
20
  __exportStar(require("./Assets"), exports);
21
+ __exportStar(require("./Cache"), exports);
21
22
  __exportStar(require("./ChallengeResults"), exports);
22
23
  __exportStar(require("./Dialog"), exports);
23
24
  __exportStar(require("./Dispatcher"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,gDAA8B;AAC9B,2CAAyB;AACzB,qDAAmC;AACnC,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB;AACzB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,gDAA8B;AAC9B,6CAA2B;AAC3B,+CAA6B","sourcesContent":["export * from \"./Apps\";\r\nexport * from \"./AppSandbox\";\r\nexport * from \"./AssetPlugin\";\r\nexport * from \"./Assets\";\r\nexport * from \"./ChallengeResults\";\r\nexport * from \"./Dialog\";\r\nexport * from \"./Dispatcher\";\r\nexport * from \"./Events\";\r\nexport * from \"./Handler\";\r\nexport * from \"./Logger\";\r\nexport * from \"./Snackbar\";\r\nexport * from \"./StateMachine\";\r\nexport * from \"./ThemeColors\";\r\nexport * from \"./VivedAPI\";\r\nexport * from \"./ZSpaceHost\";\r\n\r\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,+CAA6B;AAC7B,gDAA8B;AAC9B,2CAAyB;AACzB,0CAAwB;AACxB,qDAAmC;AACnC,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB;AACzB,4CAA0B;AAC1B,2CAAyB;AACzB,6CAA2B;AAC3B,iDAA+B;AAC/B,gDAA8B;AAC9B,6CAA2B;AAC3B,+CAA6B","sourcesContent":["export * from \"./Apps\";\r\nexport * from \"./AppSandbox\";\r\nexport * from \"./AssetPlugin\";\r\nexport * from \"./Assets\";\r\nexport * from \"./Cache\";\r\nexport * from \"./ChallengeResults\";\r\nexport * from \"./Dialog\";\r\nexport * from \"./Dispatcher\";\r\nexport * from \"./Events\";\r\nexport * from \"./Handler\";\r\nexport * from \"./Logger\";\r\nexport * from \"./Snackbar\";\r\nexport * from \"./StateMachine\";\r\nexport * from \"./ThemeColors\";\r\nexport * from \"./VivedAPI\";\r\nexport * from \"./ZSpaceHost\";\r\n"]}
@@ -1,5 +1,6 @@
1
1
  import { getSingletonComponent, AppObjectUC } from "@vived/core";
2
2
  import { FetchAssetFileFromAPIUC } from "../../VivedAPI";
3
+ import { GetAssetFromCacheUC, StoreAssetInCacheUC } from "../../Cache";
3
4
  import { AssetRepo } from "../Entities/AssetRepo";
4
5
  import { GetAssetUC } from "./GetAssetUC";
5
6
  export class GetAssetBlobURLUC extends AppObjectUC {
@@ -12,60 +13,136 @@ export function makeGetAssetBlobURLUC(appObject) {
12
13
  return new GetAssetBlobURLUCImp(appObject);
13
14
  }
14
15
  class GetAssetBlobURLUCImp extends GetAssetBlobURLUC {
16
+ get assetRepo() {
17
+ return this.getCachedSingleton(AssetRepo.type);
18
+ }
15
19
  get fetchAssetFile() {
16
20
  return this.getCachedSingleton(FetchAssetFileFromAPIUC.type)?.doFetch;
17
21
  }
18
22
  get getAsset() {
19
23
  return this.getCachedSingleton(GetAssetUC.type)?.getAsset;
20
24
  }
25
+ get getAssetFromCache() {
26
+ return this.getCachedSingleton(GetAssetFromCacheUC.type)?.getAsset;
27
+ }
28
+ get storeAssetInCache() {
29
+ return this.getCachedSingleton(StoreAssetInCacheUC.type)?.storeAsset;
30
+ }
21
31
  constructor(appObject) {
22
32
  super(appObject, GetAssetBlobURLUC.type);
23
33
  this.getAssetBlobURL = (assetID) => {
24
34
  const assetRepo = this.assetRepo;
25
35
  const getAsset = this.getAsset;
26
36
  const fetchAssetFile = this.fetchAssetFile;
37
+ const getAssetFromCache = this.getAssetFromCache;
38
+ const storeAssetInCache = this.storeAssetInCache;
27
39
  if (!assetRepo || !getAsset || !fetchAssetFile) {
28
40
  return Promise.reject();
29
41
  }
42
+ // Check if asset already exists in memory with a blob URL
30
43
  const existing = assetRepo.get(assetID);
31
44
  if (existing && existing.blobURL) {
32
45
  return Promise.resolve(existing.blobURL);
33
46
  }
34
47
  return new Promise((resolve, reject) => {
35
48
  let fetchedAsset;
36
- getAsset(assetID)
37
- .then((asset) => {
38
- asset.isFetchingFile = true;
39
- asset.fetchError = undefined;
40
- fetchedAsset = asset;
41
- return fetchAssetFile(asset);
42
- })
43
- .then((file) => {
44
- if (fetchedAsset) {
45
- fetchedAsset.setFile(file);
46
- fetchedAsset.isFetchingFile = false;
47
- if (fetchedAsset.blobURL) {
48
- resolve(fetchedAsset.blobURL);
49
- return;
49
+ // First check if the asset exists in cache
50
+ if (getAssetFromCache) {
51
+ getAssetFromCache(assetID)
52
+ .then((cachedBlob) => {
53
+ if (cachedBlob) {
54
+ // Asset found in cache, get metadata
55
+ return getAsset(assetID).then((asset) => {
56
+ fetchedAsset = asset;
57
+ // Convert Blob to File
58
+ const filename = asset.filename || "cached-asset";
59
+ return new File([cachedBlob], filename, {
60
+ type: cachedBlob.type
61
+ });
62
+ });
63
+ }
64
+ else {
65
+ // Not in cache, get asset and fetch from API
66
+ return getAsset(assetID).then((asset) => {
67
+ asset.isFetchingFile = true;
68
+ asset.fetchError = undefined;
69
+ fetchedAsset = asset;
70
+ return fetchAssetFile(asset);
71
+ });
72
+ }
73
+ })
74
+ .then((file) => {
75
+ if (fetchedAsset) {
76
+ fetchedAsset.setFile(file);
77
+ fetchedAsset.isFetchingFile = false;
78
+ // Store the fetched file in cache if not from cache already
79
+ if (storeAssetInCache) {
80
+ storeAssetInCache(assetID, new Blob([file], { type: file.type }), file.type).catch((e) => {
81
+ this.warn(`Failed to cache asset: ${e.message}`);
82
+ });
83
+ }
84
+ if (fetchedAsset.blobURL) {
85
+ resolve(fetchedAsset.blobURL);
86
+ return;
87
+ }
50
88
  }
89
+ reject(new Error("Blob URL is empty"));
90
+ })
91
+ .catch((e) => {
92
+ // Cache error or fetch error, try normal flow
93
+ this.warn(`Cache error or fetch error: ${e.message}`);
94
+ this.fetchAssetNormally(assetID, resolve, reject);
95
+ });
96
+ }
97
+ else {
98
+ // No cache available, use normal flow
99
+ this.fetchAssetNormally(assetID, resolve, reject);
100
+ }
101
+ });
102
+ };
103
+ // Helper method for the normal asset fetching flow without cache
104
+ this.fetchAssetNormally = (assetID, resolve, reject) => {
105
+ const getAsset = this.getAsset;
106
+ const fetchAssetFile = this.fetchAssetFile;
107
+ const storeAssetInCache = this.storeAssetInCache;
108
+ if (!getAsset || !fetchAssetFile) {
109
+ reject(new Error("Required dependencies not found"));
110
+ return;
111
+ }
112
+ let fetchedAsset;
113
+ getAsset(assetID)
114
+ .then((asset) => {
115
+ asset.isFetchingFile = true;
116
+ asset.fetchError = undefined;
117
+ fetchedAsset = asset;
118
+ return fetchAssetFile(asset);
119
+ })
120
+ .then((file) => {
121
+ if (fetchedAsset) {
122
+ fetchedAsset.setFile(file);
123
+ fetchedAsset.isFetchingFile = false;
124
+ // Store the fetched file in cache if caching is available
125
+ if (storeAssetInCache) {
126
+ storeAssetInCache(assetID, new Blob([file], { type: file.type }), file.type).catch((e) => {
127
+ this.warn(`Failed to cache asset: ${e.message}`);
128
+ });
51
129
  }
52
- reject(new Error("Blob URL is empty"));
53
- })
54
- .catch((e) => {
55
- if (fetchedAsset) {
56
- fetchedAsset.fetchError = e;
57
- fetchedAsset.isFetchingFile = false;
130
+ if (fetchedAsset.blobURL) {
131
+ resolve(fetchedAsset.blobURL);
132
+ return;
58
133
  }
59
- reject(e);
60
- });
134
+ }
135
+ reject(new Error("Blob URL is empty"));
136
+ })
137
+ .catch((e) => {
138
+ if (fetchedAsset) {
139
+ fetchedAsset.fetchError = e;
140
+ fetchedAsset.isFetchingFile = false;
141
+ }
142
+ reject(e);
61
143
  });
62
144
  };
63
145
  this.appObjects.registerSingleton(this);
64
- this.assetRepo = appObject.getComponent(AssetRepo.type);
65
- if (!this.assetRepo) {
66
- this.error("UC added to an App Object that does not have AssetRepo");
67
- return;
68
- }
69
146
  }
70
147
  }
71
148
  //# sourceMappingURL=GetAssetBlobURLUC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GetAssetBlobURLUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/GetAssetBlobURLUC.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { FetchAssetFileFromAPIUC } from \"../../VivedAPI\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\nimport { AssetRepo } from \"../Entities/AssetRepo\";\r\nimport { GetAssetUC } from \"./GetAssetUC\";\r\n\r\nexport abstract class GetAssetBlobURLUC extends AppObjectUC {\r\n static type = \"GetAssetBlobURLUC\";\r\n\r\n abstract getAssetBlobURL(assetID: string): Promise<string>;\r\n\r\n static get(appObjects: AppObjectRepo): GetAssetBlobURLUC | undefined {\r\n return getSingletonComponent<GetAssetBlobURLUC>(\r\n GetAssetBlobURLUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeGetAssetBlobURLUC(appObject: AppObject): GetAssetBlobURLUC {\r\n return new GetAssetBlobURLUCImp(appObject);\r\n}\r\n\r\nclass GetAssetBlobURLUCImp extends GetAssetBlobURLUC {\r\n private assetRepo?: AssetRepo;\r\n\r\n private get fetchAssetFile() {\r\n return this.getCachedSingleton<FetchAssetFileFromAPIUC>(\r\n FetchAssetFileFromAPIUC.type\r\n )?.doFetch;\r\n }\r\n\r\n private get getAsset() {\r\n return this.getCachedSingleton<GetAssetUC>(GetAssetUC.type)?.getAsset;\r\n }\r\n\r\n getAssetBlobURL = (assetID: string): Promise<string> => {\r\n const assetRepo = this.assetRepo;\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n\r\n if (!assetRepo || !getAsset || !fetchAssetFile) {\r\n return Promise.reject();\r\n }\r\n\r\n const existing = assetRepo.get(assetID);\r\n if (existing && existing.blobURL) {\r\n return Promise.resolve(existing.blobURL);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let fetchedAsset: AssetEntity | undefined;\r\n\r\n getAsset(assetID)\r\n .then((asset) => {\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n fetchedAsset = asset;\r\n return fetchAssetFile(asset);\r\n })\r\n .then((file) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.setFile(file);\r\n fetchedAsset.isFetchingFile = false;\r\n\r\n if (fetchedAsset.blobURL) {\r\n resolve(fetchedAsset.blobURL);\r\n return;\r\n }\r\n }\r\n reject(new Error(\"Blob URL is empty\"));\r\n })\r\n .catch((e: Error) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.fetchError = e;\r\n fetchedAsset.isFetchingFile = false;\r\n }\r\n reject(e);\r\n });\r\n });\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, GetAssetBlobURLUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n\r\n this.assetRepo = appObject.getComponent<AssetRepo>(AssetRepo.type);\r\n if (!this.assetRepo) {\r\n this.error(\"UC added to an App Object that does not have AssetRepo\");\r\n return;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GetAssetBlobURLUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/GetAssetBlobURLUC.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { FetchAssetFileFromAPIUC } from \"../../VivedAPI\";\r\nimport { GetAssetFromCacheUC, StoreAssetInCacheUC } from \"../../Cache\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\nimport { AssetRepo } from \"../Entities/AssetRepo\";\r\nimport { GetAssetUC } from \"./GetAssetUC\";\r\n\r\nexport abstract class GetAssetBlobURLUC extends AppObjectUC {\r\n static type = \"GetAssetBlobURLUC\";\r\n\r\n abstract getAssetBlobURL(assetID: string): Promise<string>;\r\n\r\n static get(appObjects: AppObjectRepo): GetAssetBlobURLUC | undefined {\r\n return getSingletonComponent<GetAssetBlobURLUC>(\r\n GetAssetBlobURLUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeGetAssetBlobURLUC(appObject: AppObject): GetAssetBlobURLUC {\r\n return new GetAssetBlobURLUCImp(appObject);\r\n}\r\n\r\nclass GetAssetBlobURLUCImp extends GetAssetBlobURLUC {\r\n private get assetRepo() {\r\n return this.getCachedSingleton<AssetRepo>(AssetRepo.type);\r\n }\r\n\r\n private get fetchAssetFile() {\r\n return this.getCachedSingleton<FetchAssetFileFromAPIUC>(\r\n FetchAssetFileFromAPIUC.type\r\n )?.doFetch;\r\n }\r\n\r\n private get getAsset() {\r\n return this.getCachedSingleton<GetAssetUC>(GetAssetUC.type)?.getAsset;\r\n }\r\n\r\n private get getAssetFromCache() {\r\n return this.getCachedSingleton<GetAssetFromCacheUC>(\r\n GetAssetFromCacheUC.type\r\n )?.getAsset;\r\n }\r\n\r\n private get storeAssetInCache() {\r\n return this.getCachedSingleton<StoreAssetInCacheUC>(\r\n StoreAssetInCacheUC.type\r\n )?.storeAsset;\r\n }\r\n\r\n getAssetBlobURL = (assetID: string): Promise<string> => {\r\n const assetRepo = this.assetRepo;\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n const getAssetFromCache = this.getAssetFromCache;\r\n const storeAssetInCache = this.storeAssetInCache;\r\n\r\n if (!assetRepo || !getAsset || !fetchAssetFile) {\r\n return Promise.reject();\r\n }\r\n\r\n // Check if asset already exists in memory with a blob URL\r\n const existing = assetRepo.get(assetID);\r\n if (existing && existing.blobURL) {\r\n return Promise.resolve(existing.blobURL);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let fetchedAsset: AssetEntity | undefined;\r\n\r\n // First check if the asset exists in cache\r\n if (getAssetFromCache) {\r\n getAssetFromCache(assetID)\r\n .then((cachedBlob) => {\r\n if (cachedBlob) {\r\n // Asset found in cache, get metadata\r\n return getAsset(assetID).then((asset) => {\r\n fetchedAsset = asset;\r\n // Convert Blob to File\r\n const filename = asset.filename || \"cached-asset\";\r\n return new File([cachedBlob], filename, {\r\n type: cachedBlob.type\r\n });\r\n });\r\n } else {\r\n // Not in cache, get asset and fetch from API\r\n return getAsset(assetID).then((asset) => {\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n fetchedAsset = asset;\r\n return fetchAssetFile(asset);\r\n });\r\n }\r\n })\r\n .then((file) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.setFile(file);\r\n fetchedAsset.isFetchingFile = false;\r\n\r\n // Store the fetched file in cache if not from cache already\r\n if (storeAssetInCache) {\r\n storeAssetInCache(\r\n assetID,\r\n new Blob([file], { type: file.type }),\r\n file.type\r\n ).catch((e) => {\r\n this.warn(`Failed to cache asset: ${e.message}`);\r\n });\r\n }\r\n\r\n if (fetchedAsset.blobURL) {\r\n resolve(fetchedAsset.blobURL);\r\n return;\r\n }\r\n }\r\n reject(new Error(\"Blob URL is empty\"));\r\n })\r\n .catch((e: Error) => {\r\n // Cache error or fetch error, try normal flow\r\n this.warn(`Cache error or fetch error: ${e.message}`);\r\n this.fetchAssetNormally(assetID, resolve, reject);\r\n });\r\n } else {\r\n // No cache available, use normal flow\r\n this.fetchAssetNormally(assetID, resolve, reject);\r\n }\r\n });\r\n };\r\n\r\n // Helper method for the normal asset fetching flow without cache\r\n private fetchAssetNormally = (\r\n assetID: string,\r\n resolve: (blobURL: string) => void,\r\n reject: (error: Error) => void\r\n ): void => {\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n const storeAssetInCache = this.storeAssetInCache;\r\n\r\n if (!getAsset || !fetchAssetFile) {\r\n reject(new Error(\"Required dependencies not found\"));\r\n return;\r\n }\r\n\r\n let fetchedAsset: AssetEntity | undefined;\r\n\r\n getAsset(assetID)\r\n .then((asset) => {\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n fetchedAsset = asset;\r\n return fetchAssetFile(asset);\r\n })\r\n .then((file) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.setFile(file);\r\n fetchedAsset.isFetchingFile = false;\r\n\r\n // Store the fetched file in cache if caching is available\r\n if (storeAssetInCache) {\r\n storeAssetInCache(\r\n assetID,\r\n new Blob([file], { type: file.type }),\r\n file.type\r\n ).catch((e) => {\r\n this.warn(`Failed to cache asset: ${e.message}`);\r\n });\r\n }\r\n\r\n if (fetchedAsset.blobURL) {\r\n resolve(fetchedAsset.blobURL);\r\n return;\r\n }\r\n }\r\n reject(new Error(\"Blob URL is empty\"));\r\n })\r\n .catch((e: Error) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.fetchError = e;\r\n fetchedAsset.isFetchingFile = false;\r\n }\r\n reject(e);\r\n });\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, GetAssetBlobURLUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -1,5 +1,6 @@
1
1
  import { getSingletonComponent, AppObjectUC } from "@vived/core";
2
2
  import { FetchAssetFileFromAPIUC } from "../../VivedAPI";
3
+ import { GetAssetFromCacheUC, StoreAssetInCacheUC } from "../../Cache";
3
4
  import { AssetRepo } from "../Entities/AssetRepo";
4
5
  import { GetAssetUC } from "./GetAssetUC";
5
6
  export class GetAssetFileUC extends AppObjectUC {
@@ -12,56 +13,132 @@ export function makeGetAssetFileUC(appObject) {
12
13
  return new GetAssetFileUCImp(appObject);
13
14
  }
14
15
  class GetAssetFileUCImp extends GetAssetFileUC {
16
+ get assetRepo() {
17
+ return this.getCachedSingleton(AssetRepo.type);
18
+ }
15
19
  get fetchAssetFile() {
16
20
  return this.getCachedSingleton(FetchAssetFileFromAPIUC.type)?.doFetch;
17
21
  }
18
22
  get getAsset() {
19
23
  return this.getCachedSingleton(GetAssetUC.type)?.getAsset;
20
24
  }
25
+ get getAssetFromCache() {
26
+ return this.getCachedSingleton(GetAssetFromCacheUC.type)?.getAsset;
27
+ }
28
+ get storeAssetInCache() {
29
+ return this.getCachedSingleton(StoreAssetInCacheUC.type)?.storeAsset;
30
+ }
31
+ async tryGetFromCacheOrFetch(assetID) {
32
+ const getAssetFromCache = this.getAssetFromCache;
33
+ // If no cache is available, go straight to normal fetching
34
+ if (!getAssetFromCache) {
35
+ return this.fetchAssetDirectly(assetID);
36
+ }
37
+ // Try to get the asset from cache
38
+ const cachedBlob = await getAssetFromCache(assetID);
39
+ if (cachedBlob) {
40
+ // Asset found in cache, get metadata and create file
41
+ return this.createFileFromCachedBlob(assetID, cachedBlob);
42
+ }
43
+ else {
44
+ // Not in cache, fetch directly
45
+ return this.fetchAssetDirectly(assetID);
46
+ }
47
+ }
48
+ async createFileFromCachedBlob(assetID, cachedBlob) {
49
+ const getAsset = this.getAsset;
50
+ if (!getAsset) {
51
+ throw new Error("Required dependencies not found");
52
+ }
53
+ // Get asset metadata
54
+ const asset = await getAsset(assetID);
55
+ // Convert blob to file
56
+ const filename = asset.filename || "cached-asset";
57
+ const file = new File([cachedBlob], filename, {
58
+ type: cachedBlob.type
59
+ });
60
+ // Update asset state
61
+ asset.setFile(file);
62
+ asset.isFetchingFile = false;
63
+ return file;
64
+ }
65
+ async fetchAssetDirectly(assetID) {
66
+ const getAsset = this.getAsset;
67
+ const fetchAssetFile = this.fetchAssetFile;
68
+ if (!getAsset || !fetchAssetFile) {
69
+ throw new Error("Required dependencies not found");
70
+ }
71
+ try {
72
+ // Get asset and prepare for fetching
73
+ const asset = await getAsset(assetID);
74
+ asset.isFetchingFile = true;
75
+ asset.fetchError = undefined;
76
+ // Fetch the file
77
+ const file = await fetchAssetFile(asset);
78
+ // Update asset state
79
+ asset.setFile(file);
80
+ asset.isFetchingFile = false;
81
+ // Try to store in cache
82
+ await this.tryCacheAssetFile(assetID, file);
83
+ return file;
84
+ }
85
+ catch (error) {
86
+ await this.handleFetchError(assetID, error);
87
+ throw error;
88
+ }
89
+ }
90
+ async handleFetchError(assetID, error) {
91
+ const getAsset = this.getAsset;
92
+ if (!getAsset) {
93
+ return;
94
+ }
95
+ try {
96
+ const asset = await getAsset(assetID);
97
+ asset.fetchError = error;
98
+ asset.isFetchingFile = false;
99
+ }
100
+ catch {
101
+ // If we can't get the asset, we can't update its error state
102
+ }
103
+ }
104
+ async tryCacheAssetFile(assetID, file) {
105
+ const storeAssetInCache = this.storeAssetInCache;
106
+ if (!storeAssetInCache) {
107
+ return;
108
+ }
109
+ try {
110
+ await storeAssetInCache(assetID, new Blob([file], { type: file.type }), file.type);
111
+ }
112
+ catch (e) {
113
+ this.warn(`Failed to cache asset: ${e.message}`);
114
+ }
115
+ }
21
116
  constructor(appObject) {
22
117
  super(appObject, GetAssetFileUC.type);
23
- this.getAssetFile = (assetID) => {
118
+ this.getAssetFile = async (assetID) => {
24
119
  const assetRepo = this.assetRepo;
25
120
  const getAsset = this.getAsset;
26
121
  const fetchAssetFile = this.fetchAssetFile;
122
+ // Check for required dependencies
27
123
  if (!assetRepo || !getAsset || !fetchAssetFile) {
28
- return Promise.reject();
124
+ return Promise.reject(new Error("Missing required dependencies"));
125
+ }
126
+ // Check if asset already exists in memory with a file
127
+ const existingAsset = assetRepo.get(assetID);
128
+ if (existingAsset?.file) {
129
+ return existingAsset.file;
29
130
  }
30
- const existing = assetRepo.get(assetID);
31
- if (existing && existing.file) {
32
- return Promise.resolve(existing.file);
131
+ // Try to get from cache first, then fall back to normal fetching if needed
132
+ try {
133
+ return await this.tryGetFromCacheOrFetch(assetID);
134
+ }
135
+ catch (error) {
136
+ // If cache access failed, try the normal flow
137
+ this.warn(`Cache error: ${error.message}`);
138
+ return this.fetchAssetDirectly(assetID);
33
139
  }
34
- return new Promise((resolve, reject) => {
35
- let fetchedAsset;
36
- getAsset(assetID)
37
- .then((asset) => {
38
- asset.isFetchingFile = true;
39
- asset.fetchError = undefined;
40
- fetchedAsset = asset;
41
- return fetchAssetFile(asset);
42
- })
43
- .then((file) => {
44
- if (fetchedAsset) {
45
- fetchedAsset.setFile(file);
46
- fetchedAsset.isFetchingFile = false;
47
- }
48
- resolve(file);
49
- })
50
- .catch((e) => {
51
- if (fetchedAsset) {
52
- fetchedAsset.fetchError = e;
53
- fetchedAsset.isFetchingFile = false;
54
- }
55
- reject(e);
56
- });
57
- });
58
140
  };
59
141
  this.appObjects.registerSingleton(this);
60
- this.assetRepo = appObject.getComponent(AssetRepo.type);
61
- if (!this.assetRepo) {
62
- this.error("UC added to an App Object that does not have AssetRepo");
63
- return;
64
- }
65
142
  }
66
143
  }
67
144
  //# sourceMappingURL=GetAssetFileUC.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GetAssetFileUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/GetAssetFileUC.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { FetchAssetFileFromAPIUC } from \"../../VivedAPI\";\r\nimport { AssetEntity } from \"../Entities/AssetEntity\";\r\nimport { AssetRepo } from \"../Entities/AssetRepo\";\r\nimport { GetAssetUC } from \"./GetAssetUC\";\r\n\r\nexport abstract class GetAssetFileUC extends AppObjectUC {\r\n static type = \"GetAssetFileUC\";\r\n\r\n abstract getAssetFile(assetID: string): Promise<File>;\r\n\r\n static get(appObjects: AppObjectRepo): GetAssetFileUC | undefined {\r\n return getSingletonComponent<GetAssetFileUC>(\r\n GetAssetFileUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeGetAssetFileUC(appObject: AppObject): GetAssetFileUC {\r\n return new GetAssetFileUCImp(appObject);\r\n}\r\n\r\nclass GetAssetFileUCImp extends GetAssetFileUC {\r\n private assetRepo?: AssetRepo;\r\n\r\n private get fetchAssetFile() {\r\n return this.getCachedSingleton<FetchAssetFileFromAPIUC>(\r\n FetchAssetFileFromAPIUC.type\r\n )?.doFetch;\r\n }\r\n\r\n private get getAsset() {\r\n return this.getCachedSingleton<GetAssetUC>(GetAssetUC.type)?.getAsset;\r\n }\r\n\r\n getAssetFile = (assetID: string): Promise<File> => {\r\n const assetRepo = this.assetRepo;\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n\r\n if (!assetRepo || !getAsset || !fetchAssetFile) {\r\n return Promise.reject();\r\n }\r\n\r\n const existing = assetRepo.get(assetID);\r\n if (existing && existing.file) {\r\n return Promise.resolve(existing.file);\r\n }\r\n\r\n return new Promise((resolve, reject) => {\r\n let fetchedAsset: AssetEntity | undefined;\r\n\r\n getAsset(assetID)\r\n .then((asset) => {\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n fetchedAsset = asset;\r\n return fetchAssetFile(asset);\r\n })\r\n .then((file) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.setFile(file);\r\n fetchedAsset.isFetchingFile = false;\r\n }\r\n resolve(file);\r\n })\r\n .catch((e: Error) => {\r\n if (fetchedAsset) {\r\n fetchedAsset.fetchError = e;\r\n fetchedAsset.isFetchingFile = false;\r\n }\r\n reject(e);\r\n });\r\n });\r\n };\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, GetAssetFileUC.type);\r\n\r\n this.appObjects.registerSingleton(this);\r\n\r\n this.assetRepo = appObject.getComponent<AssetRepo>(AssetRepo.type);\r\n if (!this.assetRepo) {\r\n this.error(\"UC added to an App Object that does not have AssetRepo\");\r\n return;\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"GetAssetFileUC.js","sourceRoot":"","sources":["../../../../src/Assets/UCs/GetAssetFileUC.ts"],"names":[],"mappings":"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","sourcesContent":["import {\r\n getSingletonComponent,\r\n AppObject,\r\n AppObjectRepo,\r\n AppObjectUC\r\n} from \"@vived/core\";\r\nimport { FetchAssetFileFromAPIUC } from \"../../VivedAPI\";\r\nimport { GetAssetFromCacheUC, StoreAssetInCacheUC } from \"../../Cache\";\r\nimport { AssetRepo } from \"../Entities/AssetRepo\";\r\nimport { GetAssetUC } from \"./GetAssetUC\";\r\n\r\nexport abstract class GetAssetFileUC extends AppObjectUC {\r\n static type = \"GetAssetFileUC\";\r\n\r\n abstract getAssetFile(assetID: string): Promise<File>;\r\n\r\n static get(appObjects: AppObjectRepo): GetAssetFileUC | undefined {\r\n return getSingletonComponent<GetAssetFileUC>(\r\n GetAssetFileUC.type,\r\n appObjects\r\n );\r\n }\r\n}\r\n\r\nexport function makeGetAssetFileUC(appObject: AppObject): GetAssetFileUC {\r\n return new GetAssetFileUCImp(appObject);\r\n}\r\n\r\nclass GetAssetFileUCImp extends GetAssetFileUC {\r\n private get assetRepo() {\r\n return this.getCachedSingleton<AssetRepo>(AssetRepo.type);\r\n }\r\n\r\n private get fetchAssetFile() {\r\n return this.getCachedSingleton<FetchAssetFileFromAPIUC>(\r\n FetchAssetFileFromAPIUC.type\r\n )?.doFetch;\r\n }\r\n\r\n private get getAsset() {\r\n return this.getCachedSingleton<GetAssetUC>(GetAssetUC.type)?.getAsset;\r\n }\r\n\r\n private get getAssetFromCache() {\r\n return this.getCachedSingleton<GetAssetFromCacheUC>(\r\n GetAssetFromCacheUC.type\r\n )?.getAsset;\r\n }\r\n\r\n private get storeAssetInCache() {\r\n return this.getCachedSingleton<StoreAssetInCacheUC>(\r\n StoreAssetInCacheUC.type\r\n )?.storeAsset;\r\n }\r\n\r\n getAssetFile = async (assetID: string): Promise<File> => {\r\n const assetRepo = this.assetRepo;\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n\r\n // Check for required dependencies\r\n if (!assetRepo || !getAsset || !fetchAssetFile) {\r\n return Promise.reject(new Error(\"Missing required dependencies\"));\r\n }\r\n\r\n // Check if asset already exists in memory with a file\r\n const existingAsset = assetRepo.get(assetID);\r\n if (existingAsset?.file) {\r\n return existingAsset.file;\r\n }\r\n\r\n // Try to get from cache first, then fall back to normal fetching if needed\r\n try {\r\n return await this.tryGetFromCacheOrFetch(assetID);\r\n } catch (error) {\r\n // If cache access failed, try the normal flow\r\n this.warn(`Cache error: ${(error as Error).message}`);\r\n return this.fetchAssetDirectly(assetID);\r\n }\r\n };\r\n\r\n private async tryGetFromCacheOrFetch(assetID: string): Promise<File> {\r\n const getAssetFromCache = this.getAssetFromCache;\r\n\r\n // If no cache is available, go straight to normal fetching\r\n if (!getAssetFromCache) {\r\n return this.fetchAssetDirectly(assetID);\r\n }\r\n\r\n // Try to get the asset from cache\r\n const cachedBlob = await getAssetFromCache(assetID);\r\n\r\n if (cachedBlob) {\r\n // Asset found in cache, get metadata and create file\r\n return this.createFileFromCachedBlob(assetID, cachedBlob);\r\n } else {\r\n // Not in cache, fetch directly\r\n return this.fetchAssetDirectly(assetID);\r\n }\r\n }\r\n\r\n private async createFileFromCachedBlob(\r\n assetID: string,\r\n cachedBlob: Blob\r\n ): Promise<File> {\r\n const getAsset = this.getAsset;\r\n\r\n if (!getAsset) {\r\n throw new Error(\"Required dependencies not found\");\r\n }\r\n\r\n // Get asset metadata\r\n const asset = await getAsset(assetID);\r\n\r\n // Convert blob to file\r\n const filename = asset.filename || \"cached-asset\";\r\n const file = new File([cachedBlob], filename, {\r\n type: cachedBlob.type\r\n });\r\n\r\n // Update asset state\r\n asset.setFile(file);\r\n asset.isFetchingFile = false;\r\n\r\n return file;\r\n }\r\n\r\n private async fetchAssetDirectly(assetID: string): Promise<File> {\r\n const getAsset = this.getAsset;\r\n const fetchAssetFile = this.fetchAssetFile;\r\n\r\n if (!getAsset || !fetchAssetFile) {\r\n throw new Error(\"Required dependencies not found\");\r\n }\r\n\r\n try {\r\n // Get asset and prepare for fetching\r\n const asset = await getAsset(assetID);\r\n asset.isFetchingFile = true;\r\n asset.fetchError = undefined;\r\n\r\n // Fetch the file\r\n const file = await fetchAssetFile(asset);\r\n\r\n // Update asset state\r\n asset.setFile(file);\r\n asset.isFetchingFile = false;\r\n\r\n // Try to store in cache\r\n await this.tryCacheAssetFile(assetID, file);\r\n\r\n return file;\r\n } catch (error) {\r\n await this.handleFetchError(assetID, error as Error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async handleFetchError(assetID: string, error: Error): Promise<void> {\r\n const getAsset = this.getAsset;\r\n\r\n if (!getAsset) {\r\n return;\r\n }\r\n\r\n try {\r\n const asset = await getAsset(assetID);\r\n asset.fetchError = error;\r\n asset.isFetchingFile = false;\r\n } catch {\r\n // If we can't get the asset, we can't update its error state\r\n }\r\n }\r\n\r\n private async tryCacheAssetFile(assetID: string, file: File): Promise<void> {\r\n const storeAssetInCache = this.storeAssetInCache;\r\n\r\n if (!storeAssetInCache) {\r\n return;\r\n }\r\n\r\n try {\r\n await storeAssetInCache(\r\n assetID,\r\n new Blob([file], { type: file.type }),\r\n file.type\r\n );\r\n } catch (e) {\r\n this.warn(`Failed to cache asset: ${(e as Error).message}`);\r\n }\r\n }\r\n\r\n constructor(appObject: AppObject) {\r\n super(appObject, GetAssetFileUC.type);\r\n this.appObjects.registerSingleton(this);\r\n }\r\n}\r\n"]}
@@ -0,0 +1,10 @@
1
+ import { CacheEntity } from "../Entities/CacheEntity";
2
+ export function clearCache(appObjects) {
3
+ const cacheEntity = CacheEntity.get(appObjects);
4
+ if (!cacheEntity) {
5
+ appObjects.submitWarning("clearCache", "Unable to find CacheEntity");
6
+ return Promise.reject();
7
+ }
8
+ return cacheEntity.clear();
9
+ }
10
+ //# sourceMappingURL=clearCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clearCache.js","sourceRoot":"","sources":["../../../../src/Cache/Controllers/clearCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAEtD,MAAM,UAAU,UAAU,CAAC,UAAyB;IAClD,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,UAAU,CAAC,aAAa,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;QACrE,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC;AAC7B,CAAC","sourcesContent":["import { AppObjectRepo } from \"@vived/core\";\r\nimport { CacheEntity } from \"../Entities/CacheEntity\";\r\n\r\nexport function clearCache(appObjects: AppObjectRepo): Promise<void> {\r\n const cacheEntity = CacheEntity.get(appObjects);\r\n if (!cacheEntity) {\r\n appObjects.submitWarning(\"clearCache\", \"Unable to find CacheEntity\");\r\n return Promise.reject();\r\n }\r\n\r\n return cacheEntity.clear();\r\n}\r\n"]}
@@ -0,0 +1,2 @@
1
+ export * from "./clearCache";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/Cache/Controllers/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC","sourcesContent":["export * from \"./clearCache\";\r\n"]}
@@ -0,0 +1,90 @@
1
+ import { AppObjectEntity, getSingletonComponent } from "@vived/core";
2
+ import { CacheEntity } from "./CacheEntity";
3
+ /**
4
+ * AssetCacheEntity provides functionality for caching binary assets in the application.
5
+ * It serves as a specialized cache storage for assets such as images, videos, or other binary content.
6
+ * This entity is implemented as a singleton component and requires a CacheEntity instance to function.
7
+ */
8
+ export class AssetCacheEntity extends AppObjectEntity {
9
+ /**
10
+ * Gets the singleton instance of AssetCacheEntity from the app objects repository.
11
+ * @param appObjects - The app objects repository
12
+ * @returns The AssetCacheEntity instance if found, otherwise undefined
13
+ */
14
+ static get(appObjects) {
15
+ return getSingletonComponent(AssetCacheEntity.type, appObjects);
16
+ }
17
+ }
18
+ AssetCacheEntity.type = "AssetCacheEntity";
19
+ export function makeAssetCacheEntity(appObject) {
20
+ return new AssetCacheEntityImp(appObject);
21
+ }
22
+ class AssetCacheEntityImp extends AssetCacheEntity {
23
+ get cacheEntity() {
24
+ return this.getCachedSingleton(CacheEntity.type);
25
+ }
26
+ constructor(appObject) {
27
+ super(appObject, AssetCacheEntity.type);
28
+ this.appObjects.registerSingleton(this);
29
+ }
30
+ async getAsset(assetId) {
31
+ const cacheKey = this.generateCacheKey(assetId);
32
+ const cacheEntity = this.cacheEntity;
33
+ if (!cacheEntity) {
34
+ this.warn("CacheEntity not found");
35
+ return undefined;
36
+ }
37
+ try {
38
+ const { value, metadata } = await cacheEntity.get(cacheKey);
39
+ if (value instanceof Blob) {
40
+ return value;
41
+ }
42
+ // Handle case where the value is stored as an ArrayBuffer
43
+ if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {
44
+ const contentType = metadata?.contentType || "application/octet-stream";
45
+ return new Blob([value], { type: contentType });
46
+ }
47
+ this.warn("Cached asset is not a Blob or ArrayBuffer");
48
+ return undefined;
49
+ }
50
+ catch (e) {
51
+ return undefined;
52
+ }
53
+ }
54
+ async storeAsset(assetId, content, contentType) {
55
+ const cacheKey = this.generateCacheKey(assetId);
56
+ const cacheEntity = this.cacheEntity;
57
+ if (!cacheEntity) {
58
+ this.warn("CacheEntity not found");
59
+ return;
60
+ }
61
+ const metadata = {
62
+ assetId,
63
+ timestamp: Date.now(),
64
+ contentType: contentType || content.type
65
+ };
66
+ await cacheEntity.store(cacheKey, content, metadata);
67
+ }
68
+ async hasAsset(assetId) {
69
+ const cacheKey = this.generateCacheKey(assetId);
70
+ const cacheEntity = this.cacheEntity;
71
+ if (!cacheEntity) {
72
+ this.warn("CacheEntity not found");
73
+ return false;
74
+ }
75
+ return await cacheEntity.has(cacheKey);
76
+ }
77
+ async invalidateAsset(assetId) {
78
+ const cacheEntity = this.cacheEntity;
79
+ if (!cacheEntity) {
80
+ this.warn("CacheEntity not found");
81
+ return;
82
+ }
83
+ const cacheKey = this.generateCacheKey(assetId);
84
+ await cacheEntity.invalidate(cacheKey);
85
+ }
86
+ generateCacheKey(assetId) {
87
+ return `asset:${assetId}`;
88
+ }
89
+ }
90
+ //# sourceMappingURL=AssetCacheEntity.js.map