---
# System prepended metadata

title: p2p data structures

---



**Details**
1. The database has a list of chat logs with unique ids(`self_id+peer_id+task_id`)
2. The peers will communicate through the exchange of a value each time
3. The chatlogs contain only two members and are composed of only one-way messages e.g. message from Ana to Bob for task 1


**Invite/Join Operation**
1. There is no such thing as invite.
2. The first time Ana needs to get the invite code to task 1 through other means.
3. Once Ana has the code. She can paste it and click join. A msg to create and append his writeable chatlog is sent to bob or maybe Ana can append this and notify Bob.
4. The invite code is maybe `bob_id+task_id`.
5. Two chat logs are appended to the DB. `ana_id+bob_id+task_id` by ana and `bob_id+ana_id+task_id` by bob.

**Chatlog message communication**
1. Bob append a message to chatlog `bob_id+ana_id+task_id`
2. Bob pings Ana or sends the latest length of the chatlog to Ana
3. Ana queries the DB using the index or maybe just checks the last appended message.

**Question?**
1. While the communication of chatlog messages is limited to the exchange of values or indexes, can we communicate a bit more for the creation of the chatlogs? E.g. see point 3 of **Invite/Join Operation**

---

### `journaling book database` module + `peer to peer networking` module
```js
const require = ((registry, modules = {}) => function require (name) {
  if (modules[name]) return modules[name].exports
  if (registry[name]) {
    const exports = {}
    const module = { exports }
    registry[name](exports, module, require)
    return (modules[name] = module).exports
  }
  throw new Error(`module "${name}" not found`)
})({
/******************************************************************************
  DB.js
******************************************************************************/
  db: function DB_js (exports, module, require) { // DB.js
    const taken = {}
    DB.reset = reset
    module.exports = DB
    function reset () { localStorage.clear() }
    function DB (seed, hook) {
      if (taken[seed]) throw new Error(`seed "${seed}" already taken`)
      const json = localStorage[seed] || (localStorage[seed] = '{}')
      const db = taken[seed] = JSON.parse(json)
      return { reader: id => make(id), author: id => make(id, 1), on }
      function on (debug) { hook = debug }
      function make (id, own) {
        if (!id) throw new Error('no journal book "id" provided')
        const book = db[id] || own && (db[id] = { id, seed, pages: [], peer: {} })
        if (own && (book.seed !== seed)) throw new Error('unauthorized')
        return own ? { id, add, get, len } : { id, get, len }
        async function add (x) {
          const len = book.pages.push(x)
          hook?.(x, id)
          localStorage[seed] = JSON.stringify(db)
          return len
        }
        async function get (i) { return book.pages[i] } // opts = { wait: false }
        async function len () { return book.pages.length }
      }
    }
  },
/******************************************************************************
  IO.js
******************************************************************************/
  io: function IO_js (exports, module, require) { // IO.js
    const taken = {}
    module.exports = IO
    function IO (alias, seed) {
      if (taken[seed]) throw new Error(`seed "${seed}" already taken`)
      const pk = seed.slice(0, seed.length / 2)
      const sk = seed.slice(seed.length / 2, seed.length)
      const network = taken[pk] = { id: pk, alias, peer: {} }
      const io = { at, on }
      return io
      async function at (id) {
        const peer = taken[id] || {}
        if (id === pk) throw new Error('cannot connect to itself')
        if (!network.online) throw new Error('network must be online')
        if (!peer.online) return // peer with id is offline or doesnt exist
        const { port1, port2 } = new MessageChannel()
        port2.by = port1.to = { id, alias }
        port1.to = port1.by = { id: pk, alias: peer.alias }
        peer.peer[pk] = port2
        peer.online(port2)
        return network.peer[id] = port1
      }
      function on (online) { network.online = online }
    }
  }
  /***************************************************************************/
})
/******************************************************************************
EXAMPLE:
******************************************************************************/
ANA() // start
// --------------------------------------------
async function ANA () {
  const IO = require('io')
  const DB = require('db')
  const [pk, sk] = [`6789yuoi`, `9876oiuy`]
  const seed = pk + sk
  const self_id = pk // state.id
  // --------------------
  const db = DB(seed)
  const io = IO('ana', seed)
  // --------------------
  const invite = { peer_id: self_id, info_id: '' }
  // --------------------
  // @TODO: example usage:
  io.on(port => {
    console.log('[ANA:IO]:connecting', port.by)
  })
  BOB(invite)
}
// --------------------------------------------
async function BOB (invite) {
  const IO = require('io')
  const DB = require('db')
  const generate_id = () => `${Math.random()}`.slice(2)
  const [pk, sk] = [`1234asdf`, `4321fdsa`]
  const seed = pk + sk
  const self_id = pk // state.id
  // --------------------
  const db = DB(seed)
  const io = IO('bob', seed)
  // --------------------
  const { peer_id, info_id } = invite
  // --------------------
  // @TODO: example usage:
  db.on((book_id, data) => { console.log('[BOB:DB]:append', { book_id, data }) })

  const book1 = db.author(`${self_id}-${peer_id}-${info_id}`)
  const book2 = db.reader(`${peer_id}-${self_id}-${info_id}`)

  console.log({ book1, book2 })

  io.on(peer => {
    console.log('[BOB:IO]:connecting', port.by)
  })
  io.at(peer_id)
}
```

**Summary**
- The goal of this project [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1235708587234562099)
- Here's how to structure task rooms [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1235710674290737163)
- Here's some naming convention [ref1](https://discord.com/channels/859134561018839060/1235708415322361966/1235718837765410919) [ref2](https://discord.com/channels/859134561018839060/1235708415322361966/1235711458487308409)
- Here's how to implement two peers [ref1](https://discord.com/channels/859134561018839060/1235708415322361966/1236072153569296415) [ref2](https://discord.com/channels/859134561018839060/1235708415322361966/1236430075650379806)
- Here's introduction of financial book keeping [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1236431670182285383)
- p2p data structure and how to mimic it [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1236454496188633239)
- Minimum use of `IO` [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1237085298467536976)
- Step-by-step explanation of the protocol b/w two peers [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1237205792789237860)
- Here's vault intro [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1237465272722653225)
- Talking about keeping communication minimum [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1237797514405740675)
- Here occured the big change in `DB` [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1238187047362101360)
- `dbdevtools` module discussion [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1238882893011484762)
- Data structure explanation [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1239211352183275540)
- Another major change in `DB` [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1239371466181709937)
- Explanation of standard msg format [ref](https://discord.com/channels/859134561018839060/1235708415322361966/1239312712668811444)