@omnimedia/omnitool 1.0.0 → 1.1.0-3

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 (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -2
  3. package/package.json +56 -27
  4. package/s/_archive/types.ts +107 -0
  5. package/s/context.ts +7 -0
  6. package/s/demo/demo.bundle.ts +64 -0
  7. package/s/demo/demo.css +54 -0
  8. package/s/demo/routines/filmstrip-test.ts +68 -0
  9. package/s/demo/routines/load-video.ts +7 -0
  10. package/s/demo/routines/transcode-test.ts +44 -0
  11. package/s/demo/routines/waveform-test.ts +12 -0
  12. package/s/driver/driver.test.ts +15 -0
  13. package/s/driver/driver.ts +116 -0
  14. package/s/driver/driver.worker.bundle.ts +7 -0
  15. package/s/driver/fns/host.ts +12 -0
  16. package/s/driver/fns/schematic.ts +83 -0
  17. package/s/driver/fns/work.ts +237 -0
  18. package/s/driver/parts/constants.ts +17 -0
  19. package/s/driver/parts/machina.ts +27 -0
  20. package/s/driver/utils/load-decoder-source.ts +13 -0
  21. package/s/driver/utils/sleep.ts +3 -0
  22. package/s/index.html.ts +53 -0
  23. package/s/index.ts +2 -39
  24. package/s/tests.test.ts +8 -0
  25. package/s/timeline/index.ts +14 -0
  26. package/s/timeline/parts/basics.ts +17 -0
  27. package/s/timeline/parts/filmstrip.ts +159 -0
  28. package/s/timeline/parts/item.ts +58 -0
  29. package/s/timeline/parts/media.ts +14 -0
  30. package/s/timeline/parts/resource-pool.ts +27 -0
  31. package/s/timeline/parts/resource.ts +11 -0
  32. package/s/timeline/parts/waveform.ts +62 -0
  33. package/s/timeline/sugar/o.ts +60 -0
  34. package/s/timeline/sugar/omni-test.ts +38 -0
  35. package/s/timeline/sugar/omni.ts +30 -0
  36. package/s/timeline/utils/checksum.ts +19 -0
  37. package/s/timeline/utils/datafile.ts +21 -0
  38. package/s/timeline/utils/dummy-data.ts +7 -0
  39. package/x/context.d.ts +4 -0
  40. package/x/context.js +6 -0
  41. package/x/context.js.map +1 -0
  42. package/x/demo/demo.bundle.d.ts +1 -0
  43. package/x/demo/demo.bundle.js +51 -0
  44. package/x/demo/demo.bundle.js.map +1 -0
  45. package/x/demo/demo.bundle.min.js +118 -0
  46. package/x/demo/demo.bundle.min.js.map +7 -0
  47. package/x/demo/demo.css +54 -0
  48. package/x/demo/routines/filmstrip-test.d.ts +1 -0
  49. package/x/demo/routines/filmstrip-test.js +62 -0
  50. package/x/demo/routines/filmstrip-test.js.map +1 -0
  51. package/x/demo/routines/load-video.d.ts +1 -0
  52. package/x/demo/routines/load-video.js +6 -0
  53. package/x/demo/routines/load-video.js.map +1 -0
  54. package/x/demo/routines/transcode-test.d.ts +6 -0
  55. package/x/demo/routines/transcode-test.js +38 -0
  56. package/x/demo/routines/transcode-test.js.map +1 -0
  57. package/x/demo/routines/waveform-test.d.ts +1 -0
  58. package/x/demo/routines/waveform-test.js +11 -0
  59. package/x/demo/routines/waveform-test.js.map +1 -0
  60. package/x/driver/driver.d.ts +22 -0
  61. package/x/driver/driver.js +97 -0
  62. package/x/driver/driver.js.map +1 -0
  63. package/x/driver/driver.test.d.ts +5 -0
  64. package/x/driver/driver.test.js +12 -0
  65. package/x/driver/driver.test.js.map +1 -0
  66. package/x/driver/driver.worker.bundle.d.ts +1 -0
  67. package/x/driver/driver.worker.bundle.js +4 -0
  68. package/x/driver/driver.worker.bundle.js.map +1 -0
  69. package/x/driver/driver.worker.bundle.min.js +1148 -0
  70. package/x/driver/driver.worker.bundle.min.js.map +7 -0
  71. package/x/driver/fns/host.d.ts +18 -0
  72. package/x/driver/fns/host.js +7 -0
  73. package/x/driver/fns/host.js.map +1 -0
  74. package/x/driver/fns/schematic.d.ts +66 -0
  75. package/x/driver/fns/schematic.js +2 -0
  76. package/x/driver/fns/schematic.js.map +1 -0
  77. package/x/driver/fns/work.d.ts +19 -0
  78. package/x/driver/fns/work.js +192 -0
  79. package/x/driver/fns/work.js.map +1 -0
  80. package/x/driver/parts/constants.d.ts +2 -0
  81. package/x/driver/parts/constants.js +17 -0
  82. package/x/driver/parts/constants.js.map +1 -0
  83. package/x/driver/parts/machina.d.ts +23 -0
  84. package/x/driver/parts/machina.js +14 -0
  85. package/x/driver/parts/machina.js.map +1 -0
  86. package/x/driver/utils/load-decoder-source.d.ts +2 -0
  87. package/x/driver/utils/load-decoder-source.js +12 -0
  88. package/x/driver/utils/load-decoder-source.js.map +1 -0
  89. package/x/driver/utils/sleep.d.ts +1 -0
  90. package/x/driver/utils/sleep.js +4 -0
  91. package/x/driver/utils/sleep.js.map +1 -0
  92. package/x/index.d.ts +2 -9
  93. package/x/index.html +105 -0
  94. package/x/index.html.d.ts +2 -0
  95. package/x/index.html.js +47 -0
  96. package/x/index.html.js.map +1 -0
  97. package/x/index.js +2 -29
  98. package/x/index.js.map +1 -1
  99. package/x/tests.test.d.ts +1 -0
  100. package/x/tests.test.js +6 -0
  101. package/x/tests.test.js.map +1 -0
  102. package/x/timeline/index.d.ts +10 -0
  103. package/x/timeline/index.js +11 -0
  104. package/x/timeline/index.js.map +1 -0
  105. package/x/timeline/parts/basics.d.ts +12 -0
  106. package/x/timeline/parts/basics.js +2 -0
  107. package/x/timeline/parts/basics.js.map +1 -0
  108. package/x/timeline/parts/filmstrip.d.ts +39 -0
  109. package/x/timeline/parts/filmstrip.js +117 -0
  110. package/x/timeline/parts/filmstrip.js.map +1 -0
  111. package/x/timeline/parts/item.d.ts +42 -0
  112. package/x/timeline/parts/item.js +13 -0
  113. package/x/timeline/parts/item.js.map +1 -0
  114. package/x/timeline/parts/media.d.ts +7 -0
  115. package/x/timeline/parts/media.js +13 -0
  116. package/x/timeline/parts/media.js.map +1 -0
  117. package/x/timeline/parts/resource-pool.d.ts +7 -0
  118. package/x/timeline/parts/resource-pool.js +19 -0
  119. package/x/timeline/parts/resource-pool.js.map +1 -0
  120. package/x/timeline/parts/resource.d.ts +8 -0
  121. package/x/timeline/parts/resource.js +2 -0
  122. package/x/timeline/parts/resource.js.map +1 -0
  123. package/x/timeline/parts/waveform.d.ts +8 -0
  124. package/x/timeline/parts/waveform.js +51 -0
  125. package/x/timeline/parts/waveform.js.map +1 -0
  126. package/x/timeline/sugar/o.d.ts +14 -0
  127. package/x/timeline/sugar/o.js +48 -0
  128. package/x/timeline/sugar/o.js.map +1 -0
  129. package/x/timeline/sugar/omni-test.d.ts +1 -0
  130. package/x/timeline/sugar/omni-test.js +22 -0
  131. package/x/timeline/sugar/omni-test.js.map +1 -0
  132. package/x/timeline/sugar/omni.d.ts +11 -0
  133. package/x/timeline/sugar/omni.js +20 -0
  134. package/x/timeline/sugar/omni.js.map +1 -0
  135. package/x/timeline/utils/checksum.d.ts +8 -0
  136. package/x/timeline/utils/checksum.js +20 -0
  137. package/x/timeline/utils/checksum.js.map +1 -0
  138. package/x/timeline/utils/datafile.d.ts +9 -0
  139. package/x/timeline/utils/datafile.js +20 -0
  140. package/x/timeline/utils/datafile.js.map +1 -0
  141. package/x/timeline/utils/dummy-data.d.ts +2 -0
  142. package/x/timeline/utils/dummy-data.js +3 -0
  143. package/x/timeline/utils/dummy-data.js.map +1 -0
  144. package/s/parts/compositor.ts +0 -5
  145. package/s/parts/export.ts +0 -5
  146. package/s/parts/video-decoder.ts +0 -27
  147. package/s/parts/video-encoder.ts +0 -15
  148. package/s/tools/generate-id.ts +0 -7
  149. package/s/tools/mp4boxjs/LICENSE.md +0 -24
  150. package/s/tools/mp4boxjs/demuxer.ts +0 -106
  151. package/s/tools/mp4boxjs/mp4box.adapter.ts +0 -148
  152. package/s/tools/mp4boxjs/mp4box.js +0 -8206
  153. package/s/types.ts +0 -10
  154. package/x/parts/compositor.d.ts +0 -4
  155. package/x/parts/compositor.js +0 -5
  156. package/x/parts/compositor.js.map +0 -1
  157. package/x/parts/export.d.ts +0 -7
  158. package/x/parts/export.js +0 -5
  159. package/x/parts/export.js.map +0 -1
  160. package/x/parts/video-decoder.d.ts +0 -8
  161. package/x/parts/video-decoder.js +0 -20
  162. package/x/parts/video-decoder.js.map +0 -1
  163. package/x/parts/video-encoder.d.ts +0 -6
  164. package/x/parts/video-encoder.js +0 -12
  165. package/x/parts/video-encoder.js.map +0 -1
  166. package/x/tools/generate-id.d.ts +0 -1
  167. package/x/tools/generate-id.js +0 -8
  168. package/x/tools/generate-id.js.map +0 -1
  169. package/x/tools/mp4boxjs/demuxer.d.ts +0 -24
  170. package/x/tools/mp4boxjs/demuxer.js +0 -88
  171. package/x/tools/mp4boxjs/demuxer.js.map +0 -1
  172. package/x/tools/mp4boxjs/mp4box.adapter.d.ts +0 -128
  173. package/x/tools/mp4boxjs/mp4box.adapter.js +0 -11
  174. package/x/tools/mp4boxjs/mp4box.adapter.js.map +0 -1
  175. package/x/types.d.ts +0 -7
  176. package/x/types.js +0 -2
  177. package/x/types.js.map +0 -1
@@ -0,0 +1,6 @@
1
+ import { Science } from "@e280/science";
2
+ import driver from "./driver/driver.test.js";
3
+ await Science.run({
4
+ driver,
5
+ });
6
+ //# sourceMappingURL=tests.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tests.test.js","sourceRoot":"","sources":["../s/tests.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAA;AACrC,OAAO,MAAM,MAAM,yBAAyB,CAAA;AAE5C,MAAM,OAAO,CAAC,GAAG,CAAC;IACjB,MAAM;CACN,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ export * from "./parts/basics.js";
2
+ export * from "./parts/item.js";
3
+ export * from "./parts/media.js";
4
+ export * from "./parts/resource-pool.js";
5
+ export * from "./parts/resource.js";
6
+ export * from "./parts/filmstrip.js";
7
+ export * from "./sugar/o.js";
8
+ export * from "./sugar/omni.js";
9
+ export * from "./utils/checksum.js";
10
+ export * from "./utils/datafile.js";
@@ -0,0 +1,11 @@
1
+ export * from "./parts/basics.js";
2
+ export * from "./parts/item.js";
3
+ export * from "./parts/media.js";
4
+ export * from "./parts/resource-pool.js";
5
+ export * from "./parts/resource.js";
6
+ export * from "./parts/filmstrip.js";
7
+ export * from "./sugar/o.js";
8
+ export * from "./sugar/omni.js";
9
+ export * from "./utils/checksum.js";
10
+ export * from "./utils/datafile.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../s/timeline/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAA;AACjC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,kBAAkB,CAAA;AAChC,cAAc,0BAA0B,CAAA;AACxC,cAAc,qBAAqB,CAAA;AACnC,cAAc,sBAAsB,CAAA;AAEpC,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAE/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,qBAAqB,CAAA"}
@@ -0,0 +1,12 @@
1
+ import { Item } from "./item.js";
2
+ /** sha256 hash */
3
+ export type Hash = string;
4
+ /** item identifier */
5
+ export type Id = number;
6
+ export type TimelineFile = {
7
+ info: "https://omniclip.app/";
8
+ format: "timeline";
9
+ version: number;
10
+ root: Id;
11
+ items: Item.Any[];
12
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=basics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"basics.js","sourceRoot":"","sources":["../../../s/timeline/parts/basics.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import { CanvasSinkOptions, WrappedCanvas } from "mediabunny";
2
+ import { DecoderSource } from '../../driver/fns/schematic.js';
3
+ export declare class Filmstrip {
4
+ #private;
5
+ private videoTrack;
6
+ private options;
7
+ private constructor();
8
+ static init(source: DecoderSource, options: FilmstripOptions): Promise<Filmstrip>;
9
+ /**
10
+ * Sets the frequency (granularity) of filmstrip thumbnails.
11
+ * Changing this triggers a filmstrip refresh after any ongoing update finishes.
12
+ * @param value - The new frequency in seconds.
13
+ */
14
+ set frequency(value: number);
15
+ get frequency(): number;
16
+ /**
17
+ * Updates the visible time range for the filmstrip.
18
+ *
19
+ * Triggers a thumbnails update, with extended margins to preload
20
+ * thumbnails slightly outside the visible range.
21
+ * @param visibleRange - The current timeline viewport as a [start, end] tuple in seconds.
22
+ */
23
+ set range(visibleRange: TimeRange);
24
+ /**
25
+ * Returns the cached thumbnail (if any) for a given timestamp.
26
+ * @param time - The timestamp to retrieve the canvas for.
27
+ */
28
+ getThumbnail(time: number): any;
29
+ }
30
+ type TimeRange = [number, number];
31
+ interface FilmstripOptions {
32
+ frequency?: number;
33
+ canvasSinkOptions?: CanvasSinkOptions;
34
+ onChange: (tiles: {
35
+ time: number;
36
+ canvas: WrappedCanvas;
37
+ }[]) => void;
38
+ }
39
+ export {};
@@ -0,0 +1,117 @@
1
+ import { ALL_FORMATS, CanvasSink, Input, } from "mediabunny";
2
+ import { loadDecoderSource } from '../../driver/utils/load-decoder-source.js';
3
+ export class Filmstrip {
4
+ videoTrack;
5
+ options;
6
+ #sink;
7
+ #cache = new Map();
8
+ #activeRange = [0, 0];
9
+ constructor(videoTrack, options) {
10
+ this.videoTrack = videoTrack;
11
+ this.options = options;
12
+ this.#sink = new CanvasSink(videoTrack, options.canvasSinkOptions);
13
+ }
14
+ static async init(source, options) {
15
+ const input = new Input({
16
+ formats: ALL_FORMATS,
17
+ source: await loadDecoderSource(source)
18
+ });
19
+ const videoTrack = await input.getPrimaryVideoTrack();
20
+ if (videoTrack)
21
+ return new Filmstrip(videoTrack, {
22
+ frequency: options.frequency ?? 1,
23
+ canvasSinkOptions: options.canvasSinkOptions ?? { width: 80, height: 50, fit: "fill" },
24
+ onChange: options.onChange
25
+ });
26
+ else
27
+ throw new Error("Source has no video track");
28
+ }
29
+ /**
30
+ * Sets the frequency (granularity) of filmstrip thumbnails.
31
+ * Changing this triggers a filmstrip refresh after any ongoing update finishes.
32
+ * @param value - The new frequency in seconds.
33
+ */
34
+ set frequency(value) {
35
+ if (value !== this.options.frequency) {
36
+ this.options.frequency = value;
37
+ this.#update();
38
+ }
39
+ }
40
+ get frequency() {
41
+ return this.options.frequency;
42
+ }
43
+ #computeActiveRange([start, end]) {
44
+ const tileSize = end - start;
45
+ return [start - tileSize, end + tileSize];
46
+ }
47
+ async #generateTiles() {
48
+ const [rangeStart, rangeEnd] = this.#activeRange;
49
+ const neededTimestamps = new Set();
50
+ // duration should be computed but with trim etc also
51
+ const duration = await this.videoTrack.computeDuration();
52
+ for (let timestamp = rangeStart; timestamp <= rangeEnd; timestamp += this.options.frequency) {
53
+ // Clamp to valid time range
54
+ if (timestamp >= 0 && timestamp <= duration)
55
+ neededTimestamps.add(+timestamp.toFixed(3));
56
+ }
57
+ const missingTimestamps = [...neededTimestamps]
58
+ .filter(t => !this.#cache.has(t));
59
+ let i = 0;
60
+ for await (const canvas of this.#sink.canvasesAtTimestamps(missingTimestamps)) {
61
+ if (canvas) {
62
+ const requestedTime = missingTimestamps[i++];
63
+ this.#cache.set(requestedTime, canvas);
64
+ }
65
+ }
66
+ // Dispose canvases outside the new range
67
+ for (const key of this.#cache.keys()) {
68
+ if (!neededTimestamps.has(key)) {
69
+ this.#cache.delete(key);
70
+ }
71
+ }
72
+ const tiles = [...this.#cache.entries()]
73
+ .map(([time, canvas]) => ({ time, canvas }));
74
+ this.options.onChange(tiles);
75
+ }
76
+ /**
77
+ * Updates the visible time range for the filmstrip.
78
+ *
79
+ * Triggers a thumbnails update, with extended margins to preload
80
+ * thumbnails slightly outside the visible range.
81
+ * @param visibleRange - The current timeline viewport as a [start, end] tuple in seconds.
82
+ */
83
+ set range(visibleRange) {
84
+ const newRange = this.#computeActiveRange(visibleRange);
85
+ // Avoid redundant updates
86
+ if (this.#activeRange[0] === newRange[0] &&
87
+ this.#activeRange[1] === newRange[1])
88
+ return;
89
+ this.#activeRange = newRange;
90
+ this.#update();
91
+ }
92
+ #updating = null;
93
+ #shouldRunAgain = false;
94
+ async #update() {
95
+ // Perform update immediately. If multiple updates are requested while updating,
96
+ // only the latest one will run after the current finishes (skips intermediate ones).
97
+ if (this.#updating) {
98
+ this.#shouldRunAgain = true;
99
+ return;
100
+ }
101
+ this.#updating = this.#generateTiles();
102
+ await this.#updating;
103
+ this.#updating = null;
104
+ if (this.#shouldRunAgain) {
105
+ this.#shouldRunAgain = false;
106
+ await this.#update();
107
+ }
108
+ }
109
+ /**
110
+ * Returns the cached thumbnail (if any) for a given timestamp.
111
+ * @param time - The timestamp to retrieve the canvas for.
112
+ */
113
+ getThumbnail(time) {
114
+ return this.#cache.get(time);
115
+ }
116
+ }
117
+ //# sourceMappingURL=filmstrip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filmstrip.js","sourceRoot":"","sources":["../../../s/timeline/parts/filmstrip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { Id, Hash } from "./basics.js";
2
+ export declare enum Kind {
3
+ Sequence = 0,
4
+ Stack = 1,
5
+ Clip = 2,
6
+ Text = 3,
7
+ Transition = 4
8
+ }
9
+ export declare enum Effect {
10
+ Crossfade = 0
11
+ }
12
+ export declare namespace Item {
13
+ type Sequence = {
14
+ id: Id;
15
+ kind: Kind.Sequence;
16
+ children: Id[];
17
+ };
18
+ type Stack = {
19
+ id: Id;
20
+ kind: Kind.Stack;
21
+ children: Id[];
22
+ };
23
+ type Clip = {
24
+ id: Id;
25
+ kind: Kind.Clip;
26
+ mediaHash: Hash;
27
+ start: number;
28
+ duration: number;
29
+ };
30
+ type Text = {
31
+ id: Id;
32
+ kind: Kind.Text;
33
+ content: string;
34
+ };
35
+ type Transition = {
36
+ id: Id;
37
+ kind: Kind.Transition;
38
+ effect: Effect.Crossfade;
39
+ duration: number;
40
+ };
41
+ type Any = (Sequence | Stack | Clip | Text | Transition);
42
+ }
@@ -0,0 +1,13 @@
1
+ export var Kind;
2
+ (function (Kind) {
3
+ Kind[Kind["Sequence"] = 0] = "Sequence";
4
+ Kind[Kind["Stack"] = 1] = "Stack";
5
+ Kind[Kind["Clip"] = 2] = "Clip";
6
+ Kind[Kind["Text"] = 3] = "Text";
7
+ Kind[Kind["Transition"] = 4] = "Transition";
8
+ })(Kind || (Kind = {}));
9
+ export var Effect;
10
+ (function (Effect) {
11
+ Effect[Effect["Crossfade"] = 0] = "Crossfade";
12
+ })(Effect || (Effect = {}));
13
+ //# sourceMappingURL=item.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item.js","sourceRoot":"","sources":["../../../s/timeline/parts/item.ts"],"names":[],"mappings":"AAGA,MAAM,CAAN,IAAY,IAMX;AAND,WAAY,IAAI;IACf,uCAAQ,CAAA;IACR,iCAAK,CAAA;IACL,+BAAI,CAAA;IACJ,+BAAI,CAAA;IACJ,2CAAU,CAAA;AACX,CAAC,EANW,IAAI,KAAJ,IAAI,QAMf;AAED,MAAM,CAAN,IAAY,MAEX;AAFD,WAAY,MAAM;IACjB,6CAAS,CAAA;AACV,CAAC,EAFW,MAAM,KAAN,MAAM,QAEjB"}
@@ -0,0 +1,7 @@
1
+ import { Datafile } from "../utils/datafile.js";
2
+ export declare class Media {
3
+ datafile: Datafile;
4
+ duration: number;
5
+ constructor(datafile: Datafile);
6
+ static analyze(datafile: Datafile): Promise<Media>;
7
+ }
@@ -0,0 +1,13 @@
1
+ export class Media {
2
+ datafile;
3
+ duration = 0;
4
+ constructor(datafile) {
5
+ this.datafile = datafile;
6
+ }
7
+ static async analyze(datafile) {
8
+ const media = new this(datafile);
9
+ media.duration = 10;
10
+ return media;
11
+ }
12
+ }
13
+ //# sourceMappingURL=media.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media.js","sourceRoot":"","sources":["../../../s/timeline/parts/media.ts"],"names":[],"mappings":"AAGA,MAAM,OAAO,KAAK;IAEE;IADnB,QAAQ,GAAG,CAAC,CAAA;IACZ,YAAmB,QAAkB;QAAlB,aAAQ,GAAR,QAAQ,CAAU;IAAG,CAAC;IAEzC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAkB;QACtC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,CAAA;QAChC,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAA;QACnB,OAAO,KAAK,CAAA;IACb,CAAC;CACD"}
@@ -0,0 +1,7 @@
1
+ import { Media } from "./media.js";
2
+ import { Datafile } from "../utils/datafile.js";
3
+ export declare class ResourcePool {
4
+ #private;
5
+ /** store a media file (avoids duplicates via hash) */
6
+ store(datafile: Datafile): Promise<Media>;
7
+ }
@@ -0,0 +1,19 @@
1
+ import { MapG } from "@e280/stz";
2
+ import { Media } from "./media.js";
3
+ export class ResourcePool {
4
+ #map = new MapG;
5
+ /** store a media file (avoids duplicates via hash) */
6
+ async store(datafile) {
7
+ const media = await Media.analyze(datafile);
8
+ const { hash } = media.datafile.checksum;
9
+ const { filename, bytes } = media.datafile;
10
+ if (this.#map.has(hash)) {
11
+ const alreadyExists = this.#map.require(hash);
12
+ alreadyExists.filename = filename;
13
+ }
14
+ else
15
+ this.#map.set(hash, { kind: "media", filename, bytes });
16
+ return media;
17
+ }
18
+ }
19
+ //# sourceMappingURL=resource-pool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource-pool.js","sourceRoot":"","sources":["../../../s/timeline/parts/resource-pool.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAE9B,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAA;AAIhC,MAAM,OAAO,YAAY;IACxB,IAAI,GAAG,IAAI,IAAwB,CAAA;IAEnC,sDAAsD;IACtD,KAAK,CAAC,KAAK,CAAC,QAAkB;QAC7B,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;QAC3C,MAAM,EAAC,IAAI,EAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAA;QACtC,MAAM,EAAC,QAAQ,EAAE,KAAK,EAAC,GAAG,KAAK,CAAC,QAAQ,CAAA;QAExC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;YAC7C,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAA;QAClC,CAAC;;YAEA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAC,CAAC,CAAA;QAEtD,OAAO,KAAK,CAAA;IACb,CAAC;CACD"}
@@ -0,0 +1,8 @@
1
+ export declare namespace Resource {
2
+ type Media = {
3
+ kind: "media";
4
+ filename: string;
5
+ bytes: Uint8Array;
6
+ };
7
+ type Any = Media;
8
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../../s/timeline/parts/resource.ts"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import WaveSurfer from "wavesurfer.js";
2
+ import { DecoderSource } from "../../driver/fns/schematic.js";
3
+ export declare class Waveform {
4
+ wavesurfer: WaveSurfer;
5
+ constructor(peaks: number[], container: HTMLElement, duration: number);
6
+ static init(source: DecoderSource, container: HTMLElement): Promise<Waveform>;
7
+ set width(value: number);
8
+ }
@@ -0,0 +1,51 @@
1
+ import WaveSurfer from "wavesurfer.js";
2
+ import { context } from "../../context.js";
3
+ export class Waveform {
4
+ wavesurfer;
5
+ constructor(peaks, container, duration) {
6
+ this.wavesurfer = WaveSurfer.create({
7
+ container,
8
+ waveColor: 'rgb(200, 0, 200)',
9
+ progressColor: 'rgb(100, 0, 100)',
10
+ barWidth: 10,
11
+ barRadius: 10,
12
+ barGap: 2,
13
+ peaks: [peaks],
14
+ duration
15
+ });
16
+ }
17
+ static async init(source, container) {
18
+ const driver = await context.driver;
19
+ const reader = driver.decode({ source }).audio.getReader();
20
+ const peaks = [];
21
+ let buffer = [];
22
+ const samplesPerPeak = 1024;
23
+ const duration = await driver.getAudioDuration(source);
24
+ while (true) {
25
+ const { done, value: audioData } = await reader.read();
26
+ if (done)
27
+ break;
28
+ const frames = audioData.numberOfFrames;
29
+ const plane = new Float32Array(frames);
30
+ audioData.copyTo(plane, { planeIndex: 0 }); // Use left channel only
31
+ for (let i = 0; i < plane.length; i++) {
32
+ buffer.push(plane[i]);
33
+ if (buffer.length >= samplesPerPeak) {
34
+ const chunk = buffer.splice(0, samplesPerPeak);
35
+ const min = Math.min(...chunk);
36
+ const max = Math.max(...chunk);
37
+ peaks.push(min, max);
38
+ }
39
+ }
40
+ audioData.close();
41
+ }
42
+ return new Waveform(peaks, container, duration ?? 0);
43
+ }
44
+ // set zoom(value: number) {
45
+ // this.wavesurfer.zoom(value)
46
+ // }
47
+ set width(value) {
48
+ this.wavesurfer.setOptions({ width: value });
49
+ }
50
+ }
51
+ //# sourceMappingURL=waveform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"waveform.js","sourceRoot":"","sources":["../../../s/timeline/parts/waveform.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,eAAe,CAAA;AAEtC,OAAO,EAAC,OAAO,EAAC,MAAM,kBAAkB,CAAA;AAGxC,MAAM,OAAO,QAAQ;IACpB,UAAU,CAAY;IAEtB,YAAY,KAAe,EAAE,SAAsB,EAAE,QAAgB;QACpE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC,MAAM,CAAC;YAClC,SAAS;YACT,SAAS,EAAE,kBAAkB;YAC7B,aAAa,EAAE,kBAAkB;YACjC,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,EAAE;YACb,MAAM,EAAE,CAAC;YACT,KAAK,EAAE,CAAC,KAAK,CAAC;YACd,QAAQ;SACT,CAAC,CAAA;IACH,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAqB,EAAE,SAAsB;QAC9D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAA;QACnC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,CAAA;QAE1D,MAAM,KAAK,GAAa,EAAE,CAAA;QAC1B,IAAI,MAAM,GAAa,EAAE,CAAA;QACzB,MAAM,cAAc,GAAG,IAAI,CAAA;QAC3B,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAA;QAEtD,OAAO,IAAI,EAAE,CAAC;YACb,MAAM,EAAC,IAAI,EAAE,KAAK,EAAE,SAAS,EAAC,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;YACpD,IAAI,IAAI;gBAAE,MAAK;YAEf,MAAM,MAAM,GAAG,SAAS,CAAC,cAAc,CAAA;YACvC,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,MAAM,CAAC,CAAA;YACtC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,EAAC,UAAU,EAAE,CAAC,EAAC,CAAC,CAAA,CAAC,wBAAwB;YAEjE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;gBACrB,IAAI,MAAM,CAAC,MAAM,IAAI,cAAc,EAAE,CAAC;oBACrC,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,cAAc,CAAC,CAAA;oBAC9C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;oBAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAA;oBAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;gBACrB,CAAC;YACF,CAAC;YAED,SAAS,CAAC,KAAK,EAAE,CAAA;QAClB,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,CAAC,CAAC,CAAA;IACrD,CAAC;IAED,4BAA4B;IAC5B,+BAA+B;IAC/B,IAAI;IAEJ,IAAI,KAAK,CAAC,KAAa;QACtB,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAC,KAAK,EAAE,KAAK,EAAC,CAAC,CAAA;IAC3C,CAAC;CACD"}
@@ -0,0 +1,14 @@
1
+ import { Media } from "../parts/media.js";
2
+ import { Item } from "../parts/item.js";
3
+ export declare class O {
4
+ #private;
5
+ register(item: Item.Any): number;
6
+ get items(): Item.Any[];
7
+ sequence: (...items: Item.Any[]) => Item.Sequence;
8
+ stack: (...items: Item.Any[]) => Item.Stack;
9
+ clip: (media: Media, start?: number, duration?: number) => Item.Clip;
10
+ text: (content: string) => Item.Text;
11
+ transition: {
12
+ crossfade: (duration: number) => Item.Transition;
13
+ };
14
+ }
@@ -0,0 +1,48 @@
1
+ import { MapG } from "@e280/stz";
2
+ import { Effect, Kind } from "../parts/item.js";
3
+ export class O {
4
+ #nextId = 0;
5
+ #items = new MapG();
6
+ #getId() {
7
+ return this.#nextId++;
8
+ }
9
+ register(item) {
10
+ if (!this.#items.has(item.id))
11
+ this.#items.set(item.id, item);
12
+ return item.id;
13
+ }
14
+ get items() {
15
+ return [...this.#items.values()];
16
+ }
17
+ sequence = (...items) => ({
18
+ id: this.#getId(),
19
+ kind: Kind.Sequence,
20
+ children: items.map(item => this.register(item)),
21
+ });
22
+ stack = (...items) => ({
23
+ id: this.#getId(),
24
+ kind: Kind.Stack,
25
+ children: items.map(item => this.register(item)),
26
+ });
27
+ clip = (media, start, duration) => ({
28
+ id: this.#getId(),
29
+ kind: Kind.Clip,
30
+ mediaHash: media.datafile.checksum.hash,
31
+ start: start ?? 0,
32
+ duration: duration ?? media.duration,
33
+ });
34
+ text = (content) => ({
35
+ id: this.#getId(),
36
+ kind: Kind.Text,
37
+ content,
38
+ });
39
+ transition = {
40
+ crossfade: (duration) => ({
41
+ id: this.#getId(),
42
+ kind: Kind.Transition,
43
+ effect: Effect.Crossfade,
44
+ duration,
45
+ }),
46
+ };
47
+ }
48
+ //# sourceMappingURL=o.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"o.js","sourceRoot":"","sources":["../../../s/timeline/sugar/o.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAG9B,OAAO,EAAC,MAAM,EAAQ,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAEnD,MAAM,OAAO,CAAC;IACb,OAAO,GAAG,CAAC,CAAA;IACX,MAAM,GAAG,IAAI,IAAI,EAAgB,CAAA;IAEjC,MAAM;QACL,OAAO,IAAI,CAAC,OAAO,EAAE,CAAA;IACtB,CAAC;IAED,QAAQ,CAAC,IAAc;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAA;QAC/B,OAAO,IAAI,CAAC,EAAE,CAAA;IACf,CAAC;IAED,IAAI,KAAK;QACR,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;IACjC,CAAC;IAED,QAAQ,GAAG,CAAC,GAAG,KAAiB,EAAiB,EAAE,CAAC,CAAC;QACpD,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,QAAQ;QACnB,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KAChD,CAAC,CAAA;IAEF,KAAK,GAAG,CAAC,GAAG,KAAiB,EAAc,EAAE,CAAC,CAAC;QAC9C,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,KAAK;QAChB,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;KAChD,CAAC,CAAA;IAEF,IAAI,GAAG,CAAC,KAAY,EAAE,KAAc,EAAE,QAAiB,EAAa,EAAE,CAAC,CAAC;QACvE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI;QACvC,KAAK,EAAE,KAAK,IAAI,CAAC;QACjB,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ;KACpC,CAAC,CAAA;IAEF,IAAI,GAAG,CAAC,OAAe,EAAa,EAAE,CAAC,CAAC;QACvC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;QACjB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,OAAO;KACP,CAAC,CAAA;IAEF,UAAU,GAAG;QACZ,SAAS,EAAE,CAAC,QAAgB,EAAmB,EAAE,CAAC,CAAC;YAClD,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;YACjB,IAAI,EAAE,IAAI,CAAC,UAAU;YACrB,MAAM,EAAE,MAAM,CAAC,SAAS;YACxB,QAAQ;SACR,CAAC;KACF,CAAA;CACD"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,22 @@
1
+ import { Omni } from "./omni.js";
2
+ import { dummyData } from "../utils/dummy-data.js";
3
+ //
4
+ // create an omni context
5
+ //
6
+ const omni = new Omni();
7
+ //
8
+ // load in some media resources
9
+ //
10
+ const { mediaA, mediaB } = await omni.load({
11
+ mediaA: dummyData(),
12
+ mediaB: dummyData(),
13
+ });
14
+ //
15
+ // create a timeline
16
+ //
17
+ const timeline = omni.timeline(o => o.sequence(o.clip(mediaA), o.transition.crossfade(600), o.stack(o.clip(mediaB), o.text("hello world"))));
18
+ //
19
+ // log the timeline
20
+ //
21
+ console.log(JSON.stringify(timeline, undefined, " "));
22
+ //# sourceMappingURL=omni-test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omni-test.js","sourceRoot":"","sources":["../../../s/timeline/sugar/omni-test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAC9B,OAAO,EAAC,SAAS,EAAC,MAAM,wBAAwB,CAAA;AAEhD,EAAE;AACF,yBAAyB;AACzB,EAAE;AAEF,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAA;AAEvB,EAAE;AACF,+BAA+B;AAC/B,EAAE;AAEF,MAAM,EAAC,MAAM,EAAE,MAAM,EAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC;IACxC,MAAM,EAAE,SAAS,EAAE;IACnB,MAAM,EAAE,SAAS,EAAE;CACnB,CAAC,CAAA;AAEF,EAAE;AACF,oBAAoB;AACpB,EAAE;AAEF,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAC7C,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EACd,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,EAC3B,CAAC,CAAC,KAAK,CACN,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,EACd,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CACrB,CACD,CAAC,CAAA;AAEF,EAAE;AACF,mBAAmB;AACnB,EAAE;AAEF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { O } from "./o.js";
2
+ import { Item } from "../parts/item.js";
3
+ import { Media } from "../parts/media.js";
4
+ import { TimelineFile } from "../parts/basics.js";
5
+ import { Datafile } from "../utils/datafile.js";
6
+ import { ResourcePool } from "../parts/resource-pool.js";
7
+ export declare class Omni {
8
+ resources: ResourcePool;
9
+ load: <S extends Record<string, Promise<Datafile>>>(spec: S) => Promise<{ [K in keyof S]: Media; }>;
10
+ timeline: (fn: (o: O) => Item.Sequence) => TimelineFile;
11
+ }
@@ -0,0 +1,20 @@
1
+ import { O } from "./o.js";
2
+ import { ResourcePool } from "../parts/resource-pool.js";
3
+ export class Omni {
4
+ resources = new ResourcePool();
5
+ load = async (spec) => {
6
+ return Object.fromEntries(await Promise.all(Object.entries(spec).map(async ([key, value]) => [key, await this.resources.store(await value)])));
7
+ };
8
+ timeline = (fn) => {
9
+ const o = new O();
10
+ const sequence = fn(o);
11
+ return {
12
+ format: "timeline",
13
+ info: "https://omniclip.app/",
14
+ version: 0,
15
+ root: o.register(sequence),
16
+ items: o.items,
17
+ };
18
+ };
19
+ }
20
+ //# sourceMappingURL=omni.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omni.js","sourceRoot":"","sources":["../../../s/timeline/sugar/omni.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,CAAC,EAAC,MAAM,QAAQ,CAAA;AAKxB,OAAO,EAAC,YAAY,EAAC,MAAM,2BAA2B,CAAA;AAEtD,MAAM,OAAO,IAAI;IAChB,SAAS,GAAG,IAAI,YAAY,EAAE,CAAA;IAE9B,IAAI,GAAG,KAAK,EAA8C,IAAO,EAAE,EAAE;QACpE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CACnE,KAAK,EAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CACrE,CAAC,CAA4B,CAAA;IAC/B,CAAC,CAAA;IAED,QAAQ,GAAG,CAAC,EAA2B,EAAgB,EAAE;QACxD,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAA;QACjB,MAAM,QAAQ,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;QACtB,OAAO;YACN,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EAAE,CAAC;YACV,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,KAAK,EAAE,CAAC,CAAC,KAAK;SACd,CAAA;IACF,CAAC,CAAA;CACD"}
@@ -0,0 +1,8 @@
1
+ export declare class Checksum {
2
+ data: Uint8Array;
3
+ bytes: Uint8Array;
4
+ hash: string;
5
+ nickname: string;
6
+ constructor(data: Uint8Array, bytes: Uint8Array, hash: string, nickname: string);
7
+ static make(data: Uint8Array): Promise<Checksum>;
8
+ }
@@ -0,0 +1,20 @@
1
+ import { Hex, Thumbprint } from "@e280/stz";
2
+ export class Checksum {
3
+ data;
4
+ bytes;
5
+ hash;
6
+ nickname;
7
+ constructor(data, bytes, hash, nickname) {
8
+ this.data = data;
9
+ this.bytes = bytes;
10
+ this.hash = hash;
11
+ this.nickname = nickname;
12
+ }
13
+ static async make(data) {
14
+ const bytes = new Uint8Array(await crypto.subtle.digest("SHA-256", data));
15
+ const hash = Hex.fromBytes(bytes);
16
+ const nickname = Thumbprint.sigil.fromBytes(bytes);
17
+ return new this(data, bytes, hash, nickname);
18
+ }
19
+ }
20
+ //# sourceMappingURL=checksum.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checksum.js","sourceRoot":"","sources":["../../../s/timeline/utils/checksum.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAE,UAAU,EAAC,MAAM,WAAW,CAAA;AAEzC,MAAM,OAAO,QAAQ;IAEZ;IACA;IACA;IACA;IAJR,YACQ,IAAgB,EAChB,KAAiB,EACjB,IAAY,EACZ,QAAgB;QAHhB,SAAI,GAAJ,IAAI,CAAY;QAChB,UAAK,GAAL,KAAK,CAAY;QACjB,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAQ;IACrB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAgB;QACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAA;QACzE,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAClD,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC7C,CAAC;CACD"}
@@ -0,0 +1,9 @@
1
+ import { Checksum } from "./checksum.js";
2
+ export declare class Datafile {
3
+ bytes: Uint8Array;
4
+ filename: string;
5
+ checksum: Checksum;
6
+ constructor(bytes: Uint8Array, filename: string, checksum: Checksum);
7
+ static make(bytes: Uint8Array, name?: string): Promise<Datafile>;
8
+ static load(_path: string): Promise<Datafile>;
9
+ }
@@ -0,0 +1,20 @@
1
+ import { Checksum } from "./checksum.js";
2
+ export class Datafile {
3
+ bytes;
4
+ filename;
5
+ checksum;
6
+ constructor(bytes, filename, checksum) {
7
+ this.bytes = bytes;
8
+ this.filename = filename;
9
+ this.checksum = checksum;
10
+ }
11
+ static async make(bytes, name) {
12
+ const checksum = await Checksum.make(bytes);
13
+ const filename = name ?? checksum.nickname;
14
+ return new this(bytes, filename, checksum);
15
+ }
16
+ static async load(_path) {
17
+ throw new Error("TODO implement");
18
+ }
19
+ }
20
+ //# sourceMappingURL=datafile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"datafile.js","sourceRoot":"","sources":["../../../s/timeline/utils/datafile.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,eAAe,CAAA;AAEtC,MAAM,OAAO,QAAQ;IAEZ;IACA;IACA;IAHR,YACQ,KAAiB,EACjB,QAAgB,EAChB,QAAkB;QAFlB,UAAK,GAAL,KAAK,CAAY;QACjB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,aAAQ,GAAR,QAAQ,CAAU;IACvB,CAAC;IAEJ,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAiB,EAAE,IAAa;QACjD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC3C,MAAM,QAAQ,GAAG,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAA;QAC1C,OAAO,IAAI,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC3C,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAa;QAC9B,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAA;IAClC,CAAC;CACD"}