UNPKG

@nephele/adapter-s3

Version:

S3 (or compatible) object storage adapter for the Nephele WebDAV server.

205 lines 6.53 kB
import { PropertyIsProtectedError, PropertyNotFoundError } from 'nephele'; export default class Properties { constructor({ resource }) { this.resource = resource; } async get(name) { const meta = await this.resource.getMetadata(); switch (name) { case 'creationdate': { const lastModified = (await this.resource.getLastModified()) ?? new Date(); return lastModified.toISOString(); } case 'getcontentlength': return `${await this.resource.getLength()}`; case 'getcontenttype': const mediaType = await this.resource.getMediaType(); if (mediaType == null) { throw new PropertyNotFoundError(`${name} property doesn't exist on resource.`); } return mediaType; case 'getetag': return await this.resource.getEtag(); case 'getlastmodified': { const lastModified = (await this.resource.getLastModified()) ?? new Date(); return lastModified.toUTCString(); } case 'resourcetype': if (await this.resource.isCollection()) { return { collection: {} }; } else { return {}; } case 'supportedlock': return { lockentry: [ { lockscope: { exclusive: {} }, locktype: { write: {} }, }, { lockscope: { shared: {} }, locktype: { write: {} }, }, ], }; } if (meta.props == null || !(name in meta.props)) { throw new PropertyNotFoundError(`${name} property doesn't exist on resource.`); } return meta.props[name]; } async getByUser(name, _user) { return await this.get(name); } async set(name, value) { const errors = await this.runInstructions([['set', name, value]]); if (errors != null && errors.length) { throw errors[0][1]; } } async setByUser(name, value, user) { const errors = await this.runInstructionsByUser([['set', name, value]], user); if (errors != null && errors.length) { throw errors[0][1]; } } async remove(name) { const errors = await this.runInstructions([['remove', name, undefined]]); if (errors != null && errors.length) { throw errors[0][1]; } } async removeByUser(name, user) { const errors = await this.runInstructionsByUser([['remove', name, undefined]], user); if (errors != null && errors.length) { throw errors[0][1]; } } async runInstructions(instructions) { let meta = {}; let changed = false; let errors = []; const errorEverything = (e) => { const errProps = {}; for (let instruction of instructions) { errProps[instruction[1]] = e; } return Object.entries(errProps); }; try { meta = await this.resource.getMetadata(); } catch (e) { return errorEverything(e); } for (let instruction of instructions) { const [action, name, value] = instruction; if ([ 'creationdate', 'getcontentlength', 'getcontenttype', 'getetag', 'getlastmodified', 'resourcetype', 'supportedlock', ].includes(name)) { errors.push([ name, new PropertyIsProtectedError(`${name} is a protected property.`), ]); continue; } if (action === 'set') { if (meta.props == null) { meta.props = {}; } meta.props[name] = value; changed = true; } else { if (meta.props != null && name in meta.props) { delete meta.props[name]; changed = true; } } } if (errors.length) { return errors; } if (changed) { try { await this.resource.saveMetadata(meta); } catch (e) { return errorEverything(e); } } if (errors.length) { return errors; } } async runInstructionsByUser(instructions, _user) { return await this.runInstructions(instructions); } async getAll() { const meta = await this.resource.getMetadata(); const props = { ...meta.props }; for (let name of [ 'creationdate', 'getcontentlength', 'getcontenttype', 'getetag', 'getlastmodified', 'resourcetype', 'supportedlock', ]) { try { props[name] = await this.get(name); } catch (e) { if (!(e instanceof PropertyNotFoundError)) { props[name] = e; } } } return props; } async getAllByUser(_user) { return await this.getAll(); } async list() { return [...(await this.listLive()), ...(await this.listDead())]; } async listByUser(user) { return [ ...(await this.listLiveByUser(user)), ...(await this.listDeadByUser(user)), ]; } async listLive() { return [ 'creationdate', 'getcontentlength', 'getcontenttype', 'getetag', 'getlastmodified', 'resourcetype', 'supportedlock', ]; } async listLiveByUser(_user) { return await this.listLive(); } async listDead() { let meta = await this.resource.getMetadata(); return [ ...Object.keys(meta.props || {}), ]; } async listDeadByUser(_user) { return await this.listDead(); } } //# sourceMappingURL=Properties.js.map