@vived/host 4.7.0 → 4.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js +104 -27
- package/dist/cjs/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
- package/dist/cjs/Assets/UCs/GetAssetFileUC.js +111 -34
- package/dist/cjs/Assets/UCs/GetAssetFileUC.js.map +1 -1
- package/dist/cjs/Cache/Controllers/clearCache.js +13 -0
- package/dist/cjs/Cache/Controllers/clearCache.js.map +1 -0
- package/dist/cjs/Cache/Controllers/index.js +18 -0
- package/dist/cjs/Cache/Controllers/index.js.map +1 -0
- package/dist/cjs/Cache/Entities/AssetCacheEntity.js +95 -0
- package/dist/cjs/Cache/Entities/AssetCacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Entities/CacheEntity.js +54 -0
- package/dist/cjs/Cache/Entities/CacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Entities/ScriptCacheEntity.js +137 -0
- package/dist/cjs/Cache/Entities/ScriptCacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Entities/index.js +25 -0
- package/dist/cjs/Cache/Entities/index.js.map +1 -0
- package/dist/cjs/Cache/Factories/index.js +18 -0
- package/dist/cjs/Cache/Factories/index.js.map +1 -0
- package/dist/cjs/Cache/Factories/setupCache.js +27 -0
- package/dist/cjs/Cache/Factories/setupCache.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockCacheEntity.js +22 -0
- package/dist/cjs/Cache/Mocks/MockCacheEntity.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js +19 -0
- package/dist/cjs/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js +22 -0
- package/dist/cjs/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js +17 -0
- package/dist/cjs/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js +22 -0
- package/dist/cjs/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/Mocks/index.js +22 -0
- package/dist/cjs/Cache/Mocks/index.js.map +1 -0
- package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js +40 -0
- package/dist/cjs/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js +49 -0
- package/dist/cjs/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js +39 -0
- package/dist/cjs/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js +48 -0
- package/dist/cjs/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
- package/dist/cjs/Cache/UCs/index.js +26 -0
- package/dist/cjs/Cache/UCs/index.js.map +1 -0
- package/dist/cjs/Cache/index.js +21 -0
- package/dist/cjs/Cache/index.js.map +1 -0
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js +104 -27
- package/dist/esm/Assets/UCs/GetAssetBlobURLUC.js.map +1 -1
- package/dist/esm/Assets/UCs/GetAssetFileUC.js +111 -34
- package/dist/esm/Assets/UCs/GetAssetFileUC.js.map +1 -1
- package/dist/esm/Cache/Controllers/clearCache.js +10 -0
- package/dist/esm/Cache/Controllers/clearCache.js.map +1 -0
- package/dist/esm/Cache/Controllers/index.js +2 -0
- package/dist/esm/Cache/Controllers/index.js.map +1 -0
- package/dist/esm/Cache/Entities/AssetCacheEntity.js +90 -0
- package/dist/esm/Cache/Entities/AssetCacheEntity.js.map +1 -0
- package/dist/esm/Cache/Entities/CacheEntity.js +49 -0
- package/dist/esm/Cache/Entities/CacheEntity.js.map +1 -0
- package/dist/esm/Cache/Entities/ScriptCacheEntity.js +132 -0
- package/dist/esm/Cache/Entities/ScriptCacheEntity.js.map +1 -0
- package/dist/esm/Cache/Entities/index.js +9 -0
- package/dist/esm/Cache/Entities/index.js.map +1 -0
- package/dist/esm/Cache/Factories/index.js +2 -0
- package/dist/esm/Cache/Factories/index.js.map +1 -0
- package/dist/esm/Cache/Factories/setupCache.js +24 -0
- package/dist/esm/Cache/Factories/setupCache.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockCacheEntity.js +17 -0
- package/dist/esm/Cache/Mocks/MockCacheEntity.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js +14 -0
- package/dist/esm/Cache/Mocks/MockGetAssetFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js +17 -0
- package/dist/esm/Cache/Mocks/MockGetScriptFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js +12 -0
- package/dist/esm/Cache/Mocks/MockStoreAssetInCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js +17 -0
- package/dist/esm/Cache/Mocks/MockStoreScriptInCacheUC.js.map +1 -0
- package/dist/esm/Cache/Mocks/index.js +6 -0
- package/dist/esm/Cache/Mocks/index.js.map +1 -0
- package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js +35 -0
- package/dist/esm/Cache/UCs/GetAssetFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js +44 -0
- package/dist/esm/Cache/UCs/GetScriptFromCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js +34 -0
- package/dist/esm/Cache/UCs/StoreAssetInCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js +43 -0
- package/dist/esm/Cache/UCs/StoreScriptInCacheUC.js.map +1 -0
- package/dist/esm/Cache/UCs/index.js +10 -0
- package/dist/esm/Cache/UCs/index.js.map +1 -0
- package/dist/esm/Cache/index.js +5 -0
- package/dist/esm/Cache/index.js.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/types/Assets/UCs/GetAssetBlobURLUC.d.ts.map +1 -1
- package/dist/types/Cache/Controllers/clearCache.d.ts +3 -0
- package/dist/types/Cache/Controllers/clearCache.d.ts.map +1 -0
- package/dist/types/Cache/Controllers/index.d.ts +2 -0
- package/dist/types/Cache/Controllers/index.d.ts.map +1 -0
- package/dist/types/Cache/Entities/AssetCacheEntity.d.ts +43 -0
- package/dist/types/Cache/Entities/AssetCacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Entities/CacheEntity.d.ts +57 -0
- package/dist/types/Cache/Entities/CacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts +64 -0
- package/dist/types/Cache/Entities/ScriptCacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Entities/index.d.ts +9 -0
- package/dist/types/Cache/Entities/index.d.ts.map +1 -0
- package/dist/types/Cache/Factories/index.d.ts +2 -0
- package/dist/types/Cache/Factories/index.d.ts.map +1 -0
- package/dist/types/Cache/Factories/setupCache.d.ts +6 -0
- package/dist/types/Cache/Factories/setupCache.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockCacheEntity.d.ts +13 -0
- package/dist/types/Cache/Mocks/MockCacheEntity.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts +8 -0
- package/dist/types/Cache/Mocks/MockGetAssetFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts +9 -0
- package/dist/types/Cache/Mocks/MockGetScriptFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts +8 -0
- package/dist/types/Cache/Mocks/MockStoreAssetInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts +9 -0
- package/dist/types/Cache/Mocks/MockStoreScriptInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/Mocks/index.d.ts +6 -0
- package/dist/types/Cache/Mocks/index.d.ts.map +1 -0
- package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts +8 -0
- package/dist/types/Cache/UCs/GetAssetFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts +13 -0
- package/dist/types/Cache/UCs/GetScriptFromCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts +8 -0
- package/dist/types/Cache/UCs/StoreAssetInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts +13 -0
- package/dist/types/Cache/UCs/StoreScriptInCacheUC.d.ts.map +1 -0
- package/dist/types/Cache/UCs/index.d.ts +10 -0
- package/dist/types/Cache/UCs/index.d.ts.map +1 -0
- package/dist/types/Cache/index.d.ts +5 -0
- package/dist/types/Cache/index.d.ts.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- 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);
|
package/dist/cjs/index.js.map
CHANGED
|
@@ -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
|
|
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
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (fetchedAsset) {
|
|
56
|
-
fetchedAsset.fetchError = e;
|
|
57
|
-
fetchedAsset.isFetchingFile = false;
|
|
130
|
+
if (fetchedAsset.blobURL) {
|
|
131
|
+
resolve(fetchedAsset.blobURL);
|
|
132
|
+
return;
|
|
58
133
|
}
|
|
59
|
-
|
|
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":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAgB,iBAAkB,SAAQ,WAAW;IAKzD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,iBAAiB,CAAC,IAAI,EACtB,UAAU,CACX,CAAC;IACJ,CAAC;;AATM,sBAAI,GAAG,mBAAmB,CAAC;AAYpC,MAAM,UAAU,qBAAqB,CAAC,SAAoB;IACxD,OAAO,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,oBAAqB,SAAQ,iBAAiB;IAGlD,IAAY,cAAc;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAC5B,uBAAuB,CAAC,IAAI,CAC7B,EAAE,OAAO,CAAC;IACb,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,kBAAkB,CAAa,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACxE,CAAC;IAgDD,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QA/C3C,oBAAe,GAAG,CAAC,OAAe,EAAmB,EAAE;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAE3C,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC/C,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC;YAED,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,YAAqC,CAAC;gBAE1C,QAAQ,CAAC,OAAO,CAAC;qBACd,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;oBACd,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;oBAC5B,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;oBAC7B,YAAY,GAAG,KAAK,CAAC;oBACrB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC,CAAC;qBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBACb,IAAI,YAAY,EAAE,CAAC;wBACjB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;wBAC3B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;wBAEpC,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;4BACzB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;4BAC9B,OAAO;wBACT,CAAC;oBACH,CAAC;oBACD,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;gBACzC,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;oBAClB,IAAI,YAAY,EAAE,CAAC;wBACjB,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC;wBAC5B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;oBACtC,CAAC;oBACD,MAAM,CAAC,CAAC,CAAC,CAAC;gBACZ,CAAC,CAAC,CAAC;YACP,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAExC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC,YAAY,CAAY,SAAS,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,wDAAwD,CAAC,CAAC;YACrE,OAAO;QACT,CAAC;IACH,CAAC;CACF","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":"AAAA,OAAO,EACL,qBAAqB,EAGrB,WAAW,EACZ,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,OAAgB,iBAAkB,SAAQ,WAAW;IAKzD,MAAM,CAAC,GAAG,CAAC,UAAyB;QAClC,OAAO,qBAAqB,CAC1B,iBAAiB,CAAC,IAAI,EACtB,UAAU,CACX,CAAC;IACJ,CAAC;;AATM,sBAAI,GAAG,mBAAmB,CAAC;AAYpC,MAAM,UAAU,qBAAqB,CAAC,SAAoB;IACxD,OAAO,IAAI,oBAAoB,CAAC,SAAS,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,oBAAqB,SAAQ,iBAAiB;IAClD,IAAY,SAAS;QACnB,OAAO,IAAI,CAAC,kBAAkB,CAAY,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,CAAC;IAED,IAAY,cAAc;QACxB,OAAO,IAAI,CAAC,kBAAkB,CAC5B,uBAAuB,CAAC,IAAI,CAC7B,EAAE,OAAO,CAAC;IACb,CAAC;IAED,IAAY,QAAQ;QAClB,OAAO,IAAI,CAAC,kBAAkB,CAAa,UAAU,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;IACxE,CAAC;IAED,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAC5B,mBAAmB,CAAC,IAAI,CACzB,EAAE,QAAQ,CAAC;IACd,CAAC;IAED,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,kBAAkB,CAC5B,mBAAmB,CAAC,IAAI,CACzB,EAAE,UAAU,CAAC;IAChB,CAAC;IAyID,YAAY,SAAoB;QAC9B,KAAK,CAAC,SAAS,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAxI3C,oBAAe,GAAG,CAAC,OAAe,EAAmB,EAAE;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YACjD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAEjD,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;gBAC/C,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,CAAC;YAED,0DAA0D;YAC1D,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,IAAI,QAAQ,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;gBACjC,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAC3C,CAAC;YAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBACrC,IAAI,YAAqC,CAAC;gBAE1C,2CAA2C;gBAC3C,IAAI,iBAAiB,EAAE,CAAC;oBACtB,iBAAiB,CAAC,OAAO,CAAC;yBACvB,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE;wBACnB,IAAI,UAAU,EAAE,CAAC;4BACf,qCAAqC;4BACrC,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gCACtC,YAAY,GAAG,KAAK,CAAC;gCACrB,uBAAuB;gCACvB,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,IAAI,cAAc,CAAC;gCAClD,OAAO,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,EAAE,QAAQ,EAAE;oCACtC,IAAI,EAAE,UAAU,CAAC,IAAI;iCACtB,CAAC,CAAC;4BACL,CAAC,CAAC,CAAC;wBACL,CAAC;6BAAM,CAAC;4BACN,6CAA6C;4BAC7C,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gCACtC,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gCAC5B,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gCAC7B,YAAY,GAAG,KAAK,CAAC;gCACrB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;4BAC/B,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC,CAAC;yBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;wBACb,IAAI,YAAY,EAAE,CAAC;4BACjB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;4BAC3B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;4BAEpC,4DAA4D;4BAC5D,IAAI,iBAAiB,EAAE,CAAC;gCACtB,iBAAiB,CACf,OAAO,EACP,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EACrC,IAAI,CAAC,IAAI,CACV,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;oCACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;gCACnD,CAAC,CAAC,CAAC;4BACL,CAAC;4BAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;gCACzB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gCAC9B,OAAO;4BACT,CAAC;wBACH,CAAC;wBACD,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;oBACzC,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;wBAClB,8CAA8C;wBAC9C,IAAI,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBACtD,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;oBACpD,CAAC,CAAC,CAAC;gBACP,CAAC;qBAAM,CAAC;oBACN,sCAAsC;oBACtC,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,iEAAiE;QACzD,uBAAkB,GAAG,CAC3B,OAAe,EACf,OAAkC,EAClC,MAA8B,EACxB,EAAE;YACR,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;YAC3C,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,CAAC;YAEjD,IAAI,CAAC,QAAQ,IAAI,CAAC,cAAc,EAAE,CAAC;gBACjC,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YAED,IAAI,YAAqC,CAAC;YAE1C,QAAQ,CAAC,OAAO,CAAC;iBACd,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,KAAK,CAAC,cAAc,GAAG,IAAI,CAAC;gBAC5B,KAAK,CAAC,UAAU,GAAG,SAAS,CAAC;gBAC7B,YAAY,GAAG,KAAK,CAAC;gBACrB,OAAO,cAAc,CAAC,KAAK,CAAC,CAAC;YAC/B,CAAC,CAAC;iBACD,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACb,IAAI,YAAY,EAAE,CAAC;oBACjB,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;oBAC3B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;oBAEpC,0DAA0D;oBAC1D,IAAI,iBAAiB,EAAE,CAAC;wBACtB,iBAAiB,CACf,OAAO,EACP,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,EACrC,IAAI,CAAC,IAAI,CACV,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE;4BACZ,IAAI,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;wBACnD,CAAC,CAAC,CAAC;oBACL,CAAC;oBAED,IAAI,YAAY,CAAC,OAAO,EAAE,CAAC;wBACzB,OAAO,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;wBAC9B,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACzC,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,CAAQ,EAAE,EAAE;gBAClB,IAAI,YAAY,EAAE,CAAC;oBACjB,YAAY,CAAC,UAAU,GAAG,CAAC,CAAC;oBAC5B,YAAY,CAAC,cAAc,GAAG,KAAK,CAAC;gBACtC,CAAC;gBACD,MAAM,CAAC,CAAC,CAAC,CAAC;YACZ,CAAC,CAAC,CAAC;QACP,CAAC,CAAC;QAKA,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC1C,CAAC;CACF","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
|
-
|
|
31
|
-
|
|
32
|
-
return
|
|
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 @@
|
|
|
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
|