scuttle-testbot

Spins up an empty, temporary ssb-server server that stores data in your temp folder

Usage no npm install needed!

<script type="module">
  import scuttleTestbot from 'https://cdn.skypack.dev/scuttle-testbot';
</script>

README

scuttle-testbot

Spins up an empty, temporary ssb-server that stores data in your temp folder

Usage

var TestBot = require('scuttle-testbot')

var piet = TestBot()

piet.publish({type: 'test', content: "a test message"}, (err, msg) => {
  console.log(msg)
  piet.close()
})

Outputs:

{
  key: '%FQ2auS8kVY9qPgpTWNY3le/JG5+IlO6JHDjBIQcSPSc=.sha256',
  value: {
    previous: null,
    sequence: 1,
    author: '@UreG2i/rf4mz7QAVOtg0OML5SRRB42Cwwl3D1ct0mbU=.ed25519',
    timestamp: 1517190039755,
    hash: 'sha256',
    content: { type: 'test', content: 'a test message' },
    signature: '0AxMJ7cKjHQ6vJDPkVNWcGND4gUwv2Z8barND5eha7ZXH/s5T0trFqcratIqzmhE3YJU2FY61Rf1S/Za2foLCA==.sig.ed25519'
  },
  timestamp: 1517190039758
}

API

var TestBot = require('scuttle-testbot')

TestBot(opts = {})

Returns a ssb-server instance.

By default, CreateTestSbot deletes an existing database of the same name before starting.

Valid opts keys include:

  • opts.name String (optional) (default: ssb-test + Number(new Date))
  • opts.path String (optional) (default: /tmp/${name}, where name is the above)
    • ~/.ssb-test: Sets the database in ~/.ssb-test
  • opts.keys String (optional) (default: scuttle-testbot generates a new set of random keys)
    • you can create your own keys with ssbKeys.generate()
  • opts.startUnclean (default: false)
    • true: Don't delete an existing database before starting up.
    • this is useful if you want to test state after stopping and starting a server. In this case you need to set the name and keys options to be connecting to the same log
  • db2 (default: false)

TestBot.use(plugin)

CreateTestSbot.use lets you add ssb-server plugins. use can be chained the same as the ssb-server api.

Example:

function Server (opts) {
  const stack = Testbot
    .use('ssb-master')
    .use('ssb-tribes')

  return stack(opts)
}

Testbot.replicate({ from, to, live, name, log }, done)

Replicates data from one testbot to another, which is sometimes needed when you have functions which are only triggered by another feedId, e.g. when I am added to a private group someone else started.

Example:

const piet = TestBot()
const katie = TestBot()

const content = {
  type: 'direct-message',
  text: 'oh hey'
}

piet.publish(content, (err, msg) => {
  TestBot.replicate({ from: piet, to: katie }, (err) => {
    katie.get({ id: msg.key, private: true }, (err, value) => {

      console.log(value.content)
      // should be same as content piet sent, if katie can decrypt

      piet.close()
      katie.close()
    })
  })
})

arguments:

  • from SSB - an ssb instance to be replicated from. This will replicate only this feeds messages (not everything in log)
  • to SSB - an ssb instance being replicate to.
  • name Function (optional) - makes logged output easier to read by allowing you to replace feedIds with human readable names
    // example
    const name = (feedId) => {
      if (feedId === piet.id) return 'piet'
      if (feedId === katie.id) return 'katie'
    }
    
  • log Function|false (optional)
  • live Boolean (optional)- whether or not to keep replication running (default: false).
    • provide a custom logging function, or disable the logging by setting this false
    • default: console.log
  • done Function - an optional callback which is triggered when the replication is complete or if there is an error.
    • If live === true this will ony be called on an error. Signature done (err) { ... }

Also supports promise style.

  await TestBot.replicate({ from: piet, to: katie })

This requires that live: false

Under the hood this function just uses createHistoryStream directly from one peer to another

Testbot.connect(peers, { names, friends }, done)

Connects all listed peers.

Example:

const crypto = require('crypto')

const Server = (opts) => {
  const stack = require('scuttle-testbot')
    .use('ssb-friends') // only needed if opts.friends

  return stack(opts)
}

const caps = { shs: crypto.randomBytes(32).toString('base64') }
const piet = Server({ caps })
const katie = Server({ caps })
// all peers need to have same caps to be able to connect to each other

Testbot.connect([piet, katie], { friends: true }, (err) => {
  // as friends: true - piet now follows katie + vice versa
  // and there is a connection live between these two

  piet.close()
  katie.close()
})

arguments:

  • peers Array

    • a collection of ssb instances which will all be connected to one another
    • NOTE: by default scuttle-testbot creates random caps for each instance. You need to overide this as in example to form connections
  • opts Object

    • opts.friends Boolean (optional)
      • if true will get each peer to publish a follow for each other peer in the list
      • NOTE: this requires ssb-friends to be installed
      • default: false
    • opts.name Function (optional) - makes logged output easier to read by allowing you to replace feedIds with human readable names
      // example
      const name = (feedId) => {
        if (feedId === piet.id) return 'piet'
        if (feedId === katie.id) return 'katie'
      }
      
    • opts.log Function|false (optional)
      • provide a custom logging function, or disable the logging by setting this false
      • default: console.log
  • done Function - an optional callback which is triggered when the replication is complete or if there is an error.

    • If live === true this will ony be called on an error. Signature done (err) { ... }

Under the hood this just uses createHistoryStream directly from one peer to another

Also supports promise style.

  await Testbot.connect([piet, katie], { friends: true })

TestBot.colorLog(obj, ...)

Like console.log(JSON.stringify(obj, null, 2)) but also:

  • colorises the cipherlinks based on value - makes it easier to pattern-match across messages
  • removes quotes-marks from keys - easier to read
  • takes multiiple input values

License

MIT