Examples [v2] - OpenMarshal/npm-WebDAV-Server GitHub Wiki

You can find more examples here.

Using the physical file system to map a physical folder

// TypeScript
import { v2 as webdav } from 'webdav-server'
// Javascript
const webdav = require('webdav-server').v2;

const server = new webdav.WebDAVServer();
server.setFileSystem('/physicalFolder', new webdav.PhysicalFileSystem('/my/path/to/the/folder'), (success) => {
    server.start(() => console.log('READY'));
})

User system and user rights

// TypeScript
import { v2 as webdav } from 'webdav-server'
// Javascript
const webdav = require('webdav-server').v2;

// User manager (tells who are the users)
const userManager = new webdav.SimpleUserManager();
const user = userManager.addUser('username', 'password', false);

// Privilege manager (tells which users can access which files/folders)
const privilegeManager = new webdav.SimplePathPrivilegeManager();
privilegeManager.setRights(user, '/', [ 'all' ]);

const server = new webdav.WebDAVServer({
    // HTTP Digest authentication with the realm 'Default realm'
    httpAuthentication: new webdav.HTTPDigestAuthentication(userManager, 'Default realm'),
    privilegeManager: privilegeManager
});

server.start(() => console.log('READY'));

Simple auto-save/load

// TypeScript
import { v2 as webdav } from 'webdav-server'
// Javascript
const webdav = require('webdav-server').v2;

const server = new webdav.WebDAVServer({
    autoSave: { // Will automatically save the changes in the 'data.json' file
        treeFilePath: 'data.json'
    }
});

// Try to load the 'data.json' file
server.autoLoad((e) => {
    if(e)
    { // Couldn't load the 'data.json' (file is not accessible or it has invalid content)
        server.rootFileSystem().addSubTree(server.createExternalContext(), {
            'folder1': {                                // /folder1
                'file1.txt': webdav.ResourceType.File,  // /folder1/file1.txt
                'file2.txt': webdav.ResourceType.File   // /folder1/file2.txt
            },
            'file0.txt': webdav.ResourceType.File       // /file0.txt
        })
    }
    
    server.start(() => console.log('READY'));
})

Auto-save

const webdav = require('webdav-server');

const server = new webdav.WebDAVServer({
    isVerbose: true,
    autoSave: {
        treeFilePath: 'data.json',
        tempTreeFilePath: 'data.tmp.json',
        onSaveError: () => {
            console.log('SAVE ERROR');
        },
        streamProvider: (stream, cb) => {
            cb(stream.pipe(zlib.createGzip())); // useless because the argument 'stream' is already a GZip stream
        }
    }
});
server.start(() => console.log('READY'));

Home-made loading

const webdav = require('webdav-server'),
      zlib = require('zlib'),
      fs = require('fs');

const server = new webdav.WebDAVServer(/* [...] */);
const stream = zlib.createGunzip();

try
{
    fs.createReadStream('data.json').pipe(stream);
    
    let data = '';
    stream.on('data', (chunk) => {
        data += chunk.toString();
    })
    stream.on('end', () => {
        this.server.load(JSON.parse(data), [
            new webdav.RootFSManager(),
            // [...]
        ], e => {
            if(e) throw e;
            server.start(() => console.log('READY'));
        })
    })
    stream.on('error', () => {
        console.log('Could not load.');
        server.start(() => console.log('READY'));
    })
}
catch(ex)
{
    console.log('Could not load.');
    server.start(() => console.log('READY'));
}

Resource tree creation

// TypeScript
import { v2 as webdav } from 'webdav-server'
// Javascript
const webdav = require('webdav-server').v2;

const server = new webdav.WebDAVServer();

server.rootFileSystem().addSubTree(server.createExternalContext(), {
    'folder1': {                                // /folder1
        'file1.txt': webdav.ResourceType.File,  // /folder1/file1.txt
        'file2.txt': webdav.ResourceType.File   // /folder1/file2.txt
    },
    'file0.txt': webdav.ResourceType.File       // /file0.txt
})

server.start(() => console.log('READY'));