node-exist

Mostly a shallow wrapper for eXist's XML-RPC API.
Attempts to translate terminologies into node world. Uses promises.
Disclaimer
Use at your own risk.
This software is safe for development.
It may be used to work with a production instance, but think twice before your data is lost.
Roadmap
Install
npm install @existdb/node-exist
Use
Creating, reading and removing a collection:
const exist = require('@existdb/node-exist')
const db = exist.connect()
db.collections.create('/db/apps/test')
.then(result => db.collections.describe('/db/apps/test'))
.then(result => console.log('collection description:', result))
.catch(e => console.error('fail', e))
Uploading an XML file into the database
const exist = require('@existdb/node-exist')
const db = exist.connect()
db.documents.upload(Buffer.from('<root/>'))
.then(fileHandle => db.documents.parseLocal(fileHandle, '/db/apps/test/file.xml', {}))
.then(result => db.documents.read('/db/apps/test/file.xml'))
.then(result => console.log('test file contents', result))
.catch(error => console.error('fail', error))
Since all interactions with the database are promises you can also use async functions
const exist = require('@existdb/node-exist')
const db = exist.connect()
async function uploadAndParse (filePath, contents) {
const fileHandle = await db.documents.upload(contents)
await db.documents.parseLocal(fileHandle, filePath, {})
return filePath
}
uploadAndParse('/db/apps/test-file.xml', Buffer.from('<root/>'))
.then(filePath => console.log("uploaded", filePath))
.catch(error => console.error(error))
You can also have a look at the
examples for more use-cases.
Configuration
Connect as someone else than guest
exist.connect({
basic_auth: {
user: 'me',
pass: '1 troubadour artisanal #compost'
}
})
Connect to a local development server using HTTP
exist.connect({ secure: false, port: 8080 })
Connect to a server with an invalid or expired certificate
exist.connect({ rejectUnauthorized: false })
Defaults
{
host: 'localhost',
port: '8443',
path: '/exist/xmlrpc',
basic_auth: {
user: 'guest',
pass: 'guest'
}
}
Components
The methods are grouped into components by what they operate on.
Every method returns a promise.
Queries
Status: working
execute
db.queries.execute(query, options)
read
db.queries.read(query, options)
readAll
This convenience function calls queries.count then retrieves all result pages and returns them in an array.
db.queries.readAll(query, options)
Example:
db.queries.readAll('xquery version "3.1"; xmldb:get-child-collections("/db/apps") => string-join(",\n")', {})
.then(result => console.log(
Buffer.concat(result.pages).toString()))
.catch(e => console.error(e))
count
db.queries.count(resultHandle)
retrieve
db.queries.retrieveResult(resultHandle, page)
retrieveAll
db.queries.retrieveAll(resultHandle)
releaseResult
free result on server
db.queries.releaseResult(resultHandle)
Documents
A document can be seen as a file. It might be indexed if it's type is not binary.
upload
Resolves into a file handle which can then be used by db.documents.parseLocal.
db.documents.upload(Buffer.from('test'))
parseLocal
db.documents.parseLocal(fileHandle, 'foo/test.txt', {})
read
db.documents.read('foo.xml')
remove
db.documents.remove('foo.xml')
Resources
Status: working
A resource is identified by its path in the database.
Documents and collections are resources.
describe
db.resources.describe(resourcePath)
setPermissions
db.resources.setPermissions(resourcePath, 400)
getPermissions
db.resources.getPermissions(resourcePath)
Collections
Status: working
create
db.collections.create(collectionPath)
remove
db.collections.remove(collectionPath)
describe
db.collections.describe(collectionPath)
read
db.collections.read(collectionPath)
App
Status: Experimental
upload
db.app.upload(xarBuffer, xarName)
install
db.app.install(xarName)
remove
db.app.remove(xarName)
Indices
Status: TODO
Users
Status: failing
byName
db.users.byName(username)
list
db.users.list()
server
Status: working
syncToDisk
db.server.syncToDisk()
shutdown
db.server.shutdown()
Note: There is no way to bring it up again.
Test
All tests are in spec/tests and written for tape
npm test