@hkdigital/lib-sveltekit 0.1.6 → 0.1.8

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 (220) hide show
  1. package/README.md +127 -127
  2. package/dist/classes/data/IterableTree.js +243 -243
  3. package/dist/classes/data/Selector.js +190 -190
  4. package/dist/classes/data/index.js +2 -2
  5. package/dist/classes/index.js +3 -3
  6. package/dist/classes/promise/HkPromise.js +377 -377
  7. package/dist/classes/promise/index.js +1 -1
  8. package/dist/classes/stores/SubscribersCount.js +107 -107
  9. package/dist/classes/stores/index.js +1 -1
  10. package/dist/classes/streams/LogTransformStream.js +19 -19
  11. package/dist/classes/streams/ServerEventsStore.js +110 -110
  12. package/dist/classes/streams/TimeStampSource.js +26 -26
  13. package/dist/classes/streams/index.js +3 -3
  14. package/dist/classes/svelte/audio/AudioLoader.svelte.js +58 -58
  15. package/dist/classes/svelte/audio/AudioScene.svelte.js +282 -282
  16. package/dist/classes/svelte/audio/mocks.js +35 -35
  17. package/dist/classes/svelte/final-state-machine/FiniteStateMachine.svelte.js +133 -133
  18. package/dist/classes/svelte/final-state-machine/index.js +1 -1
  19. package/dist/classes/svelte/image/ImageLoader.svelte.js +47 -47
  20. package/dist/classes/svelte/image/ImageScene.svelte.js +253 -253
  21. package/dist/classes/svelte/image/ImageVariantsLoader.svelte.js +152 -152
  22. package/dist/classes/svelte/image/index.js +4 -4
  23. package/dist/classes/svelte/image/mocks.js +35 -35
  24. package/dist/classes/svelte/image/typedef.js +8 -8
  25. package/dist/classes/svelte/loading-state-machine/LoadingStateMachine.svelte.js +109 -109
  26. package/dist/classes/svelte/loading-state-machine/constants.js +16 -16
  27. package/dist/classes/svelte/loading-state-machine/index.js +3 -3
  28. package/dist/classes/svelte/network-loader/NetworkLoader.svelte.js +331 -331
  29. package/dist/classes/svelte/network-loader/constants.js +3 -3
  30. package/dist/classes/svelte/network-loader/index.js +3 -3
  31. package/dist/classes/svelte/network-loader/mocks.js +30 -30
  32. package/dist/classes/svelte/network-loader/typedef.js +8 -8
  33. package/dist/components/area/HkArea.svelte +49 -49
  34. package/dist/components/area/HkArea.svelte.d.ts +14 -0
  35. package/dist/components/area/HkGridArea.svelte +77 -77
  36. package/dist/components/area/HkGridArea.svelte.d.ts +22 -0
  37. package/dist/components/area/index.js +2 -2
  38. package/dist/components/boxes/game-box/GameBox.svelte +112 -112
  39. package/dist/components/boxes/game-box/GameBox.svelte.d.ts +15 -0
  40. package/dist/components/boxes/game-box/gamebox.util.js +83 -83
  41. package/dist/components/boxes/index.js +2 -2
  42. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte +196 -199
  43. package/dist/components/boxes/virtual-viewport/VirtualViewport.svelte.d.ts +24 -2
  44. package/dist/components/buttons/button/Button.svelte +76 -75
  45. package/dist/components/buttons/button/Button.svelte.d.ts +21 -0
  46. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte +30 -0
  47. package/dist/components/buttons/button-icon-steeze/SteezeIconButton.svelte.d.ts +16 -0
  48. package/dist/components/buttons/button-text/TextButton.svelte +21 -21
  49. package/dist/components/buttons/button-text/TextButton.svelte.d.ts +7 -0
  50. package/dist/components/buttons/index.d.ts +1 -0
  51. package/dist/components/buttons/index.js +3 -2
  52. package/dist/components/hkdev/blocks/TextBlock.svelte +46 -46
  53. package/dist/components/hkdev/blocks/TextBlock.svelte.d.ts +13 -0
  54. package/dist/components/hkdev/buttons/CheckButton.svelte +62 -62
  55. package/dist/components/hkdev/buttons/CheckButton.svelte.d.ts +18 -0
  56. package/dist/components/{icon → icons}/HkIcon.svelte +86 -86
  57. package/dist/components/icons/HkIcon.svelte.d.ts +22 -0
  58. package/dist/components/{icon → icons}/HkTabIcon.svelte +116 -116
  59. package/dist/components/icons/HkTabIcon.svelte.d.ts +40 -0
  60. package/dist/components/icons/SteezeIcon.svelte +96 -0
  61. package/dist/components/icons/SteezeIcon.svelte.d.ts +22 -0
  62. package/dist/components/{icon → icons}/index.d.ts +1 -0
  63. package/dist/components/{icon → icons}/index.js +6 -4
  64. package/dist/components/{icon → icons}/typedef.js +16 -16
  65. package/dist/components/image/ImageBox.svelte +208 -208
  66. package/dist/components/image/ImageBox.svelte.d.ts +19 -0
  67. package/dist/components/image/index.js +5 -5
  68. package/dist/components/image/typedef.js +32 -32
  69. package/dist/components/index.js +2 -2
  70. package/dist/components/inputs/index.js +1 -1
  71. package/dist/components/inputs/text-input/TestTextInput.svelte__ +102 -102
  72. package/dist/components/inputs/text-input/TextInput.svelte +226 -226
  73. package/dist/components/inputs/text-input/TextInput.svelte.d.ts +28 -0
  74. package/dist/components/inputs/text-input/TextInput.svelte___ +83 -83
  75. package/dist/components/inputs/text-input/assets/IconInvalid.svelte +14 -14
  76. package/dist/components/inputs/text-input/assets/IconValid.svelte +12 -12
  77. package/dist/components/layout/HkAppLayout.state.svelte.js +25 -25
  78. package/dist/components/layout/HkAppLayout.svelte +251 -251
  79. package/dist/components/layout/HkAppLayout.svelte.d.ts +11 -0
  80. package/dist/components/layout/HkGridLayers.svelte +82 -82
  81. package/dist/components/layout/HkGridLayers.svelte.d.ts +23 -0
  82. package/dist/components/layout/index.js +9 -9
  83. package/dist/components/panels/index.js +1 -1
  84. package/dist/components/panels/plain-panel/PlainPanel.svelte +33 -33
  85. package/dist/components/panels/plain-panel/PlainPanel.svelte.d.ts +12 -0
  86. package/dist/components/rows/index.js +3 -3
  87. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte +104 -104
  88. package/dist/components/rows/panel-grid-row/PanelGridRow.svelte.d.ts +14 -0
  89. package/dist/components/rows/panel-row-2/PanelRow2.svelte +40 -40
  90. package/dist/components/rows/panel-row-2/PanelRow2.svelte.d.ts +14 -0
  91. package/dist/components/tab-bar/HkTabBar.state.svelte.js +149 -149
  92. package/dist/components/tab-bar/HkTabBar.svelte +74 -74
  93. package/dist/components/tab-bar/HkTabBar.svelte.d.ts +18 -0
  94. package/dist/components/tab-bar/HkTabBarSelector.state.svelte.js +93 -93
  95. package/dist/components/tab-bar/HkTabBarSelector.svelte +49 -49
  96. package/dist/components/tab-bar/HkTabBarSelector.svelte.d.ts +19 -0
  97. package/dist/components/tab-bar/index.js +17 -17
  98. package/dist/components/tab-bar/typedef.d.ts +1 -1
  99. package/dist/components/tab-bar/typedef.js +8 -8
  100. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte +179 -179
  101. package/dist/components/widgets/compare-left-right/CompareLeftRight.svelte.d.ts +10 -0
  102. package/dist/components/widgets/compare-left-right/index.js +1 -1
  103. package/dist/components/widgets/scale-control/index.js +1 -1
  104. package/dist/config/imagetools-config.js +189 -189
  105. package/dist/config/imagetools.d.ts +71 -71
  106. package/dist/config/typedef.js +8 -8
  107. package/dist/constants/errors/api.js +9 -9
  108. package/dist/constants/errors/generic.js +5 -5
  109. package/dist/constants/errors/index.js +3 -3
  110. package/dist/constants/errors/jwt.js +5 -5
  111. package/dist/constants/http/headers.js +6 -6
  112. package/dist/constants/http/index.js +2 -2
  113. package/dist/constants/http/methods.js +2 -2
  114. package/dist/constants/index.js +3 -3
  115. package/dist/constants/mime/application.js +5 -5
  116. package/dist/constants/mime/audio.js +13 -13
  117. package/dist/constants/mime/image.js +3 -3
  118. package/dist/constants/mime/index.js +4 -4
  119. package/dist/constants/mime/text.js +2 -2
  120. package/dist/constants/regexp/index.js +31 -31
  121. package/dist/constants/regexp/inspiratie.js__ +95 -95
  122. package/dist/constants/regexp/text.js +49 -49
  123. package/dist/constants/regexp/user.js +32 -32
  124. package/dist/constants/regexp/web.js +3 -3
  125. package/dist/constants/state-labels/input-states.js +11 -11
  126. package/dist/constants/state-labels/submit-states.js +4 -4
  127. package/dist/constants/time.js +28 -28
  128. package/dist/css/tw-prose.postcss__ +259 -259
  129. package/dist/css/utilities.postcss +43 -43
  130. package/dist/design/design-config.d.ts +7 -6
  131. package/dist/design/design-config.js +73 -73
  132. package/dist/design/tailwind-theme-extend.d.ts +4 -4
  133. package/dist/design/tailwind-theme-extend.js +158 -151
  134. package/dist/schemas/index.js +1 -1
  135. package/dist/schemas/validate-url.js +180 -180
  136. package/dist/server/index.js +1 -1
  137. package/dist/server/logger.js +94 -94
  138. package/dist/states/index.js +1 -1
  139. package/dist/states/navigation.svelte.js +55 -55
  140. package/dist/stores/index.js +1 -1
  141. package/dist/stores/theme.js +80 -80
  142. package/dist/themes/hkdev/components/blocks/text-block.postcss +41 -41
  143. package/dist/themes/hkdev/components/boxes/game-box.postcss +13 -13
  144. package/dist/themes/hkdev/components/buttons/button-icon-steeze.postcss +22 -0
  145. package/dist/themes/hkdev/components/buttons/button-text.postcss +34 -34
  146. package/dist/themes/hkdev/components/buttons/button.postcss +138 -138
  147. package/dist/themes/hkdev/components/buttons/button.postcss__ +40 -0
  148. package/dist/themes/hkdev/components/buttons/button.postcss___ +91 -0
  149. package/dist/themes/hkdev/components/buttons/skip-button.postcss +8 -8
  150. package/dist/themes/hkdev/components/icons/icon-steeze.postcss +22 -0
  151. package/dist/themes/hkdev/components/inputs/text-input.postcss +108 -108
  152. package/dist/themes/hkdev/components/panels/plain-panel.postcss +46 -46
  153. package/dist/themes/hkdev/components/panels/speech-bubble.postcss +52 -52
  154. package/dist/themes/hkdev/components/rows/panel-grid-row.postcss +7 -7
  155. package/dist/themes/hkdev/components/rows/panel-row-2.postcss +9 -9
  156. package/dist/themes/hkdev/components.postcss +61 -55
  157. package/dist/themes/hkdev/debug.postcss +1 -1
  158. package/dist/themes/hkdev/global/layout.postcss +39 -39
  159. package/dist/themes/hkdev/global/on-colors.postcss +53 -53
  160. package/dist/themes/hkdev/global/text.postcss__ +34 -34
  161. package/dist/themes/hkdev/global/vars.postcss__ +7 -7
  162. package/dist/themes/hkdev/globals.postcss +11 -11
  163. package/dist/themes/hkdev/responsive.postcss +12 -12
  164. package/dist/themes/hkdev/theme-ext.js +15 -15
  165. package/dist/themes/hkdev/theme.js +227 -227
  166. package/dist/themes/index.js +1 -1
  167. package/dist/util/array/index.js +455 -455
  168. package/dist/util/compare/index.js +247 -247
  169. package/dist/util/css/css-vars.js +83 -83
  170. package/dist/util/css/index.js +1 -1
  171. package/dist/util/design-system/components/states.js +22 -22
  172. package/dist/util/design-system/css/clamp.d.ts +2 -2
  173. package/dist/util/design-system/css/clamp.js +66 -66
  174. package/dist/util/design-system/css/root-design-vars.d.ts +4 -4
  175. package/dist/util/design-system/css/root-design-vars.js +100 -100
  176. package/dist/util/design-system/index.js +5 -5
  177. package/dist/util/design-system/layout/scaling.d.ts +4 -4
  178. package/dist/util/design-system/layout/scaling.js +97 -97
  179. package/dist/util/design-system/tailwind.d.ts +20 -20
  180. package/dist/util/design-system/tailwind.js +289 -289
  181. package/dist/util/expect/arrays.js +47 -47
  182. package/dist/util/expect/index.js +259 -259
  183. package/dist/util/expect/primitives.js +55 -55
  184. package/dist/util/expect/url.js +60 -60
  185. package/dist/util/function/index.js +218 -218
  186. package/dist/util/http/errors.js +97 -97
  187. package/dist/util/http/headers.js +45 -45
  188. package/dist/util/http/http-request.js +273 -273
  189. package/dist/util/http/index.js +22 -22
  190. package/dist/util/http/json-request.js +143 -143
  191. package/dist/util/http/mocks.js +65 -65
  192. package/dist/util/http/response.js +228 -228
  193. package/dist/util/http/url.js +52 -52
  194. package/dist/util/image/index.js +86 -86
  195. package/dist/util/index.js +2 -2
  196. package/dist/util/is/index.js +140 -140
  197. package/dist/util/iterate/index.js +234 -234
  198. package/dist/util/object/index.js +1361 -1361
  199. package/dist/util/singleton/index.js +97 -97
  200. package/dist/util/string/index.js +184 -184
  201. package/dist/util/svelte/index.js +2 -2
  202. package/dist/util/svelte/observe/index.js +49 -49
  203. package/dist/util/svelte/state-context/index.js +83 -83
  204. package/dist/util/svelte/wait/index.js +38 -38
  205. package/dist/util/sveltekit/index.js +1 -1
  206. package/dist/util/sveltekit/route-folders/index.js +82 -82
  207. package/dist/util/time/index.js +339 -339
  208. package/dist/valibot/date.js__ +10 -10
  209. package/dist/valibot/index.js +9 -9
  210. package/dist/valibot/url.js +95 -95
  211. package/dist/valibot/user.js +23 -23
  212. package/dist/zod/all.js +33 -33
  213. package/dist/zod/generic.js +11 -11
  214. package/dist/zod/javascript.js +32 -32
  215. package/dist/zod/user.js +16 -16
  216. package/dist/zod/web.js +52 -52
  217. package/package.json +99 -99
  218. package/dist/components/icon/HkIcon.svelte.d.ts +0 -10
  219. package/dist/components/icon/HkTabIcon.svelte.d.ts +0 -19
  220. /package/dist/components/{icon → icons}/typedef.d.ts +0 -0
@@ -1 +1 @@
1
- export { default as HkPromise } from './HkPromise.js';
1
+ export { default as HkPromise } from './HkPromise.js';
@@ -1,107 +1,107 @@
1
- import { writable, get } from 'svelte/store';
2
-
3
- /**
4
- * Class that can be used to add a `SubscribersCount` store to classes
5
- * or other objects
6
- */
7
- export default class SubscribersCount {
8
- #count;
9
-
10
- constructor() {
11
- this.#count = writable(0);
12
- }
13
-
14
- increment() {
15
- this.#count.update((value) => value + 1);
16
- }
17
-
18
- decrement() {
19
- this.#count.update((value) => value - 1);
20
- }
21
-
22
- /**
23
- * Subscribe to `SubscribersCount` store
24
- *
25
- * @param {(value:number)=>void} fn
26
- *
27
- * @returns {()=>void} unsubscribe
28
- */
29
- subscribe(fn) {
30
- return this.#count.subscribe(fn);
31
- }
32
-
33
- /**
34
- * Subscribe to `SubscribersCount` store and receive an update once if the
35
- * count is zero.
36
- *
37
- * @param {(value:number)=>void} fn
38
- *
39
- * @returns {()=>void} unsubscribe
40
- */
41
- onceEmpty(fn) {
42
- let unsubscribe = this.#count.subscribe((value) => {
43
- if (value === 0) {
44
- unsubscribe();
45
- fn(value);
46
- }
47
- });
48
-
49
- return unsubscribe;
50
- }
51
-
52
- /**
53
- * Create a writable store with added 'subscribeCount' functionality
54
- */
55
- static writable() {
56
- const store = writable(...arguments);
57
-
58
- return SubscribersCount.wrap(store);
59
- }
60
-
61
- /**
62
- * Add subscriber count functionality to an existing store by wrapping
63
- * the store with a Proxy
64
- *
65
- * @template T;
66
- *
67
- * @param {import('svelte/store').Writable<T>} store
68
- */
69
- static wrap(store) {
70
- // expect.store( store );
71
-
72
- const counter = new SubscribersCount();
73
-
74
- const handler = {
75
- /**
76
- * @param {any} target
77
- * @param {string} prop
78
- */
79
- get(target, prop) {
80
- switch (prop) {
81
- case 'subscribe': {
82
- return /* subscribe */ function () {
83
- counter.increment();
84
- const unsubscribe = target[prop](...arguments);
85
-
86
- return /* unsubscribe */ () => {
87
- counter.decrement();
88
- unsubscribe();
89
- };
90
- };
91
- }
92
-
93
- case 'value':
94
- return get(store);
95
-
96
- case 'subscribersCount':
97
- return counter;
98
- }
99
-
100
- return Reflect.get(target, prop);
101
- // return target[prop];
102
- }
103
- };
104
-
105
- return new Proxy(store, handler);
106
- }
107
- }
1
+ import { writable, get } from 'svelte/store';
2
+
3
+ /**
4
+ * Class that can be used to add a `SubscribersCount` store to classes
5
+ * or other objects
6
+ */
7
+ export default class SubscribersCount {
8
+ #count;
9
+
10
+ constructor() {
11
+ this.#count = writable(0);
12
+ }
13
+
14
+ increment() {
15
+ this.#count.update((value) => value + 1);
16
+ }
17
+
18
+ decrement() {
19
+ this.#count.update((value) => value - 1);
20
+ }
21
+
22
+ /**
23
+ * Subscribe to `SubscribersCount` store
24
+ *
25
+ * @param {(value:number)=>void} fn
26
+ *
27
+ * @returns {()=>void} unsubscribe
28
+ */
29
+ subscribe(fn) {
30
+ return this.#count.subscribe(fn);
31
+ }
32
+
33
+ /**
34
+ * Subscribe to `SubscribersCount` store and receive an update once if the
35
+ * count is zero.
36
+ *
37
+ * @param {(value:number)=>void} fn
38
+ *
39
+ * @returns {()=>void} unsubscribe
40
+ */
41
+ onceEmpty(fn) {
42
+ let unsubscribe = this.#count.subscribe((value) => {
43
+ if (value === 0) {
44
+ unsubscribe();
45
+ fn(value);
46
+ }
47
+ });
48
+
49
+ return unsubscribe;
50
+ }
51
+
52
+ /**
53
+ * Create a writable store with added 'subscribeCount' functionality
54
+ */
55
+ static writable() {
56
+ const store = writable(...arguments);
57
+
58
+ return SubscribersCount.wrap(store);
59
+ }
60
+
61
+ /**
62
+ * Add subscriber count functionality to an existing store by wrapping
63
+ * the store with a Proxy
64
+ *
65
+ * @template T;
66
+ *
67
+ * @param {import('svelte/store').Writable<T>} store
68
+ */
69
+ static wrap(store) {
70
+ // expect.store( store );
71
+
72
+ const counter = new SubscribersCount();
73
+
74
+ const handler = {
75
+ /**
76
+ * @param {any} target
77
+ * @param {string} prop
78
+ */
79
+ get(target, prop) {
80
+ switch (prop) {
81
+ case 'subscribe': {
82
+ return /* subscribe */ function () {
83
+ counter.increment();
84
+ const unsubscribe = target[prop](...arguments);
85
+
86
+ return /* unsubscribe */ () => {
87
+ counter.decrement();
88
+ unsubscribe();
89
+ };
90
+ };
91
+ }
92
+
93
+ case 'value':
94
+ return get(store);
95
+
96
+ case 'subscribersCount':
97
+ return counter;
98
+ }
99
+
100
+ return Reflect.get(target, prop);
101
+ // return target[prop];
102
+ }
103
+ };
104
+
105
+ return new Proxy(store, handler);
106
+ }
107
+ }
@@ -1 +1 @@
1
- export { default as SubscribersCount } from './SubscribersCount.js';
1
+ export { default as SubscribersCount } from './SubscribersCount.js';
@@ -1,19 +1,19 @@
1
- export default class LogTransformStream extends TransformStream {
2
- constructor() {
3
- const transformer = {
4
- /**
5
- * Log the chunk and enqueue the unchanged chunk
6
- *
7
- * @param {any} chunk
8
- * @param {any} controller
9
- */
10
- transform: (chunk, controller) => {
11
- console.log('log', chunk);
12
- controller.enqueue(chunk);
13
- }
14
- };
15
-
16
- super(transformer);
17
- }
18
- start() {}
19
- }
1
+ export default class LogTransformStream extends TransformStream {
2
+ constructor() {
3
+ const transformer = {
4
+ /**
5
+ * Log the chunk and enqueue the unchanged chunk
6
+ *
7
+ * @param {any} chunk
8
+ * @param {any} controller
9
+ */
10
+ transform: (chunk, controller) => {
11
+ console.log('log', chunk);
12
+ controller.enqueue(chunk);
13
+ }
14
+ };
15
+
16
+ super(transformer);
17
+ }
18
+ start() {}
19
+ }
@@ -1,110 +1,110 @@
1
- import { writable } from 'svelte/store';
2
-
3
- // eslint-disable-next-line no-unused-vars
4
- import * as Zods from '../../zod/all.js';
5
-
6
- import SubscribersCount from '../stores/SubscribersCount.js';
7
-
8
- // > Class
9
-
10
- export default class ServerEventsStore {
11
- /** @type {Zods.AbsOrRelUrl} */
12
- #url;
13
-
14
- /** @type {import("svelte/store").Writable<object|null>} */
15
- #store;
16
-
17
- /** @type {boolean} */
18
- #starting = false;
19
-
20
- /** @type {ReadableStream<Uint8Array>|null} */
21
- #stream = null;
22
-
23
- /** @type {SubscribersCount} */
24
- subscribersCount;
25
-
26
- /**
27
- * @param {object} _
28
- * @param {Zods.AbsOrRelUrl} _.url
29
- */
30
- constructor({ url }) {
31
- this.#url = Zods.AbsOrRelUrl.parse(url);
32
-
33
- this.#store = writable(null);
34
-
35
- this.subscribersCount = new SubscribersCount();
36
- }
37
-
38
- /**
39
- * Subscribe to Server Send Events
40
- *
41
- * @param {import("svelte/store").Subscriber<object|null>} fn
42
- *
43
- * @returns {()=>void} unsubscribe
44
- */
45
- subscribe(fn) {
46
- this.subscribersCount.increment();
47
-
48
- const unsubscribe = this.#store?.subscribe(fn);
49
-
50
- this.#tryStartStream();
51
-
52
- return () => {
53
- this.subscribersCount.decrement();
54
- unsubscribe?.();
55
- };
56
- }
57
-
58
- async #tryStartStream() {
59
- if (this.#stream || this.#starting) {
60
- return;
61
- }
62
-
63
- try {
64
- this.#starting = true;
65
-
66
- const aborter = new AbortController();
67
- const signal = aborter.signal;
68
-
69
- const response = await fetch(this.#url, { signal });
70
-
71
- const stream = (this.#stream = response.body);
72
-
73
- this.#starting = false;
74
-
75
- const reader =
76
- // @ts-ignore
77
- stream.pipeThrough(new TextDecoderStream()).getReader();
78
-
79
- // const textDecoder = new TextDecoder('utf-8');
80
-
81
- while (!signal.aborted) {
82
- const { value, done } = await reader.read();
83
-
84
- if (undefined === value) {
85
- break;
86
- }
87
-
88
- const obj = JSON.parse(value);
89
- // const obj = JSON.parse(textDecoder.decode(value));
90
-
91
- if (!done) {
92
- this.#store.set(obj);
93
- }
94
-
95
- // console.log({ ...obj, done });
96
-
97
- if (done) {
98
- break;
99
- }
100
- } // end for
101
- } catch (e) {
102
- this.#starting = false;
103
- this.#stream = null;
104
-
105
- if (e instanceof Error && e.name !== 'AbortError') {
106
- throw e;
107
- }
108
- }
109
- }
110
- }
1
+ import { writable } from 'svelte/store';
2
+
3
+ // eslint-disable-next-line no-unused-vars
4
+ import * as Zods from '../../zod/all.js';
5
+
6
+ import SubscribersCount from '../stores/SubscribersCount.js';
7
+
8
+ // > Class
9
+
10
+ export default class ServerEventsStore {
11
+ /** @type {Zods.AbsOrRelUrl} */
12
+ #url;
13
+
14
+ /** @type {import("svelte/store").Writable<object|null>} */
15
+ #store;
16
+
17
+ /** @type {boolean} */
18
+ #starting = false;
19
+
20
+ /** @type {ReadableStream<Uint8Array>|null} */
21
+ #stream = null;
22
+
23
+ /** @type {SubscribersCount} */
24
+ subscribersCount;
25
+
26
+ /**
27
+ * @param {object} _
28
+ * @param {Zods.AbsOrRelUrl} _.url
29
+ */
30
+ constructor({ url }) {
31
+ this.#url = Zods.AbsOrRelUrl.parse(url);
32
+
33
+ this.#store = writable(null);
34
+
35
+ this.subscribersCount = new SubscribersCount();
36
+ }
37
+
38
+ /**
39
+ * Subscribe to Server Send Events
40
+ *
41
+ * @param {import("svelte/store").Subscriber<object|null>} fn
42
+ *
43
+ * @returns {()=>void} unsubscribe
44
+ */
45
+ subscribe(fn) {
46
+ this.subscribersCount.increment();
47
+
48
+ const unsubscribe = this.#store?.subscribe(fn);
49
+
50
+ this.#tryStartStream();
51
+
52
+ return () => {
53
+ this.subscribersCount.decrement();
54
+ unsubscribe?.();
55
+ };
56
+ }
57
+
58
+ async #tryStartStream() {
59
+ if (this.#stream || this.#starting) {
60
+ return;
61
+ }
62
+
63
+ try {
64
+ this.#starting = true;
65
+
66
+ const aborter = new AbortController();
67
+ const signal = aborter.signal;
68
+
69
+ const response = await fetch(this.#url, { signal });
70
+
71
+ const stream = (this.#stream = response.body);
72
+
73
+ this.#starting = false;
74
+
75
+ const reader =
76
+ // @ts-ignore
77
+ stream.pipeThrough(new TextDecoderStream()).getReader();
78
+
79
+ // const textDecoder = new TextDecoder('utf-8');
80
+
81
+ while (!signal.aborted) {
82
+ const { value, done } = await reader.read();
83
+
84
+ if (undefined === value) {
85
+ break;
86
+ }
87
+
88
+ const obj = JSON.parse(value);
89
+ // const obj = JSON.parse(textDecoder.decode(value));
90
+
91
+ if (!done) {
92
+ this.#store.set(obj);
93
+ }
94
+
95
+ // console.log({ ...obj, done });
96
+
97
+ if (done) {
98
+ break;
99
+ }
100
+ } // end for
101
+ } catch (e) {
102
+ this.#starting = false;
103
+ this.#stream = null;
104
+
105
+ if (e instanceof Error && e.name !== 'AbortError') {
106
+ throw e;
107
+ }
108
+ }
109
+ }
110
+ }
@@ -1,26 +1,26 @@
1
- export default class TimestampSource {
2
- /** @type {number|NodeJS.Timeout|undefined} */
3
- #interval;
4
-
5
- constructor() {}
6
-
7
- /**
8
- * Stream start function
9
- *
10
- * @param {ReadableStreamDefaultController} ctr
11
- */
12
- start(ctr) {
13
- ctr.enqueue(JSON.stringify({ now: Date.now() }));
14
-
15
- this.#interval = setInterval(() => {
16
- return ctr.enqueue(JSON.stringify({ now: Date.now() }));
17
- }, 1000);
18
- }
19
-
20
- /**
21
- * Stop generation of new stream output
22
- */
23
- cancel() {
24
- clearInterval(this.#interval);
25
- }
26
- }
1
+ export default class TimestampSource {
2
+ /** @type {number|NodeJS.Timeout|undefined} */
3
+ #interval;
4
+
5
+ constructor() {}
6
+
7
+ /**
8
+ * Stream start function
9
+ *
10
+ * @param {ReadableStreamDefaultController} ctr
11
+ */
12
+ start(ctr) {
13
+ ctr.enqueue(JSON.stringify({ now: Date.now() }));
14
+
15
+ this.#interval = setInterval(() => {
16
+ return ctr.enqueue(JSON.stringify({ now: Date.now() }));
17
+ }, 1000);
18
+ }
19
+
20
+ /**
21
+ * Stop generation of new stream output
22
+ */
23
+ cancel() {
24
+ clearInterval(this.#interval);
25
+ }
26
+ }
@@ -1,3 +1,3 @@
1
- export { default as LogTransformStream } from './LogTransformStream.js';
2
- export { default as ServerEventsStore } from './ServerEventsStore.js';
3
- export { default as TimeStampSource } from './TimeStampSource.js';
1
+ export { default as LogTransformStream } from './LogTransformStream.js';
2
+ export { default as ServerEventsStore } from './ServerEventsStore.js';
3
+ export { default as TimeStampSource } from './TimeStampSource.js';
@@ -1,58 +1,58 @@
1
- import {
2
- NetworkLoader,
3
- ERROR_NOT_LOADED,
4
- ERROR_TRANSFERRED
5
- } from '../network-loader/index.js';
6
-
7
- /**
8
- * AudioLoader instance
9
- * - Loads audio data from network into an ArrayBuffer
10
- * - Loaded data can be transferred to an AudioBufferSourceNode
11
- */
12
- export default class AudioLoader extends NetworkLoader {
13
- /** @type {AudioBuffer|null} */
14
- #audioBuffer = null;
15
-
16
- /**
17
- * Get an AudioBufferSourceNode instance
18
- *
19
- * @note AudioBufferSourceNodes can play only once, a new source node
20
- * must be created otherwise
21
- *
22
- * @param {AudioContext} audioContext
23
- *
24
- * @returns {Promise<AudioBufferSourceNode>}
25
- */
26
- async getAudioBufferSourceNode(audioContext) {
27
- if (!this.#audioBuffer) {
28
- this.#audioBuffer = await this.getAudioBuffer(audioContext);
29
- }
30
-
31
- return new AudioBufferSourceNode(audioContext, {
32
- buffer: this.#audioBuffer
33
- });
34
- }
35
-
36
- /**
37
- * Gets data as AudioBuffer
38
- * - Stores created AudioBuffer instance internally
39
- * - Transfers data from internal ArrayBuffer, which will be detached
40
- *
41
- * @param {AudioContext} audioContext
42
- *
43
- * @returns {Promise<AudioBuffer>}
44
- */
45
- async getAudioBuffer(audioContext) {
46
- if (!this._buffer) {
47
- throw new Error(ERROR_NOT_LOADED);
48
- }
49
-
50
- if (this._buffer.detached) {
51
- throw new Error(ERROR_TRANSFERRED);
52
- }
53
-
54
- this.#audioBuffer = await audioContext.decodeAudioData(this._buffer);
55
-
56
- return this.#audioBuffer;
57
- }
58
- } // end class
1
+ import {
2
+ NetworkLoader,
3
+ ERROR_NOT_LOADED,
4
+ ERROR_TRANSFERRED
5
+ } from '../network-loader/index.js';
6
+
7
+ /**
8
+ * AudioLoader instance
9
+ * - Loads audio data from network into an ArrayBuffer
10
+ * - Loaded data can be transferred to an AudioBufferSourceNode
11
+ */
12
+ export default class AudioLoader extends NetworkLoader {
13
+ /** @type {AudioBuffer|null} */
14
+ #audioBuffer = null;
15
+
16
+ /**
17
+ * Get an AudioBufferSourceNode instance
18
+ *
19
+ * @note AudioBufferSourceNodes can play only once, a new source node
20
+ * must be created otherwise
21
+ *
22
+ * @param {AudioContext} audioContext
23
+ *
24
+ * @returns {Promise<AudioBufferSourceNode>}
25
+ */
26
+ async getAudioBufferSourceNode(audioContext) {
27
+ if (!this.#audioBuffer) {
28
+ this.#audioBuffer = await this.getAudioBuffer(audioContext);
29
+ }
30
+
31
+ return new AudioBufferSourceNode(audioContext, {
32
+ buffer: this.#audioBuffer
33
+ });
34
+ }
35
+
36
+ /**
37
+ * Gets data as AudioBuffer
38
+ * - Stores created AudioBuffer instance internally
39
+ * - Transfers data from internal ArrayBuffer, which will be detached
40
+ *
41
+ * @param {AudioContext} audioContext
42
+ *
43
+ * @returns {Promise<AudioBuffer>}
44
+ */
45
+ async getAudioBuffer(audioContext) {
46
+ if (!this._buffer) {
47
+ throw new Error(ERROR_NOT_LOADED);
48
+ }
49
+
50
+ if (this._buffer.detached) {
51
+ throw new Error(ERROR_TRANSFERRED);
52
+ }
53
+
54
+ this.#audioBuffer = await audioContext.decodeAudioData(this._buffer);
55
+
56
+ return this.#audioBuffer;
57
+ }
58
+ } // end class