The goal of this repository and the overall idea of separating neume-network-core's source from its strategies, is to allow any type of music platform to quickly define their on-chain schema - allowing them to re-use neume-network-core to index and distribute their and other platform's music ecosystem.
Unless you want to run this repository's unit tests, for now, this repository can't run by itself. Instead, we recommend you run it as a submodule of neume-network/core. Please follow its installation instructions.
WARNING: This repository is under active development and APIs aren't stable.
- Any external request message passed to @neume-network/extraction-worker must result in an idempotent response (aka. if the request is repeated the same result must be returned).
- Extraction of information from external requests must not be coupled to e.g. transformation of responses. It must be possible to run transformation independently from e.g. extraction.
- Request patterns should be scoped through e.g. time or block periods.
To implement a strategy with maximum efficiency, we recommend doing all on-chain and off-chain requests using the extraction Worker API.
An extractor strategy must implement the following interface:
interface Extractor {
name: String;
props: Object;
init(args...): Object<messages: Message[], write: String>;
update(message: Message): Object<messages: Message[], write: String>;
}
Where Message
is defined as any JSON object compliant to the definitions in
neume-network/message-schema.
A neume-network extraction message is layed out similarly to a react.js component in that foundamentally, it is a component implementing lifecycle methods.
- A component has
props
as in "properties" that can be defined before instantiation of the component. - The
init
function is called when the component is mounted into the core process. - Upon completion of the
init
task,update
is called untilupdate
's returnedmessages
list is empty.
Below is a visual overview of a neume-network extractor component's lifecycle.
A transformer strategy must implement the following interface:
interface Transformer {
name: String;
onLine(line: String): Object<messages: Message[], write: String>;
onError(error: Error): any;
onClose(): Object<messages: Message[], write: String>;
}
Where Message
is defined as any JSON object compliant to the definitions in
neume-network/message-schema.