Send device id to server

This commit is contained in:
Andras Schmelczer 2025-04-04 23:15:05 +01:00
commit a25027bc90
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C
4 changed files with 27 additions and 3 deletions

View file

@ -24,6 +24,7 @@ export class SyncService {
private _fetchImplementation: typeof globalThis.fetch = globalThis.fetch; private _fetchImplementation: typeof globalThis.fetch = globalThis.fetch;
public constructor( public constructor(
private readonly deviceId: string,
private readonly connectionStatus: ConnectionStatus, private readonly connectionStatus: ConnectionStatus,
private readonly settings: Settings, private readonly settings: Settings,
private readonly logger: Logger private readonly logger: Logger
@ -79,6 +80,7 @@ export class SyncService {
formData.append("document_id", documentId); formData.append("document_id", documentId);
} }
formData.append("relative_path", relativePath); formData.append("relative_path", relativePath);
formData.append("device_id", this.deviceId);
formData.append("content", new Blob([contentBytes])); formData.append("content", new Blob([contentBytes]));
const response = await this.client.POST( const response = await this.client.POST(
@ -130,6 +132,7 @@ export class SyncService {
const formData = new FormData(); const formData = new FormData();
formData.append("parent_version_id", parentVersionId.toString()); formData.append("parent_version_id", parentVersionId.toString());
formData.append("relative_path", relativePath); formData.append("relative_path", relativePath);
formData.append("device_id", this.deviceId);
formData.append("content", new Blob([contentBytes])); formData.append("content", new Blob([contentBytes]));
const response = await this.client.PUT( const response = await this.client.PUT(
@ -182,7 +185,8 @@ export class SyncService {
} }
}, },
body: { body: {
relativePath relativePath,
deviceId: this.deviceId
} }
} }
); );

View file

@ -439,6 +439,7 @@ export interface components {
}; };
CreateDocumentVersion: { CreateDocumentVersion: {
contentBase64: string; contentBase64: string;
deviceId?: string | null;
/** /**
* Format: uuid * Format: uuid
* @description The client can decide the document id (if it wishes to) in order to help with syncing. If the client does not provide a document id, the server will generate one. If the client provides a document id it must not already exist in the database. * @description The client can decide the document id (if it wishes to) in order to help with syncing. If the client does not provide a document id, the server will generate one. If the client provides a document id it must not already exist in the database.
@ -448,6 +449,7 @@ export interface components {
}; };
CreateDocumentVersionMultipart: { CreateDocumentVersionMultipart: {
content: components["schemas"]["Array_of_uint8"]; content: components["schemas"]["Array_of_uint8"];
device_id?: string | null;
/** Format: uuid */ /** Format: uuid */
document_id?: string | null; document_id?: string | null;
relative_path: string; relative_path: string;
@ -458,6 +460,7 @@ export interface components {
vault_id: string; vault_id: string;
}; };
DeleteDocumentVersion: { DeleteDocumentVersion: {
deviceId?: string | null;
relativePath: string; relativePath: string;
}; };
/** @description Response to an update document request. */ /** @description Response to an update document request. */
@ -568,12 +571,14 @@ export interface components {
}; };
UpdateDocumentVersion: { UpdateDocumentVersion: {
contentBase64: string; contentBase64: string;
deviceId?: string | null;
/** Format: int64 */ /** Format: int64 */
parentVersionId: number; parentVersionId: number;
relativePath: string; relativePath: string;
}; };
UpdateDocumentVersionMultipart: { UpdateDocumentVersionMultipart: {
content: components["schemas"]["Array_of_uint8"]; content: components["schemas"]["Array_of_uint8"];
deviceId?: string | null;
/** Format: int64 */ /** Format: int64 */
parentVersionId: number; parentVersionId: number;
relativePath: string; relativePath: string;

View file

@ -15,6 +15,7 @@ import { FileOperations } from "./file-operations/file-operations";
import { ConnectionStatus } from "./services/connection-status"; import { ConnectionStatus } from "./services/connection-status";
import { UnrestrictedSyncer } from "./sync-operations/unrestricted-syncer"; import { UnrestrictedSyncer } from "./sync-operations/unrestricted-syncer";
import { rateLimit } from "./utils/rate-limit"; import { rateLimit } from "./utils/rate-limit";
import { v4 as uuidv4 } from "uuid";
export interface NetworkConnectionStatus { export interface NetworkConnectionStatus {
isSuccessful: boolean; isSuccessful: boolean;
@ -105,9 +106,15 @@ export class SyncClient {
await rateLimitedSave(state); await rateLimitedSave(state);
} }
); );
const deviceId = uuidv4();
const connectionStatus = new ConnectionStatus(settings, logger); const connectionStatus = new ConnectionStatus(settings, logger);
const syncService = new SyncService(connectionStatus, settings, logger); const syncService = new SyncService(
deviceId,
connectionStatus,
settings,
logger
);
syncService.fetchImplementation = fetch; syncService.fetchImplementation = fetch;
const fileOperations = new FileOperations( const fileOperations = new FileOperations(
logger, logger,
@ -124,6 +131,7 @@ export class SyncClient {
history history
); );
const syncer = new Syncer( const syncer = new Syncer(
deviceId,
logger, logger,
database, database,
settings, settings,

View file

@ -31,7 +31,9 @@ export class Syncer {
| undefined; | undefined;
private applyRemoteChangesWebSocket: WebSocket | undefined; private applyRemoteChangesWebSocket: WebSocket | undefined;
// eslint-disable-next-line @typescript-eslint/max-params
public constructor( public constructor(
private readonly deviceId: string,
private readonly logger: Logger, private readonly logger: Logger,
private readonly database: Database, private readonly database: Database,
private readonly settings: Settings, private readonly settings: Settings,
@ -291,7 +293,12 @@ export class Syncer {
// The JS WebSocket API doesn't support setting headers, so we have to send the token as a message // The JS WebSocket API doesn't support setting headers, so we have to send the token as a message
this.applyRemoteChangesWebSocket.onopen = (): void => { this.applyRemoteChangesWebSocket.onopen = (): void => {
this.logger.info("WebSocket connection opened"); this.logger.info("WebSocket connection opened");
this.applyRemoteChangesWebSocket?.send(settings.token); this.applyRemoteChangesWebSocket?.send(
JSON.stringify({
deviceId: this.deviceId,
token: settings.token
})
);
this.webSocketStatusChangeListeners.forEach((listener) => { this.webSocketStatusChangeListeners.forEach((listener) => {
listener(); listener();
}); });