dop
Version:
Distributed Object Protocol.
85 lines (76 loc) • 2.35 kB
JavaScript
// import { version } from '../package.json.js'
import { isFunction } from './util/is.js'
import { merge, converter } from './util/merge.js'
import { producePatch } from './util/patches.js'
import createNodeFactory from './api/createNodeFactory.js'
import createStoreFactory from './api/createStoreFactory.js'
import applyPatchFactory from './api/applyPatchFactory.js'
import Primitives from './types/Primitives.js'
import Rpc from './types/Rpc.js'
import Delete from './types/Delete.js'
import Replace from './types/Replace.js'
import Splice from './types/Splice.js'
import Swap from './types/Swap.js'
import Multi from './types/Multi.js'
// Deno does not support json imports: https://stackoverflow.com/questions/61907155/deno-import-json-file-as-module
const version = '1.5.4'
function factory() {
const patchers = []
const encoders = []
const decoders = []
const encode = (object, params = {}, list = encoders) =>
converter(object, merge(params, { encode }), list)
const decode = (object, params = {}, list = decoders) =>
converter(object, merge(params, { decode }), list)
const applyPatch = applyPatchFactory(patchers)
const createStore = createStoreFactory(applyPatch)
const createNode = createNodeFactory({ encode, decode })
const addType = ({ patch, encode, decode }) => {
if (isFunction(patch)) patchers.push(patch)
if (isFunction(encode)) encoders.push(encode)
if (isFunction(decode)) decoders.push(decode)
}
addType(Primitives)
addType(Rpc)
addType(Delete)
addType(Replace)
addType(Splice)
addType(Swap)
addType(Multi)
return {
version,
factory,
merge,
encode,
decode,
producePatch,
applyPatch,
createNode,
createStore,
addType,
TYPE: {
Delete,
Replace,
Splice,
Swap,
Multi,
},
}
}
const dop = factory()
const { encode, decode, applyPatch, createNode, createStore, addType, TYPE } =
dop
export default dop
export {
version,
factory,
merge,
encode,
decode,
producePatch,
applyPatch,
createNode,
createStore,
addType,
TYPE,
}