@@ -7,20 +7,26 @@ import * as db from '../dbs/profile-data-db'
77import * as users from './users'
88import * as trash from './trash'
99import { PATHS } from '../../lib/const'
10+ import lock from '../../lib/lock'
1011
1112// typedefs
1213// =
1314
1415/**
1516 * @typedef {import('../dat/daemon').DaemonHyperdrive } DaemonHyperdrive
1617 * @typedef {import('./users').User } User
18+ *
19+ * @typedef {Object } DriveConfig
20+ * @property {string } key
21+ * @property {boolean } seeding
1722 */
1823
1924// globals
2025// =
2126
2227var browsingProfile
2328var rootDrive
29+ var drives = [ ]
2430
2531// exported api
2632// =
@@ -72,8 +78,6 @@ export async function setup () {
7278 await ensureDir ( PATHS . LIBRARY_NS ( 'media' ) )
7379 await ensureDir ( PATHS . LIBRARY_NS ( 'projects' ) )
7480 await ensureDir ( PATHS . SYSTEM )
75- await ensureDir ( PATHS . SYSTEM_NS ( 'drives' ) )
76- await ensureDir ( PATHS . SYSTEM_NS ( 'templates' ) )
7781 await ensureDir ( PATHS . SYSTEM_NS ( 'webterm' ) )
7882 await ensureDir ( PATHS . SYSTEM_NS ( 'webterm/cmds' ) )
7983
@@ -87,6 +91,14 @@ export async function setup () {
8791 console . error ( 'Error while constructing the root drive' , e . toString ( ) )
8892 logger . error ( 'Error while constructing the root drive' , { error : e . toString ( ) } )
8993 }
94+
95+ // load drive config
96+ try {
97+ drives = JSON . parse ( await rootDrive . pda . readFile ( PATHS . SYSTEM_NS ( 'drives.json' ) ) ) . drives
98+ } catch ( e ) {
99+ console . error ( 'Error while reading the drive configuration at /system/drives.json' , e . toString ( ) )
100+ logger . error ( 'Error while reading the drive configuration at /system/drives.json' , { error : e . toString ( ) } )
101+ }
90102}
91103
92104/**
@@ -97,14 +109,51 @@ export async function setDefaultUser (url) {
97109 await ensureMount ( PATHS . DEFAULT_USER , url )
98110}
99111
112+ /**
113+ * @returns {Array<DriveConfig> }
114+ */
115+ export function listDrives ( ) {
116+ return drives
117+ }
118+
119+ /**
120+ * @param {string } url
121+ * @param {Object } [opts]
122+ * @param {Boolean } [opts.seeding]
123+ * @returns {Promise<void> }
124+ */
125+ export async function configDrive ( url , { seeding} = { seeding : false } ) {
126+ var release = await lock ( 'filesystem:drives' )
127+ try {
128+ var key = await hyper . drives . fromURLToKey ( url , true )
129+ var drive = drives . find ( drive => drive . key === key )
130+ if ( ! drive ) {
131+ drive = /** @type DriveConfig */ ( { key, seeding} )
132+ drives . push ( drive )
133+ } else {
134+ drive . seeding = seeding
135+ }
136+ await rootDrive . pda . writeFile ( PATHS . SYSTEM_NS ( 'drives.json' ) , JSON . stringify ( { drives} , null , 2 ) )
137+ } finally {
138+ release ( )
139+ }
140+ }
141+
100142/**
101143 * @param {string } url
102- * @param {string } title
103144 * @returns {Promise<void> }
104145 */
105- export async function addToLibrary ( url , title ) {
106- var name = await getAvailableName ( PATHS . SYSTEM_NS ( 'drives' ) , slugify ( ( title || '' ) . trim ( ) || 'untitled' ) . toLowerCase ( ) )
107- await ensureMount ( joinPath ( PATHS . SYSTEM_NS ( 'drives' ) , name ) , url )
146+ export async function removeDrive ( url ) {
147+ var release = await lock ( 'filesystem:drives' )
148+ try {
149+ var key = await hyper . drives . fromURLToKey ( url , true )
150+ var driveIndex = drives . findIndex ( drive => drive . key === key )
151+ if ( driveIndex === - 1 ) return
152+ drives . splice ( driveIndex , 1 )
153+ await rootDrive . pda . writeFile ( PATHS . SYSTEM_NS ( 'drives.json' ) , JSON . stringify ( { drives} , null , 2 ) )
154+ } finally {
155+ release ( )
156+ }
108157}
109158
110159/**
0 commit comments