@anythread/gsoc
Version:
Graffiti Several Owner Chunk implementation on Swarm network
110 lines (77 loc) • 3.92 kB
Markdown
# GSOC
This library facilitates to use [Graffiti Several Owner Chunks (GSOC)](https://github.com/nugaon/SWIPs/blob/graffiti-soc/SWIPs/swip-draft_graffiti-soc.md) on [Ethereum Swarm](https://www.ethswarm.org/).
Leveraging its features, any data can be referenced to other related data without maintaing any external registry or running service.
** WARNING! This project is in the experimental phase! **
It is intended to be an upgraded version of the predecessor Graffiti Feed based [zerodash library](https://github.com/anythread/zerodash).
Missing feature is the reading part though the communication is possible by running storer node and subscribe to incoming infromation signals.
# Install
** NPM release will be available later, [compile](#Compilation) the project instead! **
```sh
npm install /gsoc --save
```
# Usage
The library provides `InformationSignal` class that reads/writes GSOC according to the consensus and other configuration parameters.
The consensus consists of an arbitrary `id` and an assert function that validates the handled records in the GSOC address space.
```ts
const id = 'SampleDapp:v1'
export interface SampleDappRecord {
/** text of the message */
text: string
/** creation time of the comment */
timestamp: number
}
function assertRecord(value: unknown): asserts value is SampleDappRecord {
if (
value !== null &&
typeof value === 'object' &&
Object.keys(value).includes('text') &&
Object.keys(value).includes('timestamp')
) {
return
}
throw new Error('The given value is not a valid personal storage record')
}
```
With that, the rules have been created for kademlia information signaling on any data.
## Information Signal
Information Signal class facilitates GSOC data reading based on the passed consensus rules.
```ts
import { InformationSignal } from '@anythread/gsoc'
beeUrl = 'http://localhost:1633' // Bee API URL to connect p2p storage network
postage = '0000000000000000000000000000000000000000000000000000000000000000' // for write operations, the Postage Batch ID (64 length hex) or a Postage Stamp (226 length hex) must be set
resourceId = 'demo' // any string/content hash that represents the resource to which the Personal Storage record will be associated.
// initialize object that will read and write the GSOC according to the passed consensus/configuration
informationSignal = new InformationSignal(beeUrl, {
postage,
consensus: {
id,
assertRecord,
},
})
// it is also possible to mine the resourceId to the desired Bee node to ensure they will get the message as soon as possible on the forwarding Kademlia network
targetBeeOverlayAddress = 'b0baf37700000000000000000000000000000000000000000000000000000000'
{ resourceId } = informationSignal.mine(targetBeeOverlayAddress, 16)
// subscribe to incoming topics on the receiver node
// this will immediately invoge `onMessage` and `onError` function if the message arrives to the target neighborhood of the Kademlia network.
cancelSub = informationSignal.subscribe({onMessage: msg => console.log('my-life-event', msg), onError: console.log}, resourceId)
// write GSOC record that satisfies the message format with the `write` method.
uploadedSoc = await informationSignal.write({ text: 'Hello there!', timestamp: 1721989685349 }, resourceId)
```
# Compilation
In order to compile code run
```sh
npm run compile
```
You can find the resulted code under the `dist` folder.
For types compilation, run
```sh
npm run compile:types
```
# Testing
The testing needs running Bee client node for integration testing.
You should set `BEE_POSTAGE` and `BEE_POSTAGE_2` environment variable with valid Postage batch IDs.
In order to test on different node than `http://localhost:1633` and `http://localhost:11633`, set `BEE_API_URL` and `BEE_PEER_API_URL` environment variable, respectively.
To run test execute
```sh
npm run test
```