winui-svelte 0.0.6 → 0.0.7

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 (281) hide show
  1. package/API.md +390 -3
  2. package/README.md +4 -0
  3. package/dist/app/launch-command.d.ts +11 -6
  4. package/dist/app/launch-command.d.ts.map +1 -1
  5. package/dist/app/launch-command.js +16 -5
  6. package/dist/app/launch-command.js.map +1 -1
  7. package/dist/app/tray-instance.d.ts +4 -3
  8. package/dist/app/tray-instance.d.ts.map +1 -1
  9. package/dist/app/tray-instance.js +7 -5
  10. package/dist/app/tray-instance.js.map +1 -1
  11. package/dist/automation/backend.d.ts +51 -0
  12. package/dist/automation/backend.d.ts.map +1 -0
  13. package/dist/automation/backend.js +5 -0
  14. package/dist/automation/backend.js.map +1 -0
  15. package/dist/automation/client.d.ts +97 -0
  16. package/dist/automation/client.d.ts.map +1 -0
  17. package/dist/automation/client.js +203 -0
  18. package/dist/automation/client.js.map +1 -0
  19. package/dist/automation/ids.d.ts +90 -0
  20. package/dist/automation/ids.d.ts.map +1 -0
  21. package/dist/automation/ids.js +84 -0
  22. package/dist/automation/ids.js.map +1 -0
  23. package/dist/automation/index.d.ts +13 -0
  24. package/dist/automation/index.d.ts.map +1 -0
  25. package/dist/automation/index.js +8 -0
  26. package/dist/automation/index.js.map +1 -0
  27. package/dist/automation/native.d.ts +11 -0
  28. package/dist/automation/native.d.ts.map +1 -0
  29. package/dist/automation/native.js +595 -0
  30. package/dist/automation/native.js.map +1 -0
  31. package/dist/automation/text.d.ts +50 -0
  32. package/dist/automation/text.d.ts.map +1 -0
  33. package/dist/automation/text.js +110 -0
  34. package/dist/automation/text.js.map +1 -0
  35. package/dist/automation/with-client.d.ts +13 -0
  36. package/dist/automation/with-client.d.ts.map +1 -0
  37. package/dist/automation/with-client.js +19 -0
  38. package/dist/automation/with-client.js.map +1 -0
  39. package/dist/automation/worker-job.d.ts +32 -0
  40. package/dist/automation/worker-job.d.ts.map +1 -0
  41. package/dist/automation/worker-job.js +69 -0
  42. package/dist/automation/worker-job.js.map +1 -0
  43. package/dist/automation/worker.d.ts +44 -0
  44. package/dist/automation/worker.d.ts.map +1 -0
  45. package/dist/automation/worker.js +70 -0
  46. package/dist/automation/worker.js.map +1 -0
  47. package/dist/bindings/.dynwinrt-managed +1 -1
  48. package/dist/chrome/context-menus/context-menu-schema.d.ts +4 -4
  49. package/dist/chrome/notifications/notification-schema.d.ts +2 -2
  50. package/dist/components/hand-written/Window.svelte +2 -0
  51. package/dist/components/window-context.d.ts +14 -0
  52. package/dist/components/window-context.d.ts.map +1 -0
  53. package/dist/components/window-context.js +20 -0
  54. package/dist/components/window-context.js.map +1 -0
  55. package/dist/downloads/chrome-downloads.d.ts +8 -0
  56. package/dist/downloads/chrome-downloads.d.ts.map +1 -1
  57. package/dist/downloads/chrome-downloads.js +35 -6
  58. package/dist/downloads/chrome-downloads.js.map +1 -1
  59. package/dist/downloads/download-record.d.ts +3 -2
  60. package/dist/downloads/download-record.d.ts.map +1 -1
  61. package/dist/downloads/download-record.js.map +1 -1
  62. package/dist/downloads/download-transfer.d.ts.map +1 -1
  63. package/dist/downloads/download-transfer.js +3 -3
  64. package/dist/downloads/download-transfer.js.map +1 -1
  65. package/dist/downloads/download-types.d.ts +3 -1
  66. package/dist/downloads/download-types.d.ts.map +1 -1
  67. package/dist/downloads/download-types.js.map +1 -1
  68. package/dist/downloads/fetch-to-file.d.ts +11 -6
  69. package/dist/downloads/fetch-to-file.d.ts.map +1 -1
  70. package/dist/downloads/fetch-to-file.js +45 -16
  71. package/dist/downloads/fetch-to-file.js.map +1 -1
  72. package/dist/downloads/taskbar-progress.d.ts +3 -18
  73. package/dist/downloads/taskbar-progress.d.ts.map +1 -1
  74. package/dist/downloads/taskbar-progress.js +1 -38
  75. package/dist/downloads/taskbar-progress.js.map +1 -1
  76. package/dist/enums.d.ts +1 -0
  77. package/dist/enums.d.ts.map +1 -1
  78. package/dist/enums.js +1 -0
  79. package/dist/enums.js.map +1 -1
  80. package/dist/forms/form-field-props.d.ts +2 -2
  81. package/dist/progress/TaskbarProgress.d.svelte.ts +6 -0
  82. package/dist/progress/TaskbarProgress.svelte +32 -0
  83. package/dist/progress/aggregate.d.ts +23 -0
  84. package/dist/progress/aggregate.d.ts.map +1 -0
  85. package/dist/progress/aggregate.js +59 -0
  86. package/dist/progress/aggregate.js.map +1 -0
  87. package/dist/progress/core.d.ts +14 -0
  88. package/dist/progress/core.d.ts.map +1 -0
  89. package/dist/progress/core.js +8 -0
  90. package/dist/progress/core.js.map +1 -0
  91. package/dist/progress/index.d.ts +5 -0
  92. package/dist/progress/index.d.ts.map +1 -0
  93. package/dist/progress/index.js +4 -0
  94. package/dist/progress/index.js.map +1 -0
  95. package/dist/progress/progress-event.d.ts +18 -0
  96. package/dist/progress/progress-event.d.ts.map +1 -0
  97. package/dist/progress/progress-event.js +19 -0
  98. package/dist/progress/progress-event.js.map +1 -0
  99. package/dist/progress/progress-operation.d.ts +163 -0
  100. package/dist/progress/progress-operation.d.ts.map +1 -0
  101. package/dist/progress/progress-operation.js +356 -0
  102. package/dist/progress/progress-operation.js.map +1 -0
  103. package/dist/progress/progress-registry.d.ts +89 -0
  104. package/dist/progress/progress-registry.d.ts.map +1 -0
  105. package/dist/progress/progress-registry.js +187 -0
  106. package/dist/progress/progress-registry.js.map +1 -0
  107. package/dist/progress/progress-source.d.ts +46 -0
  108. package/dist/progress/progress-source.d.ts.map +1 -0
  109. package/dist/progress/progress-source.js +31 -0
  110. package/dist/progress/progress-source.js.map +1 -0
  111. package/dist/progress/progress-state.d.ts +54 -0
  112. package/dist/progress/progress-state.d.ts.map +1 -0
  113. package/dist/progress/progress-state.js +35 -0
  114. package/dist/progress/progress-state.js.map +1 -0
  115. package/dist/progress/progress-text.d.ts +10 -0
  116. package/dist/progress/progress-text.d.ts.map +1 -0
  117. package/dist/progress/progress-text.js +23 -0
  118. package/dist/progress/progress-text.js.map +1 -0
  119. package/dist/progress/scoped-source.d.ts +31 -0
  120. package/dist/progress/scoped-source.d.ts.map +1 -0
  121. package/dist/progress/scoped-source.js +46 -0
  122. package/dist/progress/scoped-source.js.map +1 -0
  123. package/dist/progress/taskbar-progress-props.d.ts +15 -0
  124. package/dist/progress/taskbar-progress-props.d.ts.map +1 -0
  125. package/dist/progress/taskbar-progress-props.js +2 -0
  126. package/dist/progress/taskbar-progress-props.js.map +1 -0
  127. package/dist/progress/taskbar-progress.d.ts +44 -0
  128. package/dist/progress/taskbar-progress.d.ts.map +1 -0
  129. package/dist/progress/taskbar-progress.js +62 -0
  130. package/dist/progress/taskbar-progress.js.map +1 -0
  131. package/dist/progress/track-operation.d.ts +36 -0
  132. package/dist/progress/track-operation.d.ts.map +1 -0
  133. package/dist/progress/track-operation.js +53 -0
  134. package/dist/progress/track-operation.js.map +1 -0
  135. package/dist/tray/menu-svelte/TrayMenuOperations.d.svelte.ts +6 -0
  136. package/dist/tray/menu-svelte/TrayMenuOperations.svelte +33 -0
  137. package/dist/tray/menu-svelte/TrayMenuProgress.d.svelte.ts +6 -0
  138. package/dist/tray/menu-svelte/TrayMenuProgress.svelte +28 -0
  139. package/dist/tray/menu-svelte/index.d.ts +3 -1
  140. package/dist/tray/menu-svelte/index.d.ts.map +1 -1
  141. package/dist/tray/menu-svelte/index.js +2 -0
  142. package/dist/tray/menu-svelte/index.js.map +1 -1
  143. package/dist/tray/menu-svelte/menu-node.d.ts +5 -5
  144. package/dist/tray/menu-svelte/menu-props.d.ts +16 -0
  145. package/dist/tray/menu-svelte/menu-props.d.ts.map +1 -1
  146. package/dist/tray/menu-svelte/operation-ids.d.ts +8 -0
  147. package/dist/tray/menu-svelte/operation-ids.d.ts.map +1 -0
  148. package/dist/tray/menu-svelte/operation-ids.js +20 -0
  149. package/dist/tray/menu-svelte/operation-ids.js.map +1 -0
  150. package/dist/tray/native.d.ts +6 -1
  151. package/dist/tray/native.d.ts.map +1 -1
  152. package/dist/tray/native.js +22 -32
  153. package/dist/tray/native.js.map +1 -1
  154. package/dist/tray/pointer-share.d.ts +27 -0
  155. package/dist/tray/pointer-share.d.ts.map +1 -0
  156. package/dist/tray/pointer-share.js +61 -0
  157. package/dist/tray/pointer-share.js.map +1 -0
  158. package/dist/tray/standalone/index.d.ts +1 -0
  159. package/dist/tray/standalone/index.d.ts.map +1 -1
  160. package/dist/tray/standalone/index.js +1 -0
  161. package/dist/tray/standalone/index.js.map +1 -1
  162. package/dist/tray/standalone/menu-theme.d.ts +38 -0
  163. package/dist/tray/standalone/menu-theme.d.ts.map +1 -0
  164. package/dist/tray/standalone/menu-theme.js +74 -0
  165. package/dist/tray/standalone/menu-theme.js.map +1 -0
  166. package/dist/tray/standalone/native.d.ts +5 -1
  167. package/dist/tray/standalone/native.d.ts.map +1 -1
  168. package/dist/tray/standalone/native.js +5 -1
  169. package/dist/tray/standalone/native.js.map +1 -1
  170. package/dist/tray/standalone/standalone-tray.d.ts +13 -0
  171. package/dist/tray/standalone/standalone-tray.d.ts.map +1 -1
  172. package/dist/tray/standalone/standalone-tray.js +23 -1
  173. package/dist/tray/standalone/standalone-tray.js.map +1 -1
  174. package/dist/tray/tray-core.d.ts.map +1 -1
  175. package/dist/tray/tray-core.js +1 -0
  176. package/dist/tray/tray-core.js.map +1 -1
  177. package/dist/tray/tray-manifest.d.ts +44 -4
  178. package/dist/tray/tray-manifest.d.ts.map +1 -1
  179. package/dist/tray/tray-manifest.js +48 -4
  180. package/dist/tray/tray-manifest.js.map +1 -1
  181. package/dist/vite/entrypoints/build-tray.d.ts +3 -1
  182. package/dist/vite/entrypoints/build-tray.d.ts.map +1 -1
  183. package/dist/vite/entrypoints/build-tray.js +22 -16
  184. package/dist/vite/entrypoints/build-tray.js.map +1 -1
  185. package/dist/vite/entrypoints/extract-tray.d.ts +7 -6
  186. package/dist/vite/entrypoints/extract-tray.d.ts.map +1 -1
  187. package/dist/vite/entrypoints/extract-tray.js +35 -15
  188. package/dist/vite/entrypoints/extract-tray.js.map +1 -1
  189. package/dist/vite/entrypoints/tray-module.d.ts +2 -1
  190. package/dist/vite/entrypoints/tray-module.d.ts.map +1 -1
  191. package/dist/vite/entrypoints/tray-module.js +8 -4
  192. package/dist/vite/entrypoints/tray-module.js.map +1 -1
  193. package/dist/web-apis/file-read.d.ts +14 -0
  194. package/dist/web-apis/file-read.d.ts.map +1 -0
  195. package/dist/web-apis/file-read.js +37 -0
  196. package/dist/web-apis/file-read.js.map +1 -0
  197. package/dist/web-apis/file-system.d.ts +9 -0
  198. package/dist/web-apis/file-system.d.ts.map +1 -1
  199. package/dist/web-apis/file-system.js +24 -0
  200. package/dist/web-apis/file-system.js.map +1 -1
  201. package/dist/win32-foreground.d.ts +14 -0
  202. package/dist/win32-foreground.d.ts.map +1 -0
  203. package/dist/win32-foreground.js +71 -0
  204. package/dist/win32-foreground.js.map +1 -0
  205. package/dist/window/create-window.d.ts +1 -1
  206. package/dist/window/create-window.d.ts.map +1 -1
  207. package/dist/window/create-window.js +1 -0
  208. package/dist/window/create-window.js.map +1 -1
  209. package/dist/window/foreground-filter.d.ts +71 -0
  210. package/dist/window/foreground-filter.d.ts.map +1 -0
  211. package/dist/window/foreground-filter.js +108 -0
  212. package/dist/window/foreground-filter.js.map +1 -0
  213. package/dist/window/foreground-native.d.ts +25 -0
  214. package/dist/window/foreground-native.d.ts.map +1 -0
  215. package/dist/window/foreground-native.js +88 -0
  216. package/dist/window/foreground-native.js.map +1 -0
  217. package/dist/window/foreground.d.ts +49 -0
  218. package/dist/window/foreground.d.ts.map +1 -0
  219. package/dist/window/foreground.js +78 -0
  220. package/dist/window/foreground.js.map +1 -0
  221. package/dist/window/window-host.svelte.d.ts +1 -1
  222. package/dist/window/window-host.svelte.d.ts.map +1 -1
  223. package/package.json +18 -1
  224. package/src/app/launch-command.ts +19 -5
  225. package/src/app/tray-instance.ts +7 -5
  226. package/src/automation/backend.ts +56 -0
  227. package/src/automation/client.ts +327 -0
  228. package/src/automation/ids.ts +97 -0
  229. package/src/automation/index.ts +23 -0
  230. package/src/automation/native.ts +689 -0
  231. package/src/automation/text.ts +174 -0
  232. package/src/automation/with-client.ts +20 -0
  233. package/src/automation/worker-job.ts +97 -0
  234. package/src/automation/worker.ts +116 -0
  235. package/src/components/window-context.ts +23 -0
  236. package/src/downloads/chrome-downloads.ts +46 -6
  237. package/src/downloads/download-record.ts +3 -2
  238. package/src/downloads/download-transfer.ts +3 -3
  239. package/src/downloads/download-types.ts +3 -0
  240. package/src/downloads/fetch-to-file.ts +47 -17
  241. package/src/downloads/taskbar-progress.ts +3 -49
  242. package/src/enums.ts +1 -0
  243. package/src/progress/TaskbarProgress.d.svelte.ts +6 -0
  244. package/src/progress/aggregate.ts +68 -0
  245. package/src/progress/core.ts +13 -0
  246. package/src/progress/index.ts +4 -0
  247. package/src/progress/progress-event.ts +25 -0
  248. package/src/progress/progress-operation.ts +469 -0
  249. package/src/progress/progress-registry.ts +224 -0
  250. package/src/progress/progress-source.ts +66 -0
  251. package/src/progress/progress-state.ts +72 -0
  252. package/src/progress/progress-text.ts +27 -0
  253. package/src/progress/scoped-source.ts +56 -0
  254. package/src/progress/taskbar-progress-props.ts +18 -0
  255. package/src/progress/taskbar-progress.ts +80 -0
  256. package/src/progress/track-operation.ts +81 -0
  257. package/src/tray/menu-svelte/TrayMenuOperations.d.svelte.ts +6 -0
  258. package/src/tray/menu-svelte/TrayMenuProgress.d.svelte.ts +6 -0
  259. package/src/tray/menu-svelte/index.ts +4 -0
  260. package/src/tray/menu-svelte/menu-props.ts +20 -0
  261. package/src/tray/menu-svelte/operation-ids.ts +21 -0
  262. package/src/tray/native.ts +29 -33
  263. package/src/tray/pointer-share.ts +71 -0
  264. package/src/tray/standalone/index.ts +1 -0
  265. package/src/tray/standalone/menu-theme.ts +90 -0
  266. package/src/tray/standalone/native.ts +5 -1
  267. package/src/tray/standalone/standalone-tray.ts +43 -1
  268. package/src/tray/tray-core.ts +1 -0
  269. package/src/tray/tray-manifest.ts +53 -4
  270. package/src/vite/entrypoints/build-tray.ts +23 -16
  271. package/src/vite/entrypoints/extract-tray.ts +41 -15
  272. package/src/vite/entrypoints/tray-module.ts +8 -4
  273. package/src/web-apis/file-read.ts +43 -0
  274. package/src/web-apis/file-system.ts +33 -0
  275. package/src/win32-foreground.ts +76 -0
  276. package/src/window/create-window.ts +2 -0
  277. package/src/window/foreground-filter.ts +167 -0
  278. package/src/window/foreground-native.ts +93 -0
  279. package/src/window/foreground.ts +106 -0
  280. package/src/window/window-host.svelte.ts +1 -1
  281. package/web-types.json +1 -1
@@ -0,0 +1,356 @@
1
+ import { OperationProgressEvent } from "./progress-event.js";
2
+ import { defaultProgressRegistry } from "./progress-registry.js";
3
+ import { CHANGE_EVENT, reactiveReads, subscribeTo } from "./progress-source.js";
4
+ import { fractionOf, isUnfinished, ProgressState } from "./progress-state.js";
5
+ import { HandlerEventTarget } from "../web-apis/event-handlers.js";
6
+ const HANDLED_EVENTS = ["loadstart", "progress", "load", "error", "abort", "loadend"];
7
+ const FINAL_EVENTS = {
8
+ [ProgressState.COMPLETE]: "load",
9
+ [ProgressState.ERROR]: "error",
10
+ [ProgressState.CANCELED]: "abort"
11
+ };
12
+ function markHandled() {
13
+ // Attached to the result so that an operation nobody awaits raises no unhandled rejection
14
+ }
15
+ /**
16
+ * One long operation (a download, a file read, a copy, an OCR pass), in one
17
+ * object that is
18
+ * - a promise: `await operation` gives the result and rejects on failure or
19
+ * cancel;
20
+ * - an `EventTarget` with the platform events: `loadstart`, `progress`,
21
+ * `load`, `error`, `abort` and `loadend` as `OperationProgressEvent`s, as
22
+ * `XMLHttpRequest` and `FileReader` fire them (and `onprogress` and kin as
23
+ * properties or options);
24
+ * - observable: `value`, `loaded`, `total`, `state`, `isIndeterminate`,
25
+ * `showPaused` and `showError` are reactive in markup (`barProps` spreads
26
+ * onto a `ProgressBar`), and it is a Svelte store (`$operation`);
27
+ * - cancelable: `cancel()`, or abort the `signal` given to it.
28
+ *
29
+ * It lists itself in the app-wide registry, so a mounted `<TaskbarProgress />`
30
+ * shows it with no setup. An errored operation can `resume` (a retry); the
31
+ * other final states are final.
32
+ */
33
+ export class ProgressOperation extends HandlerEventTarget {
34
+ /** Aborts when the operation is canceled, or when the `signal` given to the constructor aborts. */
35
+ signal;
36
+ /** The group it was given, to scope a registry by. */
37
+ group;
38
+ /** Settles with the operation: the value given to `complete`, or the reason of `fail` or `cancel`. */
39
+ result;
40
+ controller = new AbortController();
41
+ reads = reactiveReads(this);
42
+ resolveResult;
43
+ rejectResult;
44
+ current;
45
+ currentState = ProgressState.IDLE;
46
+ currentLoaded = 0;
47
+ currentTotal;
48
+ currentError;
49
+ currentLabel;
50
+ constructor(options = {}) {
51
+ super();
52
+ const deferred = Promise.withResolvers();
53
+ this.result = deferred.promise;
54
+ this.resolveResult = deferred.resolve;
55
+ this.rejectResult = deferred.reject;
56
+ this.result.catch(markHandled);
57
+ this.group = options.group;
58
+ this.currentLabel = options.label;
59
+ this.currentTotal = options.total;
60
+ const { signal: outside } = options;
61
+ this.signal = outside === undefined ? this.controller.signal : AbortSignal.any([this.controller.signal, outside]);
62
+ this.current = this.build();
63
+ for (const type of HANDLED_EVENTS) {
64
+ const handler = options[`on${type}`];
65
+ const isHandled = handler !== undefined;
66
+ if (isHandled) {
67
+ this.addEventListener(type, event => {
68
+ const isProgressEvent = event instanceof OperationProgressEvent;
69
+ if (isProgressEvent) {
70
+ handler(event);
71
+ }
72
+ });
73
+ }
74
+ }
75
+ const isListed = options.registry !== false;
76
+ if (isListed) {
77
+ (options.registry ?? defaultProgressRegistry()).add(this);
78
+ }
79
+ if (this.signal.aborted) {
80
+ this.settle(ProgressState.CANCELED);
81
+ return;
82
+ }
83
+ this.signal.addEventListener("abort", () => this.settle(ProgressState.CANCELED), { once: true });
84
+ }
85
+ get snapshot() {
86
+ return this.current;
87
+ }
88
+ get state() {
89
+ this.reads();
90
+ return this.current.state;
91
+ }
92
+ get loaded() {
93
+ this.reads();
94
+ return this.current.loaded;
95
+ }
96
+ get total() {
97
+ this.reads();
98
+ return this.current.total;
99
+ }
100
+ /** How far along, 0 to 1; `ProgressBar`'s `value` with a `maximum` of 1. Reactive. */
101
+ get value() {
102
+ this.reads();
103
+ return this.current.value;
104
+ }
105
+ get isIndeterminate() {
106
+ this.reads();
107
+ return this.current.isIndeterminate;
108
+ }
109
+ get showPaused() {
110
+ this.reads();
111
+ return this.current.showPaused;
112
+ }
113
+ get showError() {
114
+ this.reads();
115
+ return this.current.showError;
116
+ }
117
+ /** Why it failed, once `state` is `error`. */
118
+ get error() {
119
+ this.reads();
120
+ return this.currentError;
121
+ }
122
+ /** What the operation is. Reactive. */
123
+ get label() {
124
+ this.reads();
125
+ return this.currentLabel;
126
+ }
127
+ set label(label) {
128
+ this.currentLabel = label;
129
+ this.publish();
130
+ }
131
+ /** The values a `ProgressBar` takes, for `<ProgressBar {...operation.barProps} />`. Reactive. */
132
+ get barProps() {
133
+ this.reads();
134
+ const { current } = this;
135
+ return {
136
+ value: current.value,
137
+ maximum: 1,
138
+ isIndeterminate: current.isIndeterminate,
139
+ showPaused: current.showPaused,
140
+ showError: current.showError
141
+ };
142
+ }
143
+ get onloadstart() {
144
+ return this.getHandler("loadstart");
145
+ }
146
+ set onloadstart(handler) {
147
+ this.setHandler({
148
+ type: "loadstart",
149
+ handler
150
+ });
151
+ }
152
+ get onprogress() {
153
+ return this.getHandler("progress");
154
+ }
155
+ set onprogress(handler) {
156
+ this.setHandler({
157
+ type: "progress",
158
+ handler
159
+ });
160
+ }
161
+ get onload() {
162
+ return this.getHandler("load");
163
+ }
164
+ set onload(handler) {
165
+ this.setHandler({
166
+ type: "load",
167
+ handler
168
+ });
169
+ }
170
+ get onerror() {
171
+ return this.getHandler("error");
172
+ }
173
+ set onerror(handler) {
174
+ this.setHandler({
175
+ type: "error",
176
+ handler
177
+ });
178
+ }
179
+ get onabort() {
180
+ return this.getHandler("abort");
181
+ }
182
+ set onabort(handler) {
183
+ this.setHandler({
184
+ type: "abort",
185
+ handler
186
+ });
187
+ }
188
+ get onloadend() {
189
+ return this.getHandler("loadend");
190
+ }
191
+ set onloadend(handler) {
192
+ this.setHandler({
193
+ type: "loadend",
194
+ handler
195
+ });
196
+ }
197
+ /**
198
+ * Makes the operation awaitable: `await operation` is `await operation.result`.
199
+ *
200
+ * @param onfulfilled - Called with the result.
201
+ * @param onrejected - Called with the reason of a failure or cancel.
202
+ * @returns The promise of what the callbacks return.
203
+ */
204
+ /* eslint-disable no-restricted-syntax -- then() has the two parameters PromiseLike dictates */
205
+ // oxlint-disable-next-line unicorn/no-thenable -- an operation is awaitable on purpose
206
+ then(onfulfilled, onrejected) {
207
+ return this.result.then(onfulfilled, onrejected);
208
+ }
209
+ /* eslint-enable no-restricted-syntax */
210
+ subscribe(run) {
211
+ return subscribeTo({
212
+ source: this,
213
+ run
214
+ });
215
+ }
216
+ /** Marks the work as begun and fires `loadstart`; nothing happens unless the operation is idle. */
217
+ start() {
218
+ const isIdle = this.currentState === ProgressState.IDLE;
219
+ if (!isIdle) {
220
+ return;
221
+ }
222
+ this.currentState = ProgressState.RUNNING;
223
+ this.publish();
224
+ this.fire("loadstart");
225
+ }
226
+ /**
227
+ * Reports the work done and fires `progress`. Ignored unless the operation
228
+ * runs.
229
+ *
230
+ * @param options - How much is done, and the whole size when it became known.
231
+ */
232
+ update({ loaded, total }) {
233
+ const isRunning = this.currentState === ProgressState.RUNNING;
234
+ if (!isRunning) {
235
+ return;
236
+ }
237
+ this.currentLoaded = loaded;
238
+ const isTotalKnown = total !== undefined;
239
+ if (isTotalKnown) {
240
+ this.currentTotal = total;
241
+ }
242
+ this.publish();
243
+ this.fire("progress");
244
+ }
245
+ /** Holds a running operation (the bar shows paused); `resume` continues it. */
246
+ pause() {
247
+ const isRunning = this.currentState === ProgressState.RUNNING;
248
+ if (!isRunning) {
249
+ return;
250
+ }
251
+ this.currentState = ProgressState.PAUSED;
252
+ this.publish();
253
+ this.fire("pause");
254
+ }
255
+ /** Continues a paused operation, or retries an errored one. */
256
+ resume() {
257
+ const isResumable = this.currentState === ProgressState.PAUSED || this.currentState === ProgressState.ERROR;
258
+ if (!isResumable) {
259
+ return;
260
+ }
261
+ this.currentState = ProgressState.RUNNING;
262
+ this.currentError = undefined;
263
+ this.publish();
264
+ this.fire("resume");
265
+ }
266
+ /**
267
+ * Ends it successfully: `load`, then `loadend`, and `await operation` gives `value`.
268
+ *
269
+ * @param value - The result.
270
+ */
271
+ complete(value) {
272
+ const isOpen = this.canSettle();
273
+ if (!isOpen) {
274
+ return;
275
+ }
276
+ this.resolveResult(value);
277
+ this.settle(ProgressState.COMPLETE);
278
+ }
279
+ /**
280
+ * Ends it with a failure: `error`, then `loadend`, and `await operation` throws `reason`.
281
+ *
282
+ * @param reason - What went wrong, kept as `error`.
283
+ */
284
+ fail(reason) {
285
+ const isOpen = this.canSettle();
286
+ if (!isOpen) {
287
+ return;
288
+ }
289
+ this.currentError = reason;
290
+ this.rejectResult(reason);
291
+ this.settle(ProgressState.ERROR);
292
+ }
293
+ /**
294
+ * Ends it by request: aborts `signal`, which fires `abort` and `loadend`,
295
+ * and `await operation` throws the reason (an `AbortError` by default).
296
+ *
297
+ * @param reason - Given to the signal.
298
+ */
299
+ cancel(reason) {
300
+ this.controller.abort(reason);
301
+ }
302
+ canSettle() {
303
+ return isUnfinished(this.currentState);
304
+ }
305
+ settle(state) {
306
+ const isCancel = state === ProgressState.CANCELED;
307
+ const isOpen = this.canSettle() || isCancel && this.currentState === ProgressState.ERROR;
308
+ if (!isOpen) {
309
+ return;
310
+ }
311
+ if (isCancel) {
312
+ this.rejectResult(this.signal.reason);
313
+ }
314
+ this.currentState = state;
315
+ const isComplete = state === ProgressState.COMPLETE;
316
+ if (isComplete) {
317
+ this.currentLoaded = this.currentTotal ?? this.currentLoaded;
318
+ }
319
+ this.publish();
320
+ const isFailure = state === ProgressState.ERROR;
321
+ const isFinishing = isComplete || isFailure;
322
+ const finalState = isFinishing ? state : ProgressState.CANCELED;
323
+ this.fire(FINAL_EVENTS[finalState]);
324
+ this.fire("loadend");
325
+ }
326
+ fire(type) {
327
+ this.dispatchEvent(new OperationProgressEvent(type, {
328
+ loaded: this.currentLoaded,
329
+ total: this.currentTotal
330
+ }));
331
+ }
332
+ publish() {
333
+ this.current = this.build();
334
+ this.dispatchEvent(new Event(CHANGE_EVENT));
335
+ }
336
+ build() {
337
+ const state = this.currentState;
338
+ const isMoving = state === ProgressState.RUNNING || state === ProgressState.PAUSED;
339
+ const hasTotal = this.currentTotal !== undefined && this.currentTotal > 0;
340
+ return {
341
+ state,
342
+ count: isUnfinished(state) ? 1 : 0,
343
+ loaded: this.currentLoaded,
344
+ total: this.currentTotal,
345
+ value: state === ProgressState.COMPLETE ? 1 : fractionOf({
346
+ loaded: this.currentLoaded,
347
+ total: this.currentTotal
348
+ }),
349
+ isIndeterminate: isMoving && !hasTotal,
350
+ showPaused: state === ProgressState.PAUSED,
351
+ showError: state === ProgressState.ERROR,
352
+ label: this.currentLabel
353
+ };
354
+ }
355
+ }
356
+ //# sourceMappingURL=progress-operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-operation.js","sourceRoot":"","sources":["../../src/progress/progress-operation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ import type { ProgressSource, TrackedOperation } from "./progress-source.js";
2
+ import { ProgressState } from "./progress-state.js";
3
+ import type { ProgressSnapshot } from "./progress-state.js";
4
+ /** What a scope keeps: a group name, or a test of each operation. */
5
+ export type ProgressFilter = string | ((operation: TrackedOperation) => boolean);
6
+ /** What `ProgressRegistry` takes; `where` makes the scoped kind. */
7
+ interface ProgressRegistryOptions {
8
+ readonly parent?: ProgressRegistry;
9
+ readonly filter?: ProgressFilter;
10
+ }
11
+ /**
12
+ * The operations that are running now, as one source: the overall bar for a
13
+ * taskbar button and the count for a tray line. Operations list themselves
14
+ * here (the app-wide one, `defaultProgressRegistry()`, unless told otherwise);
15
+ * a finished one leaves, a failed one stays until `clearFailed` or `remove`,
16
+ * so a red bar is not lost. It fires `add`, `remove` and `change`
17
+ * (a `CustomEvent` whose `detail` is the operation, except for `change`).
18
+ *
19
+ * `where` scopes it by group or by test, which is how tray icon A shows the
20
+ * downloads and tray icon B the uploads, and each window's taskbar button
21
+ * shows its own work.
22
+ */
23
+ export declare class ProgressRegistry extends EventTarget implements ProgressSource {
24
+ private readonly parent;
25
+ private readonly matches;
26
+ private readonly held;
27
+ private readonly reads;
28
+ private list;
29
+ private current;
30
+ private readonly onParentChange;
31
+ /** Made by `where`, or by an app that wants a registry of its own. */
32
+ constructor(options?: ProgressRegistryOptions);
33
+ /** The operations in the registry, oldest first. Reactive. */
34
+ get operations(): readonly TrackedOperation[];
35
+ get snapshot(): ProgressSnapshot;
36
+ /** How far along, 0 to 1, over the operations that know their total. Reactive. */
37
+ get value(): number;
38
+ /** How many operations are unfinished. Reactive. */
39
+ get count(): number;
40
+ get state(): ProgressState;
41
+ get isIndeterminate(): boolean;
42
+ get showPaused(): boolean;
43
+ get showError(): boolean;
44
+ /** The five values a `ProgressBar` takes, for `<ProgressBar {...registry.barProps} />`. Reactive. */
45
+ get barProps(): {
46
+ readonly value: number;
47
+ readonly maximum: 1;
48
+ readonly isIndeterminate: boolean;
49
+ readonly showPaused: boolean;
50
+ readonly showError: boolean;
51
+ };
52
+ subscribe(run: (snapshot: ProgressSnapshot) => void): () => void;
53
+ /**
54
+ * A view of the operations that pass `filter`: it follows this registry and
55
+ * is a source of its own. Call `dispose` when it is no longer used.
56
+ *
57
+ * @param filter - A group name, or a test of each operation.
58
+ * @returns The scoped registry.
59
+ */
60
+ where(filter: ProgressFilter): ProgressRegistry;
61
+ /**
62
+ * Lists an operation; a scoped registry lists it in the registry it follows.
63
+ *
64
+ * @param operation - The operation to show.
65
+ * @returns The operation.
66
+ */
67
+ add(operation: TrackedOperation): TrackedOperation;
68
+ /**
69
+ * Takes an operation out, whatever its state.
70
+ *
71
+ * @param operation - The operation to forget.
72
+ */
73
+ remove(operation: TrackedOperation): void;
74
+ /** Takes the failed operations out, which turns a red bar off. */
75
+ clearFailed(): void;
76
+ /** Stops following the registry a scoped one was made from. */
77
+ dispose(): void;
78
+ private readonly onEnd;
79
+ private refresh;
80
+ }
81
+ /**
82
+ * The app-wide registry, made on first use: every operation lists itself here
83
+ * unless it is given another.
84
+ *
85
+ * @returns The registry.
86
+ */
87
+ export declare function defaultProgressRegistry(): ProgressRegistry;
88
+ export {};
89
+ //# sourceMappingURL=progress-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-registry.d.ts","sourceRoot":"","sources":["../../src/progress/progress-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,qEAAqE;AACrE,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,CAAC,SAAS,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC;AAEjF,oEAAoE;AACpE,UAAU,uBAAuB;IAC/B,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;CAClC;AAWD;;;;;;;;;;;GAWG;AACH,qBAAa,gBAAiB,SAAQ,WAAY,YAAW,cAAc;IACzE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IACtD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyD;IACjF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA+B;IACpD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAC7C,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwB;IAEvD,sEAAsE;gBAC1D,OAAO,GAAE,uBAA4B;IAQjD,8DAA8D;IAC9D,IAAI,UAAU,gCAGb;IAED,IAAI,QAAQ,qBAEX;IAED,kFAAkF;IAClF,IAAI,KAAK,WAGR;IAED,oDAAoD;IACpD,IAAI,KAAK,WAGR;IAED,IAAI,KAAK,kBAGR;IAED,IAAI,eAAe,YAGlB;IAED,IAAI,UAAU,YAGb;IAED,IAAI,SAAS,YAGZ;IAED,qGAAqG;IACrG,IAAI,QAAQ;;;;;;MAUX;IAED,SAAS,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI;IAOnD;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,EAAE,cAAc;IAO5B;;;;;OAKG;IACH,GAAG,CAAC,SAAS,EAAE,gBAAgB;IAoB/B;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,gBAAgB;IAkBlC,kEAAkE;IAClE,WAAW;IASX,+DAA+D;IAC/D,OAAO;IAIP,OAAO,CAAC,QAAQ,CAAC,KAAK,CAOpB;IAEF,OAAO,CAAC,OAAO;CAOhB;AAID;;;;;GAKG;AACH,wBAAgB,uBAAuB,qBAGtC"}
@@ -0,0 +1,187 @@
1
+ import { aggregateSnapshots } from "./aggregate.js";
2
+ import { CHANGE_EVENT, reactiveReads, subscribeTo } from "./progress-source.js";
3
+ import { ProgressState } from "./progress-state.js";
4
+ function matcherOf(filter) {
5
+ const isGroup = typeof filter === "string";
6
+ if (isGroup) {
7
+ return (operation) => operation.group === filter;
8
+ }
9
+ return filter;
10
+ }
11
+ /**
12
+ * The operations that are running now, as one source: the overall bar for a
13
+ * taskbar button and the count for a tray line. Operations list themselves
14
+ * here (the app-wide one, `defaultProgressRegistry()`, unless told otherwise);
15
+ * a finished one leaves, a failed one stays until `clearFailed` or `remove`,
16
+ * so a red bar is not lost. It fires `add`, `remove` and `change`
17
+ * (a `CustomEvent` whose `detail` is the operation, except for `change`).
18
+ *
19
+ * `where` scopes it by group or by test, which is how tray icon A shows the
20
+ * downloads and tray icon B the uploads, and each window's taskbar button
21
+ * shows its own work.
22
+ */
23
+ export class ProgressRegistry extends EventTarget {
24
+ parent;
25
+ matches;
26
+ held = new Set();
27
+ reads = reactiveReads(this);
28
+ list = [];
29
+ current = aggregateSnapshots([]);
30
+ onParentChange = () => this.refresh();
31
+ /** Made by `where`, or by an app that wants a registry of its own. */
32
+ constructor(options = {}) {
33
+ super();
34
+ this.parent = options.parent;
35
+ this.matches = options.filter === undefined ? undefined : matcherOf(options.filter);
36
+ this.parent?.addEventListener(CHANGE_EVENT, this.onParentChange);
37
+ this.refresh();
38
+ }
39
+ /** The operations in the registry, oldest first. Reactive. */
40
+ get operations() {
41
+ this.reads();
42
+ return this.list;
43
+ }
44
+ get snapshot() {
45
+ return this.current;
46
+ }
47
+ /** How far along, 0 to 1, over the operations that know their total. Reactive. */
48
+ get value() {
49
+ this.reads();
50
+ return this.current.value;
51
+ }
52
+ /** How many operations are unfinished. Reactive. */
53
+ get count() {
54
+ this.reads();
55
+ return this.current.count;
56
+ }
57
+ get state() {
58
+ this.reads();
59
+ return this.current.state;
60
+ }
61
+ get isIndeterminate() {
62
+ this.reads();
63
+ return this.current.isIndeterminate;
64
+ }
65
+ get showPaused() {
66
+ this.reads();
67
+ return this.current.showPaused;
68
+ }
69
+ get showError() {
70
+ this.reads();
71
+ return this.current.showError;
72
+ }
73
+ /** The five values a `ProgressBar` takes, for `<ProgressBar {...registry.barProps} />`. Reactive. */
74
+ get barProps() {
75
+ this.reads();
76
+ const { current } = this;
77
+ return {
78
+ value: current.value,
79
+ maximum: 1,
80
+ isIndeterminate: current.isIndeterminate,
81
+ showPaused: current.showPaused,
82
+ showError: current.showError
83
+ };
84
+ }
85
+ subscribe(run) {
86
+ return subscribeTo({
87
+ source: this,
88
+ run
89
+ });
90
+ }
91
+ /**
92
+ * A view of the operations that pass `filter`: it follows this registry and
93
+ * is a source of its own. Call `dispose` when it is no longer used.
94
+ *
95
+ * @param filter - A group name, or a test of each operation.
96
+ * @returns The scoped registry.
97
+ */
98
+ where(filter) {
99
+ return new ProgressRegistry({
100
+ parent: this,
101
+ filter
102
+ });
103
+ }
104
+ /**
105
+ * Lists an operation; a scoped registry lists it in the registry it follows.
106
+ *
107
+ * @param operation - The operation to show.
108
+ * @returns The operation.
109
+ */
110
+ add(operation) {
111
+ const isScoped = this.parent !== undefined;
112
+ if (isScoped) {
113
+ this.parent.add(operation);
114
+ return operation;
115
+ }
116
+ const isHeld = this.held.has(operation);
117
+ if (isHeld) {
118
+ return operation;
119
+ }
120
+ this.held.add(operation);
121
+ operation.addEventListener(CHANGE_EVENT, this.onParentChange);
122
+ operation.addEventListener("loadend", this.onEnd);
123
+ this.dispatchEvent(new CustomEvent("add", { detail: operation }));
124
+ this.refresh();
125
+ return operation;
126
+ }
127
+ /**
128
+ * Takes an operation out, whatever its state.
129
+ *
130
+ * @param operation - The operation to forget.
131
+ */
132
+ remove(operation) {
133
+ const isScoped = this.parent !== undefined;
134
+ if (isScoped) {
135
+ this.parent.remove(operation);
136
+ return;
137
+ }
138
+ const isHeld = this.held.delete(operation);
139
+ if (!isHeld) {
140
+ return;
141
+ }
142
+ operation.removeEventListener(CHANGE_EVENT, this.onParentChange);
143
+ operation.removeEventListener("loadend", this.onEnd);
144
+ this.dispatchEvent(new CustomEvent("remove", { detail: operation }));
145
+ this.refresh();
146
+ }
147
+ /** Takes the failed operations out, which turns a red bar off. */
148
+ clearFailed() {
149
+ for (const operation of this.list) {
150
+ const isFailed = operation.state === ProgressState.ERROR;
151
+ if (isFailed) {
152
+ this.remove(operation);
153
+ }
154
+ }
155
+ }
156
+ /** Stops following the registry a scoped one was made from. */
157
+ dispose() {
158
+ this.parent?.removeEventListener(CHANGE_EVENT, this.onParentChange);
159
+ }
160
+ onEnd = (event) => {
161
+ const { target } = event;
162
+ const operation = [...this.held].find(candidate => candidate === target);
163
+ const isGone = operation !== undefined && operation.state !== ProgressState.ERROR;
164
+ if (isGone) {
165
+ this.remove(operation);
166
+ }
167
+ };
168
+ refresh() {
169
+ const source = this.parent === undefined ? [...this.held] : this.parent.list;
170
+ const { matches } = this;
171
+ this.list = matches === undefined ? source : source.filter(matches);
172
+ this.current = aggregateSnapshots(this.list.map(operation => operation.snapshot));
173
+ this.dispatchEvent(new Event(CHANGE_EVENT));
174
+ }
175
+ }
176
+ let shared;
177
+ /**
178
+ * The app-wide registry, made on first use: every operation lists itself here
179
+ * unless it is given another.
180
+ *
181
+ * @returns The registry.
182
+ */
183
+ export function defaultProgressRegistry() {
184
+ shared ??= new ProgressRegistry();
185
+ return shared;
186
+ }
187
+ //# sourceMappingURL=progress-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-registry.js","sourceRoot":"","sources":["../../src/progress/progress-registry.ts"],"names":[],"mappings":"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"}