@aelionsdk/transaction 0.1.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FoyonaCZY and AelionSDK contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # @aelionsdk/transaction
2
+
3
+ Atomic project transactions, inverses and change sets for AelionSDK
4
+
5
+ Install with `npm install @aelionsdk/transaction@next`.
6
+
7
+ Version 0.1.0-beta.1 is a prerelease and its API may change before the first stable release. This package is part of [AelionSDK](https://github.com/FoyonaCZY/AelionSDK); see the repository README for supported browsers, examples and deployment requirements.
@@ -0,0 +1,5 @@
1
+ import type { AelionProject, TimeRange } from '@aelionsdk/project-schema';
2
+ import type { AffectedRange, AtomicOperation } from './types.js';
3
+ export declare function collectAffectedRanges(before: AelionProject, after: AelionProject, operations: readonly AtomicOperation[]): readonly AffectedRange[];
4
+ export declare function rangeEnd(range: TimeRange): number;
5
+ //# sourceMappingURL=affected-ranges.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"affected-ranges.d.ts","sourceRoot":"","sources":["../src/affected-ranges.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,aAAa,EAIb,SAAS,EACV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAsJjE,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,aAAa,EACrB,KAAK,EAAE,aAAa,EACpB,UAAU,EAAE,SAAS,eAAe,EAAE,GACrC,SAAS,aAAa,EAAE,CAO1B;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAEjD"}
@@ -0,0 +1,144 @@
1
+ function itemRange(project, item) {
2
+ const sequenceId = project.tracks[item.trackId]?.sequenceId;
3
+ if (sequenceId === undefined)
4
+ return undefined;
5
+ return { sequenceId, startUs: item.range.startUs, durationUs: item.range.durationUs };
6
+ }
7
+ function rangesForItemIds(project, ids) {
8
+ return ids.flatMap(id => {
9
+ const item = project.items[id];
10
+ if (item === undefined)
11
+ return [];
12
+ const range = itemRange(project, item);
13
+ return range === undefined ? [] : [range];
14
+ });
15
+ }
16
+ function ownerRanges(project, collection, id) {
17
+ switch (collection) {
18
+ case 'items': {
19
+ const item = project.items[id];
20
+ if (item === undefined)
21
+ return [];
22
+ const range = itemRange(project, item);
23
+ return range === undefined ? [] : [range];
24
+ }
25
+ case 'transitions': {
26
+ const transition = project.transitions[id];
27
+ return transition === undefined
28
+ ? []
29
+ : [{ sequenceId: transition.sequenceId, ...transition.range }];
30
+ }
31
+ case 'tracks': {
32
+ const track = project.tracks[id];
33
+ return track === undefined ? [] : rangesForItemIds(project, track.itemIds);
34
+ }
35
+ case 'sequences': {
36
+ const sequence = project.sequences[id];
37
+ if (sequence === undefined)
38
+ return [];
39
+ return sequence.trackIds.flatMap(trackId => {
40
+ const track = project.tracks[trackId];
41
+ return track === undefined ? [] : rangesForItemIds(project, track.itemIds);
42
+ });
43
+ }
44
+ case 'materialInstances': {
45
+ const ranges = [];
46
+ for (const sequence of Object.values(project.sequences)) {
47
+ if (sequence.materialInstanceIds.includes(id)) {
48
+ ranges.push(...ownerRanges(project, 'sequences', sequence.id));
49
+ }
50
+ }
51
+ for (const track of Object.values(project.tracks)) {
52
+ if (track.materialInstanceIds.includes(id)) {
53
+ ranges.push(...ownerRanges(project, 'tracks', track.id));
54
+ }
55
+ }
56
+ for (const item of Object.values(project.items)) {
57
+ if (item.materialInstanceIds.includes(id)) {
58
+ ranges.push(...ownerRanges(project, 'items', item.id));
59
+ }
60
+ }
61
+ for (const transition of Object.values(project.transitions)) {
62
+ if (transition.materialInstanceId === id) {
63
+ ranges.push(...ownerRanges(project, 'transitions', transition.id));
64
+ }
65
+ }
66
+ return ranges;
67
+ }
68
+ case 'assets': {
69
+ const ids = Object.values(project.items)
70
+ .filter(item => {
71
+ const source = item.source;
72
+ return (source !== null &&
73
+ typeof source === 'object' &&
74
+ !Array.isArray(source) &&
75
+ source.assetId === id);
76
+ })
77
+ .map(item => item.id);
78
+ return rangesForItemIds(project, ids);
79
+ }
80
+ case 'linkGroups': {
81
+ const linkGroup = project.linkGroups[id];
82
+ const ids = linkGroup?.itemIds;
83
+ return Array.isArray(ids) && ids.every(value => typeof value === 'string')
84
+ ? rangesForItemIds(project, ids)
85
+ : [];
86
+ }
87
+ case 'markers': {
88
+ const marker = project.markers[id];
89
+ if (marker === undefined)
90
+ return [];
91
+ const owner = marker.owner;
92
+ const startUs = marker.timeUs;
93
+ const durationUs = marker.durationUs;
94
+ if (owner.type === 'sequence')
95
+ return [{ sequenceId: owner.id, startUs, durationUs }];
96
+ const item = project.items[owner.id];
97
+ const base = item === undefined ? undefined : itemRange(project, item);
98
+ return base === undefined ? [] : [{ ...base, startUs: base.startUs + startUs, durationUs }];
99
+ }
100
+ }
101
+ }
102
+ function mergeRanges(ranges) {
103
+ const sorted = [...ranges]
104
+ .filter(range => range.durationUs >= 0)
105
+ .sort((left, right) => left.sequenceId.localeCompare(right.sequenceId) ||
106
+ left.startUs - right.startUs ||
107
+ left.durationUs - right.durationUs);
108
+ const merged = [];
109
+ for (const range of sorted) {
110
+ const previous = merged.at(-1);
111
+ const rangeEnd = range.startUs + range.durationUs;
112
+ if (previous !== undefined &&
113
+ previous.sequenceId === range.sequenceId &&
114
+ range.startUs <= previous.startUs + previous.durationUs) {
115
+ const previousEnd = previous.startUs + previous.durationUs;
116
+ previous.durationUs = Math.max(previousEnd, rangeEnd) - previous.startUs;
117
+ continue;
118
+ }
119
+ merged.push({ ...range });
120
+ }
121
+ return merged;
122
+ }
123
+ function operationRanges(project, operation) {
124
+ // Reordering a Track's itemIds only changes the compositing order of the
125
+ // referenced Item. Treating it as a generic Track edit invalidates every
126
+ // Item on the Track and defeats incremental compilation for insert/move.
127
+ if (operation.collection === 'tracks' &&
128
+ 'path' in operation &&
129
+ operation.path.length === 1 &&
130
+ operation.path[0] === 'itemIds' &&
131
+ 'valueId' in operation) {
132
+ return rangesForItemIds(project, [operation.valueId]);
133
+ }
134
+ return ownerRanges(project, operation.collection, operation.id);
135
+ }
136
+ export function collectAffectedRanges(before, after, operations) {
137
+ return mergeRanges(operations.flatMap(operation => [
138
+ ...operationRanges(before, operation),
139
+ ...operationRanges(after, operation),
140
+ ]));
141
+ }
142
+ export function rangeEnd(range) {
143
+ return range.startUs + range.durationUs;
144
+ }
@@ -0,0 +1,166 @@
1
+ import type { JsonValue } from '@aelionsdk/core';
2
+ import type { EntityId, ItemEntity, MarkerEntity } from '@aelionsdk/project-schema';
3
+ import type { TransactionHost } from './history.js';
4
+ import type { EditOptions, TransactionCommit } from './types.js';
5
+ export type CommandOptions = EditOptions;
6
+ export interface InsertItemOptions extends CommandOptions {
7
+ readonly item: ItemEntity;
8
+ readonly beforeItemId?: EntityId;
9
+ }
10
+ export interface RemoveItemOptions extends CommandOptions {
11
+ readonly itemId: EntityId;
12
+ }
13
+ export interface MoveItemOptions extends CommandOptions {
14
+ readonly itemId: EntityId;
15
+ readonly toTrackId?: EntityId;
16
+ readonly startUs?: number;
17
+ /** Omit to preserve order on the same Track; null explicitly moves to the end. */
18
+ readonly beforeItemId?: EntityId | null;
19
+ }
20
+ export interface TrimItemOptions extends CommandOptions {
21
+ readonly itemId: EntityId;
22
+ readonly edge: 'start' | 'end';
23
+ /** New edge position in Sequence time. */
24
+ readonly toUs: number;
25
+ }
26
+ export interface SplitItemOptions extends CommandOptions {
27
+ readonly itemId: EntityId;
28
+ readonly rightItemId: EntityId;
29
+ /** Split position in Sequence time. */
30
+ readonly atUs: number;
31
+ }
32
+ export interface SplitItemResult {
33
+ readonly commit: TransactionCommit;
34
+ readonly leftItemId: EntityId;
35
+ readonly rightItemId: EntityId;
36
+ }
37
+ export interface ReplaceItemOptions extends CommandOptions {
38
+ readonly itemId: EntityId;
39
+ /**
40
+ * Complete replacement entity. ID, Track and ownership references must stay
41
+ * unchanged; structural relocation uses moveItem instead.
42
+ */
43
+ readonly replacement: ItemEntity;
44
+ }
45
+ export interface ReorderTrackOptions extends CommandOptions {
46
+ readonly sequenceId: EntityId;
47
+ readonly trackId: EntityId;
48
+ readonly beforeTrackId?: EntityId;
49
+ }
50
+ export interface SetTrackFlagOptions extends CommandOptions {
51
+ readonly trackId: EntityId;
52
+ readonly value: boolean;
53
+ }
54
+ export interface LinkItemsOptions extends CommandOptions {
55
+ readonly groupId: EntityId;
56
+ readonly itemIds: readonly EntityId[];
57
+ readonly kind?: 'av-sync' | 'edit-group';
58
+ }
59
+ export interface UnlinkItemsOptions extends CommandOptions {
60
+ readonly groupId: EntityId;
61
+ /** Omit to unlink every member and delete the group. */
62
+ readonly itemIds?: readonly EntityId[];
63
+ }
64
+ export interface MoveLinkedGroupOptions extends CommandOptions {
65
+ readonly groupId: EntityId;
66
+ readonly deltaUs: number;
67
+ }
68
+ export interface SlipItemOptions extends CommandOptions {
69
+ readonly itemId: EntityId;
70
+ /** Signed source presentation-time offset. Timeline range is unchanged. */
71
+ readonly deltaSourceUs: number;
72
+ }
73
+ export interface RollEditOptions extends CommandOptions {
74
+ readonly leftItemId: EntityId;
75
+ readonly rightItemId: EntityId;
76
+ /** New shared boundary in Sequence time. */
77
+ readonly toUs: number;
78
+ }
79
+ export interface SlideItemOptions extends CommandOptions {
80
+ readonly itemId: EntityId;
81
+ readonly deltaUs: number;
82
+ }
83
+ export interface RippleInsertItemOptions extends InsertItemOptions {
84
+ /** Defaults to every Track in the target Sequence. */
85
+ readonly trackIds?: readonly EntityId[];
86
+ }
87
+ export interface RippleRemoveItemOptions extends RemoveItemOptions {
88
+ /** Defaults to every Track in the source Sequence. */
89
+ readonly trackIds?: readonly EntityId[];
90
+ }
91
+ export interface AddMarkerOptions extends CommandOptions {
92
+ readonly marker: MarkerEntity;
93
+ }
94
+ export interface UpdateMarkerOptions extends CommandOptions {
95
+ readonly markerId: EntityId;
96
+ readonly timeUs?: number;
97
+ readonly durationUs?: number;
98
+ readonly markerLabel?: string | null;
99
+ readonly markerColor?: string | null;
100
+ readonly payload?: JsonValue;
101
+ }
102
+ export interface RemoveMarkerOptions extends CommandOptions {
103
+ readonly markerId: EntityId;
104
+ }
105
+ export interface SetSelectionMetadataOptions extends CommandOptions {
106
+ readonly sequenceId: EntityId;
107
+ readonly itemIds: readonly EntityId[];
108
+ readonly range?: {
109
+ readonly startUs: number;
110
+ readonly durationUs: number;
111
+ };
112
+ }
113
+ export interface TrimLinkedGroupOptions extends CommandOptions {
114
+ readonly groupId: EntityId;
115
+ readonly edge: 'start' | 'end';
116
+ /** Signed trim amount applied to every member; must be positive. */
117
+ readonly amountUs: number;
118
+ }
119
+ export interface RemoveLinkedGroupOptions extends CommandOptions {
120
+ readonly groupId: EntityId;
121
+ }
122
+ export interface SplitLinkedGroupOptions extends CommandOptions {
123
+ readonly groupId: EntityId;
124
+ readonly rightGroupId: EntityId;
125
+ /** Sequence time; every member must contain this point. */
126
+ readonly atUs: number;
127
+ readonly rightItemIds: Readonly<Record<EntityId, EntityId>>;
128
+ }
129
+ export interface SplitLinkedGroupResult {
130
+ readonly commit: TransactionCommit;
131
+ readonly leftGroupId: EntityId;
132
+ readonly rightGroupId: EntityId;
133
+ readonly rightItemIds: Readonly<Record<EntityId, EntityId>>;
134
+ }
135
+ /** Domain-level editing commands built exclusively from atomic transactions. */
136
+ export declare class EditingCommands {
137
+ #private;
138
+ constructor(host: TransactionHost);
139
+ insertItem(options: InsertItemOptions): TransactionCommit;
140
+ removeItem(options: RemoveItemOptions): TransactionCommit;
141
+ rippleInsertItem(options: RippleInsertItemOptions): TransactionCommit;
142
+ rippleRemoveItem(options: RippleRemoveItemOptions): TransactionCommit;
143
+ moveItem(options: MoveItemOptions): TransactionCommit;
144
+ trimItem(options: TrimItemOptions): TransactionCommit;
145
+ splitItem(options: SplitItemOptions): SplitItemResult;
146
+ replaceItem(options: ReplaceItemOptions): TransactionCommit;
147
+ linkItems(options: LinkItemsOptions): TransactionCommit;
148
+ unlinkItems(options: UnlinkItemsOptions): TransactionCommit;
149
+ moveLinkedGroup(options: MoveLinkedGroupOptions): TransactionCommit;
150
+ trimLinkedGroup(options: TrimLinkedGroupOptions): TransactionCommit;
151
+ removeLinkedGroup(options: RemoveLinkedGroupOptions): TransactionCommit;
152
+ splitLinkedGroup(options: SplitLinkedGroupOptions): SplitLinkedGroupResult;
153
+ slipItem(options: SlipItemOptions): TransactionCommit;
154
+ rollEdit(options: RollEditOptions): TransactionCommit;
155
+ slideItem(options: SlideItemOptions): TransactionCommit;
156
+ addMarker(options: AddMarkerOptions): TransactionCommit;
157
+ updateMarker(options: UpdateMarkerOptions): TransactionCommit;
158
+ removeMarker(options: RemoveMarkerOptions): TransactionCommit;
159
+ setSelectionMetadata(options: SetSelectionMetadataOptions): TransactionCommit;
160
+ reorderTrack(options: ReorderTrackOptions): TransactionCommit;
161
+ setTrackLocked(options: SetTrackFlagOptions): TransactionCommit;
162
+ setTrackEnabled(options: SetTrackFlagOptions): TransactionCommit;
163
+ setTrackMuted(options: SetTrackFlagOptions): TransactionCommit;
164
+ setTrackSolo(options: SetTrackFlagOptions): TransactionCommit;
165
+ }
166
+ //# sourceMappingURL=commands.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.d.ts","sourceRoot":"","sources":["../src/commands.ts"],"names":[],"mappings":"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"}