arcane-os 0.1.0-dev.5

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 (248) hide show
  1. package/CHANGELOG.md +154 -0
  2. package/COMMERCIAL-LICENSE.md +13 -0
  3. package/LICENSE +661 -0
  4. package/NOTICE +70 -0
  5. package/README.md +448 -0
  6. package/bin/arcane-test.mjs +741 -0
  7. package/bin/arcane.mjs +5 -0
  8. package/docs/architecture.md +234 -0
  9. package/docs/compatibility.md +36 -0
  10. package/docs/event-manager.md +166 -0
  11. package/docs/platform-targets.md +108 -0
  12. package/docs/publishing.md +203 -0
  13. package/docs/reference/README.md +117 -0
  14. package/docs/reference/arcane-ollama.md +288 -0
  15. package/docs/reference/availability-and-normalization.md +123 -0
  16. package/docs/reference/behavioral-testing.md +86 -0
  17. package/docs/reference/cli.md +569 -0
  18. package/docs/reference/core/README.md +62 -0
  19. package/docs/reference/core/arcane-ai-contracts.md +873 -0
  20. package/docs/reference/core/arcane-api.md +601 -0
  21. package/docs/reference/core/arcane-entities.md +65 -0
  22. package/docs/reference/core/arcane-events.md +134 -0
  23. package/docs/reference/core/ollama-module.md +181 -0
  24. package/docs/reference/core/reference/arcane-api/ai-and-ollama.md +1909 -0
  25. package/docs/reference/core/reference/arcane-api/applications-terminal-capabilities.md +1057 -0
  26. package/docs/reference/core/reference/arcane-api/core-and-events.md +320 -0
  27. package/docs/reference/core/reference/arcane-api/filesystem-storage-preferences-appearance.md +610 -0
  28. package/docs/reference/core/reference/arcane-api/namespaces.md +1157 -0
  29. package/docs/reference/core/reference/arcane-api/platform-installation-users-system.md +1423 -0
  30. package/docs/reference/core/reference/arcane-api/session-provisioning-diagnostics-development.md +315 -0
  31. package/docs/reference/event-manager.md +957 -0
  32. package/docs/reference/inventory/package-api.json +2632 -0
  33. package/docs/reference/inventory/runtime-components.json +934 -0
  34. package/docs/reference/inventory/runtime-entities.json +26 -0
  35. package/docs/reference/inventory/runtime-modules.json +1249 -0
  36. package/docs/reference/protocols.md +242 -0
  37. package/docs/reference/runtime-components.md +1098 -0
  38. package/docs/reference/runtime-entities.md +303 -0
  39. package/docs/reference/runtime-modules.md +2010 -0
  40. package/docs/reference/sdk-api.md +4901 -0
  41. package/docs/roadmap.md +79 -0
  42. package/docs/work-amplification.md +124 -0
  43. package/node_modules/event-pubsub/CHANGELOG.md +55 -0
  44. package/node_modules/event-pubsub/MIGRATION.md +70 -0
  45. package/node_modules/event-pubsub/README.md +363 -0
  46. package/node_modules/event-pubsub/SECURITY.md +37 -0
  47. package/node_modules/event-pubsub/index.js +141 -0
  48. package/node_modules/event-pubsub/licence +21 -0
  49. package/node_modules/event-pubsub/package.json +59 -0
  50. package/node_modules/strong-type/README.md +408 -0
  51. package/node_modules/strong-type/assets/strong-type-header.png +0 -0
  52. package/node_modules/strong-type/index.js +1151 -0
  53. package/node_modules/strong-type/licence +21 -0
  54. package/node_modules/strong-type/node.js +125 -0
  55. package/node_modules/strong-type/package.json +61 -0
  56. package/package.json +95 -0
  57. package/runtime/ARCANE_RUNTIME_RELEASE.json +791 -0
  58. package/runtime/arcane/components/app-bar.html +468 -0
  59. package/runtime/arcane/components/assistant-panel.html +715 -0
  60. package/runtime/arcane/components/calculator.html +8 -0
  61. package/runtime/arcane/components/chart.html +655 -0
  62. package/runtime/arcane/components/chat.html +1225 -0
  63. package/runtime/arcane/components/conversation-view.html +13 -0
  64. package/runtime/arcane/components/dashboard-config.html +341 -0
  65. package/runtime/arcane/components/data-maintenance.html +112 -0
  66. package/runtime/arcane/components/data-view.html +92 -0
  67. package/runtime/arcane/components/directory-picker.html +197 -0
  68. package/runtime/arcane/components/document-inspector.html +252 -0
  69. package/runtime/arcane/components/file-drop.html +264 -0
  70. package/runtime/arcane/components/file-inspector.html +293 -0
  71. package/runtime/arcane/components/file-manager.html +1715 -0
  72. package/runtime/arcane/components/header.html +142 -0
  73. package/runtime/arcane/components/integration-settings.html +14 -0
  74. package/runtime/arcane/components/local-ai-status.html +360 -0
  75. package/runtime/arcane/components/markdown-document.html +1048 -0
  76. package/runtime/arcane/components/markdown-editor.html +360 -0
  77. package/runtime/arcane/components/media-embed.html +8 -0
  78. package/runtime/arcane/components/modal.html +402 -0
  79. package/runtime/arcane/components/output-panel.html +259 -0
  80. package/runtime/arcane/components/preferences-form.html +135 -0
  81. package/runtime/arcane/components/record-timeline.html +105 -0
  82. package/runtime/arcane/components/relationship-board.html +116 -0
  83. package/runtime/arcane/components/screen-capture.html +8 -0
  84. package/runtime/arcane/components/source-code-viewer.html +441 -0
  85. package/runtime/arcane/components/source-explanation.html +124 -0
  86. package/runtime/arcane/components/speech.html +365 -0
  87. package/runtime/arcane/components/summary-strip.html +177 -0
  88. package/runtime/arcane/components/table.html +77 -0
  89. package/runtime/arcane/components/task-progress.html +282 -0
  90. package/runtime/arcane/components/terminal-workspace.html +65 -0
  91. package/runtime/arcane/components/theme-editor.html +41 -0
  92. package/runtime/arcane/components/theme-switcher.html +46 -0
  93. package/runtime/arcane/components/unified-inbox.html +20 -0
  94. package/runtime/arcane/components/voice-transcription.html +476 -0
  95. package/runtime/arcane/components/weather-widget.html +8 -0
  96. package/runtime/arcane/components/web-navigator.html +239 -0
  97. package/runtime/arcane/css/communications.css +1 -0
  98. package/runtime/arcane/css/dashboard-config.css +45 -0
  99. package/runtime/arcane/css/document-site.css +981 -0
  100. package/runtime/arcane/css/layout.css +438 -0
  101. package/runtime/arcane/css/primitives.css +321 -0
  102. package/runtime/arcane/css/theme.css +112 -0
  103. package/runtime/arcane/css/utility-workspace.css +1 -0
  104. package/runtime/arcane/entities/ApiModelRecord.js +20 -0
  105. package/runtime/arcane/entities/Calculation.js +13 -0
  106. package/runtime/arcane/entities/Chat.js +581 -0
  107. package/runtime/arcane/entities/CommunicationMessage.js +29 -0
  108. package/runtime/arcane/entities/CommunicationThread.js +21 -0
  109. package/runtime/arcane/entities/Document.js +10 -0
  110. package/runtime/arcane/entities/File.js +143 -0
  111. package/runtime/arcane/entities/Image.js +135 -0
  112. package/runtime/arcane/entities/IntentEnvelope.js +834 -0
  113. package/runtime/arcane/entities/Preference.js +83 -0
  114. package/runtime/arcane/entities/TWiNPolicyDecision.js +1092 -0
  115. package/runtime/arcane/entities/TerminalSession.js +46 -0
  116. package/runtime/arcane/entities/Theme.js +107 -0
  117. package/runtime/arcane/entities/User.js +1046 -0
  118. package/runtime/arcane/entities/Weather.js +23 -0
  119. package/runtime/arcane/img/arcane-os-everywhere.png +0 -0
  120. package/runtime/arcane/img/arrow-left.png +0 -0
  121. package/runtime/arcane/img/arrow-right.png +0 -0
  122. package/runtime/arcane/img/doc.svg +5 -0
  123. package/runtime/arcane/img/folder.svg +4 -0
  124. package/runtime/arcane/img/image.svg +5 -0
  125. package/runtime/arcane/img/refresh.png +0 -0
  126. package/runtime/arcane/img/send.svg +9 -0
  127. package/runtime/arcane/img/trash.svg +5 -0
  128. package/runtime/arcane/img/upload.svg +5 -0
  129. package/runtime/arcane/modules/AI.js +2048 -0
  130. package/runtime/arcane/modules/AIPreferenceRuntime.js +32 -0
  131. package/runtime/arcane/modules/AIPreferenceTuple.js +92 -0
  132. package/runtime/arcane/modules/AIResponseLength.js +42 -0
  133. package/runtime/arcane/modules/AIResponseURLPolicy.js +626 -0
  134. package/runtime/arcane/modules/AnsiText.js +53 -0
  135. package/runtime/arcane/modules/ApiModelDatabase.js +25 -0
  136. package/runtime/arcane/modules/AppDataScope.js +245 -0
  137. package/runtime/arcane/modules/AppearancePreferences.js +28 -0
  138. package/runtime/arcane/modules/ArcaneCommunicationBridge.js +22 -0
  139. package/runtime/arcane/modules/ArcaneNavigationPolicy.js +135 -0
  140. package/runtime/arcane/modules/ArcaneNetworkPolicy.js +255 -0
  141. package/runtime/arcane/modules/AsyncBoundary.js +161 -0
  142. package/runtime/arcane/modules/BrowserTestSuite.js +326 -0
  143. package/runtime/arcane/modules/CalculatorEngine.js +20 -0
  144. package/runtime/arcane/modules/CaseEvidenceIndexer.js +134 -0
  145. package/runtime/arcane/modules/ChartLibrary.js +35 -0
  146. package/runtime/arcane/modules/ChatRecords.js +13 -0
  147. package/runtime/arcane/modules/CommunicationAppController.js +43 -0
  148. package/runtime/arcane/modules/CommunicationHub.js +16 -0
  149. package/runtime/arcane/modules/CommunicationPreferences.js +13 -0
  150. package/runtime/arcane/modules/CommunicationProviderRegistry.js +16 -0
  151. package/runtime/arcane/modules/ComponentContracts.js +586 -0
  152. package/runtime/arcane/modules/ConfiguredAIChatSession.js +288 -0
  153. package/runtime/arcane/modules/ConversationActionItems.js +488 -0
  154. package/runtime/arcane/modules/ConversationClosingReport.js +274 -0
  155. package/runtime/arcane/modules/ConversationTimebox.js +527 -0
  156. package/runtime/arcane/modules/CoreLocalModelCatalog.js +255 -0
  157. package/runtime/arcane/modules/DBLS.js +171 -0
  158. package/runtime/arcane/modules/DBOPFS.js +1154 -0
  159. package/runtime/arcane/modules/DBOPFSWorker.js +116 -0
  160. package/runtime/arcane/modules/DataMaintenance.js +91 -0
  161. package/runtime/arcane/modules/DevelopmentWorkspace.js +74 -0
  162. package/runtime/arcane/modules/DirectoryPicker.js +109 -0
  163. package/runtime/arcane/modules/DocumentNavigation.js +223 -0
  164. package/runtime/arcane/modules/Errors.js +1025 -0
  165. package/runtime/arcane/modules/GifEncoder.js +29 -0
  166. package/runtime/arcane/modules/HTMLImport.js +114 -0
  167. package/runtime/arcane/modules/InMemoryCommunicationProvider.js +14 -0
  168. package/runtime/arcane/modules/IsolatedModelQuestionRunner.js +275 -0
  169. package/runtime/arcane/modules/LocalAIReadiness.js +870 -0
  170. package/runtime/arcane/modules/LocalAIReadinessController.js +156 -0
  171. package/runtime/arcane/modules/MD.js +111 -0
  172. package/runtime/arcane/modules/Mail.js +352 -0
  173. package/runtime/arcane/modules/MailTransport.mjs +180 -0
  174. package/runtime/arcane/modules/Marked.min.js +71 -0
  175. package/runtime/arcane/modules/MemoryRecords.js +44 -0
  176. package/runtime/arcane/modules/MessageAdvisory.js +38 -0
  177. package/runtime/arcane/modules/ModelDefinition.js +189 -0
  178. package/runtime/arcane/modules/Ollama.js +74 -0
  179. package/runtime/arcane/modules/OllamaModelIdentifier.js +21 -0
  180. package/runtime/arcane/modules/OllamaSettings.js +24 -0
  181. package/runtime/arcane/modules/OpenMeteoWeatherProvider.js +14 -0
  182. package/runtime/arcane/modules/PreferenceStore.js +109 -0
  183. package/runtime/arcane/modules/QRCode.min.js +1 -0
  184. package/runtime/arcane/modules/Questionnaire.js +61 -0
  185. package/runtime/arcane/modules/RecordLinkIndex.js +24 -0
  186. package/runtime/arcane/modules/RecordPassageIndex.js +222 -0
  187. package/runtime/arcane/modules/RecordReviewStore.js +94 -0
  188. package/runtime/arcane/modules/RevocableProjectionLedger.js +1623 -0
  189. package/runtime/arcane/modules/RiskSignalAnalyzer.js +37 -0
  190. package/runtime/arcane/modules/ScamRiskPolicy.js +62 -0
  191. package/runtime/arcane/modules/ScopedOPFSCache.js +183 -0
  192. package/runtime/arcane/modules/ScreenCapture.js +20 -0
  193. package/runtime/arcane/modules/SpeechPlayback.js +581 -0
  194. package/runtime/arcane/modules/StaticDocumentCatalog.js +1248 -0
  195. package/runtime/arcane/modules/SystemAppearance.js +20 -0
  196. package/runtime/arcane/modules/SystemPlatformPresentation.js +51 -0
  197. package/runtime/arcane/modules/SystemToolRegistry.js +28 -0
  198. package/runtime/arcane/modules/TerminalClient.js +52 -0
  199. package/runtime/arcane/modules/TerminalCommandRegistry.js +50 -0
  200. package/runtime/arcane/modules/ThemeBootstrap.js +26 -0
  201. package/runtime/arcane/modules/ThemeManager.js +131 -0
  202. package/runtime/arcane/modules/TimeGuard.js +149 -0
  203. package/runtime/arcane/modules/ToolCallRouter.js +83 -0
  204. package/runtime/arcane/modules/WaitForComponent.js +102 -0
  205. package/runtime/arcane/modules/YouTubeMedia.js +16 -0
  206. package/runtime/arcane/modules/uPlot.LICENSE.txt +21 -0
  207. package/runtime/arcane/modules/uPlot.iife.min.js +2 -0
  208. package/runtime/arcane/modules/uPlot.min.css +1 -0
  209. package/runtime/arcane/security/arcane-network-policy.json +6 -0
  210. package/runtime/strong-type/index.js +352 -0
  211. package/runtime/strong-type/licence +21 -0
  212. package/runtime/strong-type/package.json +45 -0
  213. package/schemas/arcane-app-bundle.schema.json +125 -0
  214. package/schemas/arcane-app.schema.json +329 -0
  215. package/schemas/arcane-lock.schema.json +86 -0
  216. package/schemas/arcane-package.schema.json +224 -0
  217. package/schemas/cli-event.schema.json +122 -0
  218. package/schemas/event-stack.schema.json +152 -0
  219. package/schemas/native-build-plan.schema.json +176 -0
  220. package/schemas/target-adapter.schema.json +117 -0
  221. package/src/app-descriptor.mjs +500 -0
  222. package/src/cli/main.mjs +561 -0
  223. package/src/constants.mjs +31 -0
  224. package/src/dev-server.mjs +718 -0
  225. package/src/doctor.mjs +315 -0
  226. package/src/dom-event-instrumentation.mjs +594 -0
  227. package/src/errors.mjs +75 -0
  228. package/src/event-manager.mjs +1342 -0
  229. package/src/event-queue.mjs +138 -0
  230. package/src/events.mjs +219 -0
  231. package/src/index.mjs +177 -0
  232. package/src/integrated-provider-loader.mjs +432 -0
  233. package/src/native-plan.mjs +698 -0
  234. package/src/native-provider-loader.mjs +1126 -0
  235. package/src/packager/core.mjs +2691 -0
  236. package/src/process.mjs +353 -0
  237. package/src/release-bundle.mjs +2523 -0
  238. package/src/repository.mjs +90 -0
  239. package/src/runtime.mjs +452 -0
  240. package/src/scaffold.mjs +380 -0
  241. package/src/targets/index.mjs +436 -0
  242. package/src/templates/assets/app-icon.png +0 -0
  243. package/src/templates/workspace-template.mjs +388 -0
  244. package/src/testing-loader.mjs +9 -0
  245. package/src/testing.mjs +427 -0
  246. package/src/toolchain.mjs +1335 -0
  247. package/src/update-check.mjs +307 -0
  248. package/src/workspace.mjs +449 -0
@@ -0,0 +1,143 @@
1
+ import Is from '../../node_modules/strong-type/index.js';
2
+ import '../modules/DBOPFS.js';
3
+ import MD from '../modules/MD.js';
4
+
5
+ const is = new Is(false);
6
+
7
+ class FileEntity {
8
+
9
+ #tableName = '';
10
+
11
+ #fileName = '';
12
+
13
+ persist = true;
14
+
15
+ constructor(fileName = '', tableName = '') {
16
+ if (!is.string(tableName) || !tableName) {
17
+ tableName = this.#tableName;
18
+ }
19
+ if (!is.string(fileName) || !fileName) {
20
+ fileName = this.#fileName;
21
+ }
22
+
23
+ this.#tableName = tableName;
24
+ this.#fileName = fileName;
25
+
26
+ return this;
27
+ }
28
+
29
+ get tableName() {
30
+ return this.#tableName;
31
+ }
32
+
33
+ set tableName(value) {
34
+ return this.#tableName=value;
35
+ }
36
+
37
+ get fileName() {
38
+ return this.#fileName;
39
+ }
40
+
41
+ set fileName(fileName = '') {
42
+ if (!is.string(fileName) || !fileName) {
43
+ return this.#fileName;
44
+ }
45
+
46
+ this.#fileName = fileName;
47
+ return this.#fileName;
48
+ }
49
+
50
+ async open() {
51
+ const file = await dbopfs.readFile(
52
+ this.#tableName,
53
+ this.#fileName
54
+ );
55
+
56
+ const mimeTypes ={
57
+ "json": "application/json",
58
+ "jsonl": "application/x-ndjson",
59
+ "ndjson": "application/x-ndjson",
60
+
61
+ "txt": "text/plain;charset=utf-8",
62
+ "log": "text/plain;charset=utf-8",
63
+ "md": "text/markdown;charset=utf-8",
64
+
65
+ "html": "text/html;charset=utf-8",
66
+ "css": "text/css;charset=utf-8",
67
+ "js": "text/javascript;charset=utf-8",
68
+ "mjs": "text/javascript;charset=utf-8",
69
+
70
+ "png": "image/png",
71
+ "jpg": "image/jpeg",
72
+ "jpeg": "image/jpeg",
73
+ "webp": "image/webp",
74
+ "svg": "image/svg+xml",
75
+
76
+ "pdf": "application/pdf"
77
+ };
78
+
79
+ file.ext=this.fileName.slice(
80
+ (this.fileName.lastIndexOf('.')+1)
81
+ ).toLowerCase();
82
+
83
+ const mime=mimeTypes[file.ext]||
84
+ file.type||
85
+ 'application/octet-stream';
86
+
87
+ file.mime=mime;
88
+ file.parsed=null;
89
+
90
+ switch(file.ext){
91
+ case 'json':
92
+ file.parsed=await file.text();
93
+
94
+ try{
95
+ file.parsed=JSON.parse(file.parsed.trim());
96
+ }catch(e){}
97
+ break;
98
+ case 'jsonl':
99
+ case 'ndjson':
100
+ const rows=(await file.text()).split('\n');
101
+ const parsedRows=[];
102
+
103
+ for(let i=0;i<rows.length;i++){
104
+ try{
105
+ parsedRows.push(
106
+ JSON.parse(rows[i].trim())
107
+ );
108
+ }catch(e){}
109
+ }
110
+
111
+ file.parsed=parsedRows;
112
+ break;
113
+ case 'md':
114
+ file.parsed=new MD(await file.text()).rendered;
115
+ break;
116
+ case 'txt':
117
+ case 'log':
118
+ case 'html':
119
+ case 'css':
120
+ case 'js':
121
+ case 'mjs':
122
+ file.parsed=await file.text();
123
+ break;
124
+ }
125
+
126
+ return file;
127
+ }
128
+
129
+ async save(fileData) {
130
+ // fileData can be a File, Blob, ArrayBuffer, TypedArray like Uint8Array,
131
+ // DataView, or string. Other values such as numbers, booleans, arrays,
132
+ // or plain objects should be converted first with String(), JSON.stringify(),
133
+ // or wrapped in a Blob before writing.
134
+ return dbopfs.writeFile(
135
+ this.#tableName,
136
+ this.#fileName,
137
+ fileData
138
+ );
139
+ }
140
+
141
+ }
142
+
143
+ export default FileEntity;
@@ -0,0 +1,135 @@
1
+ import FileEntity from './File.js';
2
+
3
+ /**
4
+ * ImageEntity
5
+ *
6
+ * Image-focused file entity built on top of DocumentEntity.
7
+ *
8
+ * Storage table:
9
+ * - OPFS `images`
10
+ *
11
+ * Adds:
12
+ * - image type validation helpers
13
+ * - base64 data URL conversion
14
+ * - blob URL creation/revocation helpers
15
+ */
16
+ class ImageEntity extends FileEntity {
17
+
18
+ /**
19
+ * Create an ImageEntity targeting OPFS `images` table.
20
+ *
21
+ * @param {string} fileName Optional existing OPFS file key.
22
+ */
23
+ constructor(fileName = '', tableName='images') {
24
+ super(fileName, tableName);
25
+ return this;
26
+ }
27
+
28
+ /**
29
+ * Check whether a file is an accepted image type.
30
+ *
31
+ * Accepts MIME `image/*` or extension: png, jpg/jpeg, svg.
32
+ *
33
+ * @param {File|Object} file
34
+ * @returns {boolean}
35
+ */
36
+ static isImageFile(file) {
37
+ if (!file || typeof file.name !== 'string') {
38
+ return false;
39
+ }
40
+
41
+ const hasImageMime = typeof file.type === 'string' && file.type.startsWith('image/');
42
+ const hasImageExt = /\.(png|jpe?g|svg)$/i.test(file.name);
43
+
44
+ return hasImageMime || hasImageExt;
45
+ }
46
+
47
+ /**
48
+ * Strict PNG validator for PNG-only workflows.
49
+ *
50
+ * @param {File|Object} file
51
+ * @returns {boolean}
52
+ */
53
+ static isPNGFile(file) {
54
+ if (!file || typeof file.name !== 'string') {
55
+ return false;
56
+ }
57
+
58
+ const lowerName = file.name.toLowerCase();
59
+ const hasPngMime = typeof file.type === 'string' && file.type.toLowerCase() === 'image/png';
60
+ const hasPngExt = lowerName.endsWith('.png');
61
+
62
+ return hasPngMime || hasPngExt;
63
+ }
64
+
65
+ /**
66
+ * Upload and persist an image file.
67
+ *
68
+ * @param {File} file
69
+ * @returns {Promise<ImageEntity>}
70
+ */
71
+ async uploadFile(file) {
72
+ if (!ImageEntity.isImageFile(file)) {
73
+ throw new Error('ImageEntity.uploadFile expects an image file');
74
+ }
75
+
76
+ return super.uploadFile(file);
77
+ }
78
+
79
+ /**
80
+ * Save raw bytes to OPFS for current `storedAs` key.
81
+ *
82
+ * @param {ArrayBuffer} buffer
83
+ * @returns {Promise<void>}
84
+ */
85
+ async save(buffer) {
86
+ return super.save(buffer);
87
+ }
88
+
89
+ /**
90
+ * Convert stored image into a base64 data URL string.
91
+ *
92
+ * @returns {Promise<string>}
93
+ */
94
+ async getBase64DataURL() {
95
+ const file = await this.getFile();
96
+
97
+ return await new Promise(
98
+ (resolve, reject) => {
99
+ const reader = new FileReader();
100
+
101
+ reader.onload = () => resolve(reader.result);
102
+ reader.onerror = () => reject(reader.error || new Error('Failed to encode image as data URL'));
103
+
104
+ reader.readAsDataURL(file);
105
+ }
106
+ );
107
+ }
108
+
109
+ /**
110
+ * Create an object URL for the stored image.
111
+ *
112
+ * Caller should revoke the URL when done.
113
+ *
114
+ * @returns {Promise<string>}
115
+ */
116
+ async getBlobURL() {
117
+ const file = await this.getFile();
118
+ return URL.createObjectURL(file);
119
+ }
120
+
121
+ /**
122
+ * Revoke a blob URL created for image preview.
123
+ *
124
+ * @param {string} url
125
+ * @returns {void}
126
+ */
127
+ static revokeBlobURL(url = '') {
128
+ if (typeof url === 'string' && url.startsWith('blob:')) {
129
+ URL.revokeObjectURL(url);
130
+ }
131
+ }
132
+
133
+ }
134
+
135
+ export default ImageEntity;