UNPKG

rxdb

Version:

A local-first realtime NoSQL Database for JavaScript applications - https://rxdb.info/

83 lines (76 loc) 2.7 kB
import { newRxError } from '../../rx-error.ts'; import type { RxAttachmentWriteData, RxStorageInstance, WithDeletedAndAttachments } from '../../types/index.d.ts'; import { ensureNotFalsy } from '../utils/index.ts'; export function ensureSchemaSupportsAttachments(doc: any) { const schemaJson = doc.collection.schema.jsonSchema; if (!schemaJson.attachments) { throw newRxError('AT1', { link: 'https://pubkey.github.io/rxdb/rx-attachment.html' }); } } export function assignMethodsToAttachment(attachment: any) { Object .entries(attachment.doc.collection.attachments) .forEach(([funName, fun]) => { Object.defineProperty(attachment, funName, { get: () => (fun as any).bind(attachment) }); }); } /** * Fill up the missing attachment.data of the newDocument * so that the new document can be send to somewhere else * which could then receive all required attachments data * that it did not have before. */ export async function fillWriteDataForAttachmentsChange<RxDocType>( primaryPath: string, storageInstance: RxStorageInstance<RxDocType, any, any, any>, newDocument: WithDeletedAndAttachments<RxDocType>, originalDocument?: WithDeletedAndAttachments<RxDocType> ): Promise<WithDeletedAndAttachments<RxDocType>> { if ( !newDocument._attachments || ( originalDocument && !originalDocument._attachments ) ) { throw new Error('_attachments missing'); } const docId: string = (newDocument as any)[primaryPath]; const originalAttachmentsIds = new Set( originalDocument && originalDocument._attachments ? Object.keys(originalDocument._attachments) : [] ); await Promise.all( Object .entries(newDocument._attachments) .map(async ([key, value]) => { if ( ( !originalAttachmentsIds.has(key) || ( originalDocument && ensureNotFalsy(originalDocument._attachments)[key].digest !== value.digest ) ) && !(value as RxAttachmentWriteData).data ) { const attachmentDataString = await storageInstance.getAttachmentData( docId, key, value.digest ); (value as RxAttachmentWriteData).data = attachmentDataString; } }) ); return newDocument; }