refactor: Move database type management to db module.

This commit is contained in:
Hayden Young 2023-06-18 02:43:03 +01:00
parent 85e6848f4c
commit 8b93553d0e
14 changed files with 74 additions and 92 deletions

View File

@ -1,4 +1,53 @@
export { default as Documents } from './documents.js'
export { default as Events } from './events.js'
export { default as KeyValue } from './keyvalue.js'
export { default as KeyValueIndexed } from './keyvalue-indexed.js'
import Documents from './documents.js'
import Events from './events.js'
import KeyValue from './keyvalue.js'
import KeyValueIndexed from './keyvalue-indexed.js'
/**
* An array of available database types.
* @name databaseTypes
* @ype []
* @return [] An array of database types.
* @memberof module:OrbitDB
*/
const databaseTypes = {
events: Events,
documents: Documents,
keyvalue: KeyValue,
keyvalueindexed: KeyValueIndexed
}
/**
* Add a new database type.
* @example
* import { addDatabaseType } from 'orbit-db'
* const CustomDBTypeModule = async (params) => {
* const database = await Database(...params)
* ...
* }
* addDatabaseType('customDBType', CustomDBTypeModule)
* @function addDatabaseType
* @param {string} type The database type.
* @param {module:Database} store A Database-compatible module.
* @memberof module:OrbitDB
*/
const addDatabaseType = (type, store) => {
if (databaseTypes[type]) {
throw new Error(`Type already exists: ${type}`)
}
databaseTypes[type] = store
}
const getDatabaseType = (type) => {
if (!type) {
throw new Error('Type not specified')
}
if (!databaseTypes[type]) {
throw new Error(`Unsupported database type: '${type}'`)
}
return databaseTypes[type]
}
export { addDatabaseType, getDatabaseType }

View File

@ -13,7 +13,7 @@
* const Partial = KeyValueIndexed({ storage })
* const keyValueIndexed = await Partial({ ipfs })
*/
import { KeyValue } from './index.js'
import KeyValue from './keyvalue.js'
import LevelStorage from '../storage/level.js'
import pathJoin from '../utils/path-join.js'

View File

@ -1,9 +1,12 @@
export {
default as OrbitDB,
databaseTypes,
addDatabaseType
default as OrbitDB
} from './orbitdb.js'
export {
addDatabaseType,
getDatabaseType
} from './db/index.js'
export {
default as OrbitDBAddress,
isValidAddress,

View File

@ -48,7 +48,7 @@
* const orbitdb = await OrbitDB({ ipfs, identities, id: 'userA' })
* const mydb = await orbitdb.open('mydb')
*/
import { Events, KeyValue, Documents } from './db/index.js'
import { getDatabaseType } from './db/index.js'
import KeyStore from './key-store.js'
import { Identities } from './identities/index.js'
import OrbitDBAddress, { isValidAddress } from './address.js'
@ -58,40 +58,6 @@ import pathJoin from './utils/path-join.js'
import { getAccessController } from './access-controllers/index.js'
import IPFSAccessController from './access-controllers/ipfs.js'
/**
* An array of available database types.
* @name databaseTypes
* @ype []
* @return [] An array of database types.
* @memberof module:OrbitDB
*/
const databaseTypes = {
events: Events,
documents: Documents,
keyvalue: KeyValue
}
/**
* Add a new database type.
* @example
* import { addDatabaseType } from 'orbit-db'
* const CustomDBTypeModule = async (params) => {
* const database = await Database(...params)
* ...
* }
* addDatabaseType('customDBType', CustomDBTypeModule)
* @function addDatabaseType
* @param {string} type The database type.
* @param {module:Database} store A Database-compatible module.
* @memberof module:OrbitDB
*/
const addDatabaseType = (type, store) => {
if (databaseTypes[type]) {
throw new Error(`Type already exists: ${type}`)
}
databaseTypes[type] = store
}
const DefaultDatabaseType = 'events'
const DefaultAccessController = IPFSAccessController
@ -181,10 +147,6 @@ const OrbitDB = async ({ ipfs, id, identities, directory } = {}) => {
const open = async (address, { type, meta, sync, Database, AccessController, headsStorage, entryStorage, indexStorage, referencesCount } = {}) => {
let name, manifest, accessController
if (type && !databaseTypes[type]) {
throw new Error(`Unsupported database type: '${type}'`)
}
if (databases[address]) {
return databases[address]
}
@ -212,7 +174,7 @@ const OrbitDB = async ({ ipfs, id, identities, directory } = {}) => {
meta = manifest.meta
}
Database = Database || databaseTypes[type]()
Database = Database || getDatabaseType(type)()
if (!Database) {
throw new Error(`Unsupported database type: '${type}'`)
@ -261,4 +223,4 @@ const OrbitDB = async ({ ipfs, id, identities, directory } = {}) => {
}
}
export { OrbitDB as default, OrbitDBAddress, addDatabaseType, databaseTypes }
export { OrbitDB as default, OrbitDBAddress }

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../src/index.js'
import { Documents } from '../../src/db/index.js'
import Documents from '../../src/db/documents.js'
import config from '../config.js'
import testKeysPath from '../fixtures/test-keys-path.js'

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../src/index.js'
import { Events } from '../../src/db/index.js'
import Events from '../../src/db/events.js'
import config from '../config.js'
import testKeysPath from '../fixtures/test-keys-path.js'

View File

@ -5,7 +5,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities, MemoryStorage } from '../../src/index.js'
import { KeyValueIndexed } from '../../src/db/index.js'
import KeyValueIndexed from '../../src/db/keyvalue-indexed.js'
import config from '../config.js'
import testKeysPath from '../fixtures/test-keys-path.js'

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../src/index.js'
import { KeyValue } from '../../src/db/index.js'
import KeyValue from '../../src/db/keyvalue.js'
import config from '../config.js'
import testKeysPath from '../fixtures/test-keys-path.js'

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../../src/index.js'
import { Documents } from '../../../src/db/index.js'
import Documents from '../../../src/db/documents.js'
import config from '../../config.js'
import testKeysPath from '../../fixtures/test-keys-path.js'
import connectPeers from '../../utils/connect-nodes.js'

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../../src/index.js'
import { Events } from '../../../src/db/index.js'
import Events from '../../../src/db/events.js'
import config from '../../config.js'
import testKeysPath from '../../fixtures/test-keys-path.js'
import connectPeers from '../../utils/connect-nodes.js'

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../../src/index.js'
import { KeyValueIndexed } from '../../../src/db/index.js'
import KeyValueIndexed from '../../../src/db/keyvalue-indexed.js'
import config from '../../config.js'
import testKeysPath from '../../fixtures/test-keys-path.js'
import connectPeers from '../../utils/connect-nodes.js'

View File

@ -3,7 +3,7 @@ import rmrf from 'rimraf'
import { copy } from 'fs-extra'
import * as IPFS from 'ipfs-core'
import { KeyStore, Identities } from '../../../src/index.js'
import { KeyValue } from '../../../src/db/index.js'
import KeyValue from '../../../src/db/keyvalue.js'
import config from '../../config.js'
import testKeysPath from '../../fixtures/test-keys-path.js'
import connectPeers from '../../utils/connect-nodes.js'

View File

@ -1,7 +1,7 @@
import { strictEqual, deepStrictEqual, notStrictEqual } from 'assert'
import rmrf from 'rimraf'
import * as IPFS from 'ipfs-core'
import { OrbitDB, addDatabaseType, databaseTypes, Database } from '../src/index.js'
import { OrbitDB, addDatabaseType, getDatabaseType, Database } from '../src/index.js'
import config from './config.js'
const type = 'custom!'
@ -35,24 +35,11 @@ describe('Add a custom database type', function () {
await ipfs.stop()
}
// Remove the added custom database type from OrbitDB import
delete databaseTypes[CustomStore.type]
await rmrf('./orbitdb')
await rmrf('./ipfs1')
})
describe('Default supported database types', function () {
it('returns default supported database types', async () => {
const expected = [
'events',
'documents',
'keyvalue'
]
deepStrictEqual(Object.keys(databaseTypes), expected)
})
it('throws and error if custom database type hasn\'t been added', async () => {
let err
try {
@ -90,26 +77,7 @@ describe('Add a custom database type', function () {
})
it('returns custom database type after adding it', async () => {
const expected = [
'events',
'documents',
'keyvalue',
type
]
deepStrictEqual(Object.keys(databaseTypes), expected)
})
it('can be removed from supported database types', async () => {
const expected = [
'events',
'documents',
'keyvalue'
]
delete databaseTypes[type]
deepStrictEqual(Object.keys(databaseTypes), expected)
deepStrictEqual(getDatabaseType(type), CustomStore)
})
})
})

View File

@ -4,7 +4,7 @@ import fs from 'fs'
import path from 'path'
import * as IPFS from 'ipfs-core'
import { OrbitDB, isValidAddress, LevelStorage } from '../src/index.js'
import { KeyValueIndexed } from '../src/db/index.js'
import KeyValueIndexed from '../src/db/keyvalue-indexed.js'
import config from './config.js'
import connectPeers from './utils/connect-nodes.js'
import waitFor from './utils/wait-for.js'