feat: integrate client and server sharing workflows

This commit is contained in:
justme committed 2026-10-02 10:49:45 +08:00
1 parent 42b93ae2d8
commit 7406e2fe37
101 files changed
+3153 -253

No files matched your search

+54
View File
@@ -0,0 +1,54 @@
import type { SavedResource } from '../database';
import type { ChannelInfo, Share, ShareSettings } from '../types';
export interface ChannelWire {
id: string;
mode: 'enc' | 'raw';
settings: { seats: number; members_can_upload: boolean; delete_policy: 'owner_only' | 'own' | 'anyone'; ttl_seconds: number; max_items: number; file_max_downloads: number };
seats_used: number;
oldest_seq: number;
last_seq: number;
created_at: number;
expires_at: number;
}
export interface ShareWireItem { item_id: string; bytes: number; frames: number; max_downloads: number; downloads_left: number | null }
export interface ShareWire {
id: string;
state: 'draft' | 'sealed';
expires_at: number;
created_at: number;
sealed_at?: number;
manifest_item_id?: string;
settings: { ttl_seconds: number; max_visitors: number; file_max_downloads: number };
items: ShareWireItem[];
}
export function toChannelInfo(raw: ChannelWire, saved: SavedResource): ChannelInfo {
return {
id: raw.id,
mode: raw.mode,
role: saved.role,
canUpload: saved.role === 'owner' || raw.settings.members_can_upload,
seats: raw.settings.seats,
memberLink: saved.link,
ownerLink: saved.ownerLink,
createdAt: raw.created_at,
expiresAt: raw.expires_at,
};
}
export function toShareInfo(raw: ShareWire, saved: SavedResource): Share {
return {
id: raw.id,
state: raw.state,
mine: saved.mine ?? (saved.role === 'owner' || saved.ownerLink !== undefined),
link: saved.link,
createdAt: raw.sealed_at ?? raw.created_at,
expiresAt: raw.expires_at,
ttlSeconds: raw.settings.ttl_seconds,
maxVisitors: raw.settings.max_visitors,
maxDownloads: raw.settings.file_max_downloads === 0 ? null : raw.settings.file_max_downloads,
};
}
export function apiShareSettings(settings: ShareSettings) {
return { ttl_seconds: settings.ttlSeconds, max_visitors: settings.maxVisitors, file_max_downloads: settings.maxDownloads ?? 0 };
}