Skip to content

Instantly share code, notes, and snippets.

@josephg
josephg / bench-automerge.js
Last active March 4, 2024 19:03
benchmark code from blog post
// Run with node --expose-gc bench.js ../automerge-paper.json.gz
// automerge-paper.json.gz from https://github.com/josephg/crdt-benchmarks
// Read in a patch file and check that the patches all apply correctly.
const fs = require('fs')
const assert = require('assert')
const zlib = require('zlib')
const automerge = require('automerge')
const v8 = require('v8')
@josephg
josephg / out.js
Last active August 3, 2021 22:21
automerge output flat
CACHE = {
_root: {
text: {
elems: [
{
elemId: '2@3cb54fecd444446cbe579bd128017c42',
pred: [ '2@3cb54fecd444446cbe579bd128017c42' ],
value: 'a'
},
{
{
seq: 4,
maxOp: 4,
requests: [],
clock: { '09828cbcb7e14699b37ad87ffe64b448': 4 },
deps: [],
backendState: {
state: Map {
size: 2,
_root: ArrayMapNode {
import assert from 'assert'
import seed from 'seed-random'
type Id = [agent: string, seq: number]
type Version = Record<string, number> // Last seen seq for each agent.
type Algorithm = {
integrate: <T>(doc: Doc<T>, newItem: Item<T>) => void
ignoreTests?: string[]
}// & Record<string, any>
// This implements the core algorithm of Yjs, but with some tweaks in about 100 lines.
// This is a toy and it probably still has some small bugs.
import assert from 'assert/strict'
type Id = {
agent: string,
seq: number,
}
import * as Y from 'yjs'
const makeYDoc = (clientId: number) => {
const doc = new Y.Doc()
doc.clientID = clientId
return doc
}
const yjsMergeInto = (target: Y.Doc, src: Y.Doc) => {
const sv = Y.encodeStateVector(target)
@josephg
josephg / operations.ts
Last active December 3, 2020 08:58
P2p database sketch
/**
* This is a simple example program showing a working in-memory database storing
* full history and branches. In this demo the "database" is a Map from string
* keys to values.
*
* Everything is versioned - you can wind time forward and backwards, and mark a
* branch and teleport the database back to that point in time.
*
* Conflicts are handled similarly to Basho's riak. When concurrent writes
* happen, the database stores every concurrent version of the document. A
@josephg
josephg / game.js
Created April 7, 2019 08:44
sammy arms
// Avaliable globals:
// ctx (rendering context)
// width, height (the width and height of the window)
const TAU = Math.PI * 2
const circle = (cx, cy, r) => {
ctx.arc(cx, cy, r, 0, TAU)
}
const mouse = {x:0, y:0}
@josephg
josephg / test.c
Created March 25, 2019 12:20
async crash
#include <strings.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
#include <pthread.h>
#include <time.h>
#include <unistd.h>
#include <stdbool.h>
@josephg
josephg / README.md
Created February 4, 2019 21:54
Foundationdb C API example

This is a simple example program using the foundationdb C API. Its written & tested on macos; but it should be easy to adapt to work on BSD / linux.

This also demonstrates using libuv to integrate foundationdb into a run loop. Promises are run in the main libuv loop.

Compile with

$ clang test.c -Wall -lfdb_c -I/usr/local/include -luv