@veltdev/sdk 5.0.2-beta.7 → 5.0.2-beta.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.
@@ -1,8 +1,8 @@
1
1
  import { ResolverActions } from "../../utils/enums";
2
2
  import { ResolverConfig, ResolverResponse } from "./resolver.data.model";
3
3
  export interface AttachmentDataProvider {
4
- save: (request: SaveAttachmentResolverRequest) => Promise<ResolverResponse<SaveAttachmentResolverData>>;
5
- delete: (request: DeleteAttachmentResolverRequest) => Promise<ResolverResponse<undefined>>;
4
+ save?: (request: SaveAttachmentResolverRequest) => Promise<ResolverResponse<SaveAttachmentResolverData>>;
5
+ delete?: (request: DeleteAttachmentResolverRequest) => Promise<ResolverResponse<undefined>>;
6
6
  config?: ResolverConfig;
7
7
  }
8
8
  export interface DeleteAttachmentResolverRequest {
@@ -53,6 +53,7 @@ export interface UploadFileOptions {
53
53
  file: File;
54
54
  useAttachmentResolver?: boolean;
55
55
  metadata?: any;
56
+ attachmentScope?: string;
56
57
  }
57
58
  export interface UploadFileData {
58
59
  files: File[];
@@ -4,9 +4,9 @@ import { BaseMetadata } from "./base-metadata.data.model";
4
4
  import { CommentAnnotation } from "./comment-annotation.data.model";
5
5
  import { ResolverConfig, ResolverResponse } from "./resolver.data.model";
6
6
  export interface CommentAnnotationDataProvider {
7
- get: (request: GetCommentResolverRequest) => Promise<ResolverResponse<Record<string, PartialCommentAnnotation>>>;
8
- save: (request: SaveCommentResolverRequest) => Promise<ResolverResponse<undefined>>;
9
- delete: (request: DeleteCommentResolverRequest) => Promise<ResolverResponse<undefined>>;
7
+ get?: (request: GetCommentResolverRequest) => Promise<ResolverResponse<Record<string, PartialCommentAnnotation>>>;
8
+ save?: (request: SaveCommentResolverRequest) => Promise<ResolverResponse<undefined>>;
9
+ delete?: (request: DeleteCommentResolverRequest) => Promise<ResolverResponse<undefined>>;
10
10
  config?: ResolverConfig;
11
11
  }
12
12
  export interface GetCommentResolverRequest {
@@ -7,6 +7,7 @@ export type CoreEventTypesMap = {
7
7
  [CoreEventTypes.COMMENT_RESOLVER]: CommentResolverEvent;
8
8
  [CoreEventTypes.ATTACHMENT_RESOLVER]: AttachmentResolverEvent;
9
9
  [CoreEventTypes.REACTION_RESOLVER]: ReactionResolverEvent;
10
+ [CoreEventTypes.RECORDER_RESOLVER]: RecorderResolverEvent;
10
11
  [CoreEventTypes.VELT_BUTTON_CLICK]: VeltButtonClickEvent;
11
12
  [CoreEventTypes.USER_UPDATE]: UserUpdateEvent;
12
13
  [CoreEventTypes.DOCUMENT_INIT]: DocumentInitEvent;
@@ -147,6 +148,35 @@ export type ReactionResolverEventType = {
147
148
  REACTION_DELETE_RESULT: 'reactionDeleteResult';
148
149
  REACTION_DELETE_ERROR: 'reactionDeleteError';
149
150
  };
151
+ export declare enum RecorderResolverSource {
152
+ RESOLVE_RECORDER_ANNOTATIONS = "resolveRecorderAnnotations",
153
+ SAVE_RECORDER_ANNOTATION = "saveRecorderAnnotation",
154
+ DELETE_RECORDER_ANNOTATION = "deleteRecorderAnnotation",
155
+ FORMAT_RESPONSE = "formatResponse",
156
+ INIT_DOCUMENTS = "initDocuments",
157
+ SET_DATA = "setData",
158
+ UPDATE_DATA = "updateData",
159
+ DELETE_DATA = "deleteData"
160
+ }
161
+ export declare enum RecorderResolverModuleName {
162
+ GET_RECORDER_ANNOTATIONS = "getRecorderAnnotations"
163
+ }
164
+ export type RecorderResolverEvent = BaseResolverEvent<RecorderResolverEventType, RecorderResolverSource, RecorderResolverModuleName>;
165
+ export type RecorderResolverEventType = {
166
+ RECORDER_RESOLUTION_REQUEST_FORMED: 'recorderResolutionRequestFormed';
167
+ RECORDER_RESOLUTION_REQUEST_TRIGGERED: 'recorderResolutionRequestTriggered';
168
+ RECORDER_RESOLUTION_RESULT: 'recorderResolutionResult';
169
+ RECORDER_RESOLUTION_ERROR: 'recorderResolutionError';
170
+ RECORDER_RESOLUTION_RESULT_FROM_CACHE: 'recorderResolutionResultFromCache';
171
+ RECORDER_SAVE_REQUEST_FORMED: 'recorderSaveRequestFormed';
172
+ RECORDER_SAVE_REQUEST_TRIGGERED: 'recorderSaveRequestTriggered';
173
+ RECORDER_SAVE_RESULT: 'recorderSaveResult';
174
+ RECORDER_SAVE_ERROR: 'recorderSaveError';
175
+ RECORDER_DELETE_REQUEST_FORMED: 'recorderDeleteRequestFormed';
176
+ RECORDER_DELETE_REQUEST_TRIGGERED: 'recorderDeleteRequestTriggered';
177
+ RECORDER_DELETE_RESULT: 'recorderDeleteResult';
178
+ RECORDER_DELETE_ERROR: 'recorderDeleteError';
179
+ };
150
180
  export type ErrorEvent = {
151
181
  event?: string;
152
182
  sourceMethod?: string;
@@ -58,3 +58,54 @@ export interface CrdtDeleteVersionQuery {
58
58
  id: string;
59
59
  versionId: string;
60
60
  }
61
+ export interface CrdtPushMessageQuery {
62
+ id: string;
63
+ data: number[];
64
+ yjsClientId: number;
65
+ messageType?: 'sync' | 'awareness';
66
+ /** User-facing value for event emission only (not stored in database) */
67
+ eventData?: unknown;
68
+ /** Yjs data type: 'text' | 'map' | 'array' | 'xml' | 'xmltext' */
69
+ type?: string;
70
+ /** Content key used in Y.Doc shared types */
71
+ contentKey?: string;
72
+ /** Editor/library source: 'tiptap', 'plate', 'codemirror', etc. */
73
+ source?: string;
74
+ }
75
+ export interface CrdtOnMessageQuery {
76
+ id: string;
77
+ callback: (message: CrdtMessageData) => void;
78
+ afterTs?: number;
79
+ }
80
+ export interface CrdtMessageData {
81
+ data: number[];
82
+ yjsClientId: number;
83
+ timestamp: number;
84
+ }
85
+ export interface CrdtSnapshotData {
86
+ state?: Uint8Array | number[];
87
+ vector?: Uint8Array | number[];
88
+ timestamp?: number;
89
+ }
90
+ export interface CrdtGetSnapshotQuery {
91
+ id: string;
92
+ }
93
+ export interface CrdtSaveSnapshotQuery {
94
+ id: string;
95
+ state: Uint8Array | number[];
96
+ vector: Uint8Array | number[];
97
+ /** Yjs data type: 'text' | 'map' | 'array' | 'xml' | 'xmltext' */
98
+ type?: string;
99
+ /** Content key used in Y.Doc shared types */
100
+ contentKey?: string;
101
+ /** Editor/library source: 'tiptap', 'plate', 'codemirror', etc. */
102
+ source?: string;
103
+ }
104
+ export interface CrdtGetMessagesQuery {
105
+ id: string;
106
+ afterTs?: number;
107
+ }
108
+ export interface CrdtPruneMessagesQuery {
109
+ id: string;
110
+ beforeTs: number;
111
+ }
@@ -1,6 +1,7 @@
1
1
  import { CommentAnnotationDataProvider } from "./comment-resolver.data.model";
2
2
  import { AttachmentDataProvider } from "./attachment-resolver.data.model";
3
3
  import { ReactionAnnotationDataProvider } from "./reaction-resolver.data.model";
4
+ import { RecorderAnnotationDataProvider } from "./recorder-resolver.data.model";
4
5
  import { AnonymousUserDataProvider, UserDataProvider } from "./user-resolver.data.model";
5
6
  export interface VeltDataProvider {
6
7
  comment?: CommentAnnotationDataProvider;
@@ -8,4 +9,5 @@ export interface VeltDataProvider {
8
9
  reaction?: ReactionAnnotationDataProvider;
9
10
  attachment?: AttachmentDataProvider;
10
11
  anonymousUser?: AnonymousUserDataProvider;
12
+ recorder?: RecorderAnnotationDataProvider;
11
13
  }
@@ -4,9 +4,9 @@ import { PartialUser } from "./comment-resolver.data.model";
4
4
  import { ReactionAnnotation } from "./reaction-annotation.data.model";
5
5
  import { ResolverConfig, ResolverResponse } from "./resolver.data.model";
6
6
  export interface ReactionAnnotationDataProvider {
7
- get: (request: GetReactionResolverRequest) => Promise<ResolverResponse<Record<string, PartialReactionAnnotation>>>;
8
- save: (request: SaveReactionResolverRequest) => Promise<ResolverResponse<undefined>>;
9
- delete: (request: DeleteReactionResolverRequest) => Promise<ResolverResponse<undefined>>;
7
+ get?: (request: GetReactionResolverRequest) => Promise<ResolverResponse<Record<string, PartialReactionAnnotation>>>;
8
+ save?: (request: SaveReactionResolverRequest) => Promise<ResolverResponse<undefined>>;
9
+ delete?: (request: DeleteReactionResolverRequest) => Promise<ResolverResponse<undefined>>;
10
10
  config?: ResolverConfig;
11
11
  }
12
12
  export interface GetReactionResolverRequest {
@@ -150,6 +150,17 @@ export declare class RecorderAnnotation {
150
150
  chunkUrls?: {
151
151
  [key: number]: string;
152
152
  };
153
+ /**
154
+ * Whether the recorder resolver is used for this annotation.
155
+ * Used by UI components to show loading states while resolver data is being fetched.
156
+ */
157
+ isRecorderResolverUsed?: boolean;
158
+ /**
159
+ * Whether the real recording URL is available.
160
+ * Set to false when the annotation is first saved (URL is still a local blob),
161
+ * and true once the actual URL from storage is available after the async upload completes.
162
+ */
163
+ isUrlAvailable?: boolean;
153
164
  }
154
165
  export interface RecorderAnnotationEditVersion {
155
166
  from?: User;
@@ -0,0 +1,58 @@
1
+ import { ResolverActions } from "../../utils/enums";
2
+ import { AttachmentDataProvider } from "./attachment-resolver.data.model";
3
+ import { BaseMetadata } from "./base-metadata.data.model";
4
+ import { RecorderAnnotation } from "./recorder-annotation.data.model";
5
+ import { ResolverConfig, ResolverResponse } from "./resolver.data.model";
6
+ import { Attachment } from "./attachment.model";
7
+ import { Transcription } from "./transcription.data.model";
8
+ import { User } from "./user.data.model";
9
+ export interface RecorderAnnotationDataProvider {
10
+ get?: (request: GetRecorderResolverRequest) => Promise<ResolverResponse<Record<string, PartialRecorderAnnotation>>>;
11
+ save?: (request: SaveRecorderResolverRequest) => Promise<ResolverResponse<SaveRecorderResolverData | undefined>>;
12
+ delete?: (request: DeleteRecorderResolverRequest) => Promise<ResolverResponse<undefined>>;
13
+ config?: ResolverConfig;
14
+ uploadChunks?: boolean;
15
+ storage?: AttachmentDataProvider;
16
+ }
17
+ export interface GetRecorderResolverRequest {
18
+ organizationId: string;
19
+ recorderAnnotationIds?: string[];
20
+ documentIds?: string[];
21
+ }
22
+ export interface SaveRecorderResolverRequest {
23
+ recorderAnnotation: Record<string, PartialRecorderAnnotation>;
24
+ event?: ResolverActions;
25
+ metadata?: BaseMetadata;
26
+ }
27
+ export interface SaveRecorderResolverData {
28
+ transcription?: Transcription;
29
+ attachment?: Attachment | null;
30
+ attachments?: Attachment[];
31
+ }
32
+ export interface DeleteRecorderResolverRequest {
33
+ recorderAnnotationId: string;
34
+ metadata?: BaseMetadata;
35
+ event?: ResolverActions;
36
+ }
37
+ export interface PartialRecorderAnnotation {
38
+ annotationId: string;
39
+ metadata?: BaseMetadata;
40
+ from?: User;
41
+ transcription?: Transcription;
42
+ attachment?: Attachment | null;
43
+ attachments?: Attachment[];
44
+ chunkUrls?: Record<number, string>;
45
+ recordingEditVersions?: Record<number, PartialRecorderAnnotationEditVersion>;
46
+ [key: string]: any;
47
+ }
48
+ export interface PartialRecorderAnnotationEditVersion {
49
+ from?: User;
50
+ attachment?: Attachment | null;
51
+ attachments?: Attachment[];
52
+ transcription?: Transcription;
53
+ }
54
+ export interface PartialRecorderAnnotationResult {
55
+ strippedData: Record<string, PartialRecorderAnnotation> | null;
56
+ originalData: RecorderAnnotation | null;
57
+ eventType?: ResolverActions;
58
+ }
@@ -9,6 +9,7 @@ export interface ResolverConfig {
9
9
  getRetryConfig?: RetryConfig;
10
10
  resolveUsersConfig?: ResolveUsersConfig;
11
11
  fieldsToRemove?: string[];
12
+ additionalFields?: string[];
12
13
  getConfig?: ResolverEndpointConfig;
13
14
  saveConfig?: ResolverEndpointConfig;
14
15
  deleteConfig?: ResolverEndpointConfig;
@@ -1,5 +1,5 @@
1
1
  // @ts-nocheck
2
- import { CrdtGetDataQuery, CrdtGetVersionQuery, CrdtOnDataChangeQuery, CrdtOnPresenceChangeQuery, CrdtOnRegisteredUserChangeQuery, CrdtOnStateChangeQuery, CrdtRegisterSyncUserQuery, CrdtSetPresenceQuery, CrdtSaveVersionQuery, CrdtUpdateDataQuery, CrdtUpdateStateQuery } from "../data/crdt.data.model";
2
+ import { CrdtGetDataQuery, CrdtGetMessagesQuery, CrdtGetSnapshotQuery, CrdtGetVersionQuery, CrdtGetVersionsQuery, CrdtMessageData, CrdtOnDataChangeQuery, CrdtOnMessageQuery, CrdtOnPresenceChangeQuery, CrdtOnRegisteredUserChangeQuery, CrdtOnStateChangeQuery, CrdtPruneMessagesQuery, CrdtPushMessageQuery, CrdtRegisterSyncUserQuery, CrdtSaveSnapshotQuery, CrdtSetPresenceQuery, CrdtSaveVersionQuery, CrdtSnapshotData, CrdtUpdateDataQuery, CrdtUpdateStateQuery } from "../data/crdt.data.model";
3
3
  import { CrdtEventTypesMap } from "../data/crdt-events.data.model";
4
4
 
5
5
  export declare class CrdtElement {
@@ -80,6 +80,12 @@ export declare class CrdtElement {
80
80
  */
81
81
  getVersion: (getVersionQuery: CrdtGetVersionQuery) => Promise<any>;
82
82
 
83
+ /**
84
+ * Get all versions of a specific CRDT document
85
+ * @param id Document ID
86
+ */
87
+ getVersions: (getVersionsQuery: CrdtGetVersionsQuery) => Promise<any>;
88
+
83
89
  /**
84
90
  * Enable webhook
85
91
  */
@@ -95,6 +101,46 @@ export declare class CrdtElement {
95
101
  * @param time debounce time in milliseconds
96
102
  */
97
103
  setWebhookDebounceTime: (time: number) => void;
104
+
105
+ /**
106
+ * Push a lib0-encoded message to the unified message stream.
107
+ * Uses Firebase push() for chronologically-ordered keys.
108
+ * Carries both sync (type 0) and awareness (type 1) messages.
109
+ * @param pushMessageQuery - contains id, data (encoded bytes), yjsClientId (Y.Doc client ID), optional messageType and eventData
110
+ */
111
+ pushMessage: (pushMessageQuery: CrdtPushMessageQuery) => Promise<void>;
112
+ /**
113
+ * Subscribe to the unified message stream for real-time sync.
114
+ * Emits each new message individually as it arrives (streaming pattern).
115
+ * Returns an unsubscribe function.
116
+ * @param onMessageQuery - contains id, callback, and optional afterTs for filtering
117
+ */
118
+ onMessage: (onMessageQuery: CrdtOnMessageQuery) => () => void;
119
+ /**
120
+ * Fetch all messages after a given timestamp (one-time read).
121
+ * Used for message replay during initial load (y-redis pattern).
122
+ * @param getMessagesQuery - contains id and optional afterTs
123
+ */
124
+ getMessages: (getMessagesQuery: CrdtGetMessagesQuery) => Promise<CrdtMessageData[]>;
125
+ /**
126
+ * Get the latest full-state snapshot for a document.
127
+ * Used as the baseline for message replay during initial load.
128
+ * @param getSnapshotQuery - contains id
129
+ */
130
+ getSnapshot: (getSnapshotQuery: CrdtGetSnapshotQuery) => Promise<CrdtSnapshotData | null>;
131
+ /**
132
+ * Save a full-state snapshot (state + vector) for fast initial load.
133
+ * Called periodically to create checkpoints, enabling message pruning.
134
+ * @param saveSnapshotQuery - contains id, state (Y.Doc update), and vector (state vector)
135
+ */
136
+ saveSnapshot: (saveSnapshotQuery: CrdtSaveSnapshotQuery) => Promise<void>;
137
+ /**
138
+ * Remove messages older than the given timestamp from the message stream.
139
+ * Called after saving a snapshot to keep the message stream bounded.
140
+ * @param pruneMessagesQuery - contains id and beforeTs
141
+ */
142
+ pruneMessages: (pruneMessagesQuery: CrdtPruneMessagesQuery) => Promise<void>;
143
+
98
144
  /**
99
145
  * To set activity debounce time for batching CRDT edits (Default value is 10 minutes)
100
146
  * @param time debounce time in milliseconds (minimum: 10 seconds)
@@ -193,6 +239,36 @@ export declare class CrdtElement {
193
239
  */
194
240
  private _getVersions;
195
241
 
242
+ /**
243
+ * Push a message to the unified message stream
244
+ */
245
+ private _pushMessage;
246
+
247
+ /**
248
+ * Subscribe to the unified message stream
249
+ */
250
+ private _onMessage;
251
+
252
+ /**
253
+ * Fetch all messages after a given timestamp
254
+ */
255
+ private _getMessages;
256
+
257
+ /**
258
+ * Get the latest snapshot for a document
259
+ */
260
+ private _getSnapshot;
261
+
262
+ /**
263
+ * Save a full-state snapshot
264
+ */
265
+ private _saveSnapshot;
266
+
267
+ /**
268
+ * Remove messages older than a given timestamp
269
+ */
270
+ private _pruneMessages;
271
+
196
272
  /**
197
273
  * Enable webhook
198
274
  */
@@ -25,7 +25,10 @@ export declare enum ResolverActions {
25
25
  REACTION_ADD = "reaction.add",
26
26
  REACTION_DELETE = "reaction.delete",
27
27
  ATTACHMENT_ADD = "attachment.add",
28
- ATTACHMENT_DELETE = "attachment.delete"
28
+ ATTACHMENT_DELETE = "attachment.delete",
29
+ RECORDER_ANNOTATION_ADD = "recorder_annotation.add",
30
+ RECORDER_ANNOTATION_UPDATE = "recorder_annotation.update",
31
+ RECORDER_ANNOTATION_DELETE = "recorder_annotation.delete"
29
32
  }
30
33
  export declare const CommentEventTypes: {
31
34
  readonly ADD_COMMENT_ANNOTATION: "addCommentAnnotation";
@@ -87,6 +90,7 @@ export declare const CoreEventTypes: {
87
90
  readonly COMMENT_RESOLVER: "commentResolver";
88
91
  readonly ATTACHMENT_RESOLVER: "attachmentResolver";
89
92
  readonly REACTION_RESOLVER: "reactionResolver";
93
+ readonly RECORDER_RESOLVER: "recorderResolver";
90
94
  readonly VELT_BUTTON_CLICK: "veltButtonClick";
91
95
  readonly USER_UPDATE: "userUpdate";
92
96
  readonly INIT_UPDATE: "initUpdate";
package/models.d.ts CHANGED
@@ -72,6 +72,7 @@ export * from './app/models/data/views.data.model';
72
72
  export * from './app/models/data/autocomplete.data.model';
73
73
  export * from './app/models/data/reaction-annotation.data.model';
74
74
  export * from './app/models/data/reaction-resolver.data.model';
75
+ export * from './app/models/data/recorder-resolver.data.model';
75
76
  export * from './app/models/data/attachment-resolver.data.model';
76
77
  export * from './app/models/data/reaction.data.model';
77
78
  export * from './app/models/data/organization-groups.data.model';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@veltdev/sdk",
3
- "version": "5.0.2-beta.7",
3
+ "version": "5.0.2-beta.8",
4
4
  "description": "Velt is an SDK to add collaborative features to your product within minutes. Example: Comments like Figma, Frame.io, Google docs or sheets, Recording like Loom, Huddles like Slack and much more.",
5
5
  "homepage": "https://velt.dev",
6
6
  "keywords": [