Compare commits
1 commit
main
...
js/automer
Author | SHA1 | Date | |
---|---|---|---|
|
28849ed9dc |
7 changed files with 1895 additions and 346 deletions
17
.github/workflows/advisory-cron.yaml
vendored
17
.github/workflows/advisory-cron.yaml
vendored
|
@ -1,17 +0,0 @@
|
|||
name: Advisories
|
||||
on:
|
||||
schedule:
|
||||
- cron: '0 18 * * *'
|
||||
jobs:
|
||||
cargo-deny:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
checks:
|
||||
- advisories
|
||||
- bans licenses sources
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: EmbarkStudios/cargo-deny-action@v1
|
||||
with:
|
||||
command: check ${{ matrix.checks }}
|
177
.github/workflows/ci.yaml
vendored
177
.github/workflows/ci.yaml
vendored
|
@ -1,177 +0,0 @@
|
|||
name: CI
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
pull_request:
|
||||
branches:
|
||||
- main
|
||||
jobs:
|
||||
fmt:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.66.0
|
||||
default: true
|
||||
components: rustfmt
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- run: ./scripts/ci/fmt
|
||||
shell: bash
|
||||
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.66.0
|
||||
default: true
|
||||
components: clippy
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- run: ./scripts/ci/lint
|
||||
shell: bash
|
||||
|
||||
docs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.66.0
|
||||
default: true
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- name: Build rust docs
|
||||
run: ./scripts/ci/rust-docs
|
||||
shell: bash
|
||||
- name: Install doxygen
|
||||
run: sudo apt-get install -y doxygen
|
||||
shell: bash
|
||||
|
||||
cargo-deny:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
checks:
|
||||
- advisories
|
||||
- bans licenses sources
|
||||
continue-on-error: ${{ matrix.checks == 'advisories' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: EmbarkStudios/cargo-deny-action@v1
|
||||
with:
|
||||
arguments: '--manifest-path ./rust/Cargo.toml'
|
||||
command: check ${{ matrix.checks }}
|
||||
|
||||
wasm_tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install wasm-bindgen-cli
|
||||
run: cargo install wasm-bindgen-cli wasm-opt
|
||||
- name: Install wasm32 target
|
||||
run: rustup target add wasm32-unknown-unknown
|
||||
- name: run tests
|
||||
run: ./scripts/ci/wasm_tests
|
||||
deno_tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: denoland/setup-deno@v1
|
||||
with:
|
||||
deno-version: v1.x
|
||||
- name: Install wasm-bindgen-cli
|
||||
run: cargo install wasm-bindgen-cli wasm-opt
|
||||
- name: Install wasm32 target
|
||||
run: rustup target add wasm32-unknown-unknown
|
||||
- name: run tests
|
||||
run: ./scripts/ci/deno_tests
|
||||
|
||||
js_fmt:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: install
|
||||
run: yarn global add prettier
|
||||
- name: format
|
||||
run: prettier -c javascript/.prettierrc javascript
|
||||
|
||||
js_tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Install wasm-bindgen-cli
|
||||
run: cargo install wasm-bindgen-cli wasm-opt
|
||||
- name: Install wasm32 target
|
||||
run: rustup target add wasm32-unknown-unknown
|
||||
- name: run tests
|
||||
run: ./scripts/ci/js_tests
|
||||
|
||||
cmake_build:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.66.0
|
||||
default: true
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- name: Install CMocka
|
||||
run: sudo apt-get install -y libcmocka-dev
|
||||
- name: Install/update CMake
|
||||
uses: jwlawson/actions-setup-cmake@v1.12
|
||||
with:
|
||||
cmake-version: latest
|
||||
- name: Build and test C bindings
|
||||
run: ./scripts/ci/cmake-build Release Static
|
||||
shell: bash
|
||||
|
||||
linux:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
toolchain:
|
||||
- 1.60.0
|
||||
- nightly
|
||||
continue-on-error: ${{ matrix.toolchain == 'nightly' }}
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: ${{ matrix.toolchain }}
|
||||
default: true
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- run: ./scripts/ci/build-test
|
||||
shell: bash
|
||||
|
||||
macos:
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.66.0
|
||||
default: true
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- run: ./scripts/ci/build-test
|
||||
shell: bash
|
||||
|
||||
windows:
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: 1.66.0
|
||||
default: true
|
||||
- uses: Swatinem/rust-cache@v1
|
||||
- run: ./scripts/ci/build-test
|
||||
shell: bash
|
52
.github/workflows/docs.yaml
vendored
52
.github/workflows/docs.yaml
vendored
|
@ -1,52 +0,0 @@
|
|||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
name: Documentation
|
||||
|
||||
jobs:
|
||||
deploy-docs:
|
||||
concurrency: deploy-docs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Toolchain
|
||||
uses: actions-rs/toolchain@v1
|
||||
with:
|
||||
profile: minimal
|
||||
toolchain: stable
|
||||
override: true
|
||||
|
||||
- name: Cache
|
||||
uses: Swatinem/rust-cache@v1
|
||||
|
||||
- name: Clean docs dir
|
||||
run: rm -rf docs
|
||||
shell: bash
|
||||
|
||||
- name: Clean Rust docs dir
|
||||
uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: clean
|
||||
args: --manifest-path ./rust/Cargo.toml --doc
|
||||
|
||||
- name: Build Rust docs
|
||||
uses: actions-rs/cargo@v1
|
||||
with:
|
||||
command: doc
|
||||
args: --manifest-path ./rust/Cargo.toml --workspace --all-features --no-deps
|
||||
|
||||
- name: Move Rust docs
|
||||
run: mkdir -p docs && mv rust/target/doc/* docs/.
|
||||
shell: bash
|
||||
|
||||
- name: Configure root page
|
||||
run: echo '<meta http-equiv="refresh" content="0; url=automerge">' > docs/index.html
|
||||
|
||||
- name: Deploy docs
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
with:
|
||||
github_token: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish_dir: ./docs
|
100
.github/workflows/release.yaml
vendored
100
.github/workflows/release.yaml
vendored
|
@ -1,100 +0,0 @@
|
|||
name: Release
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
|
||||
jobs:
|
||||
check_if_wasm_version_upgraded:
|
||||
name: Check if WASM version has been upgraded
|
||||
runs-on: ubuntu-latest
|
||||
outputs:
|
||||
wasm_version: ${{ steps.version-updated.outputs.current-package-version }}
|
||||
wasm_has_updated: ${{ steps.version-updated.outputs.has-updated }}
|
||||
steps:
|
||||
- uses: JiPaix/package-json-updated-action@v1.0.5
|
||||
id: version-updated
|
||||
with:
|
||||
path: rust/automerge-wasm/package.json
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
publish-wasm:
|
||||
name: Publish WASM package
|
||||
runs-on: ubuntu-latest
|
||||
needs:
|
||||
- check_if_wasm_version_upgraded
|
||||
# We create release only if the version in the package.json has been upgraded
|
||||
#if: needs.check_if_wasm_version_upgraded.outputs.wasm_has_updated == 'true'
|
||||
steps:
|
||||
- uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '16.x'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
- uses: denoland/setup-deno@v1
|
||||
- uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: ${{ github.ref }}
|
||||
- name: Get rid of local github workflows
|
||||
run: rm -r .github/workflows
|
||||
- name: Remove tmp_branch if it exists
|
||||
run: git push origin :tmp_branch || true
|
||||
- run: git checkout -b tmp_branch
|
||||
- name: Install wasm-bindgen-cli
|
||||
run: cargo install wasm-bindgen-cli wasm-opt
|
||||
- name: Install wasm32 target
|
||||
run: rustup target add wasm32-unknown-unknown
|
||||
- name: run wasm js tests
|
||||
id: wasm_js_tests
|
||||
run: ./scripts/ci/wasm_tests
|
||||
- name: run wasm deno tests
|
||||
id: wasm_deno_tests
|
||||
run: ./scripts/ci/deno_tests
|
||||
- name: Collate deno release files
|
||||
if: steps.wasm_js_tests.outcome == 'success' && steps.wasm_deno_tests.outcome == 'success'
|
||||
run: |
|
||||
mkdir $GITHUB_WORKSPACE/deno_wasm_dist
|
||||
cp $GITHUB_WORKSPACE/rust/automerge-wasm/deno/* $GITHUB_WORKSPACE/deno_wasm_dist
|
||||
cp $GITHUB_WORKSPACE/rust/automerge-wasm/index.d.ts $GITHUB_WORKSPACE/deno_wasm_dist
|
||||
sed -i '1i /// <reference types="./index.d.ts" />' $GITHUB_WORKSPACE/deno_wasm_dist/automerge_wasm.js
|
||||
- name: Create npm release
|
||||
if: steps.wasm_js_tests.outcome == 'success' && steps.wasm_deno_tests.outcome == 'success'
|
||||
run: |
|
||||
if [ "$(npm --prefix $GITHUB_WORKSPACE/rust/automerge-wasm show . version)" = "$VERSION" ]; then
|
||||
echo "This version is already published"
|
||||
exit 0
|
||||
fi
|
||||
EXTRA_ARGS="--access public"
|
||||
if [[ $VERSION == *"alpha."* ]] || [[ $VERSION == *"beta."* ]] || [[ $VERSION == *"rc."* ]]; then
|
||||
echo "Is pre-release version"
|
||||
EXTRA_ARGS="$EXTRA_ARGS --tag next"
|
||||
fi
|
||||
if [ "$NODE_AUTH_TOKEN" = "" ]; then
|
||||
echo "Can't publish on NPM, You need a NPM_TOKEN secret."
|
||||
false
|
||||
fi
|
||||
npm publish $GITHUB_WORKSPACE/rust/automerge-wasm $EXTRA_ARGS
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
|
||||
VERSION: ${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }}
|
||||
- name: Commit wasm deno release files
|
||||
run: |
|
||||
git config --global user.name "actions"
|
||||
git config --global user.email actions@github.com
|
||||
git add $GITHUB_WORKSPACE/deno_wasm_dist
|
||||
git commit -am "Add deno release files"
|
||||
git push origin tmp_branch
|
||||
- name: Tag wasm release
|
||||
if: steps.wasm_js_tests.outcome == 'success' && steps.wasm_deno_tests.outcome == 'success'
|
||||
uses: softprops/action-gh-release@v1
|
||||
with:
|
||||
name: Automerge Wasm v${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }}
|
||||
tag_name: js/automerge-wasm-${{ needs.check_if_wasm_version_upgraded.outputs.wasm_version }}
|
||||
target_commitish: tmp_branch
|
||||
generate_release_notes: false
|
||||
draft: false
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Remove tmp_branch
|
||||
run: git push origin :tmp_branch
|
||||
|
1663
deno_wasm_dist/automerge_wasm.js
Normal file
1663
deno_wasm_dist/automerge_wasm.js
Normal file
File diff suppressed because it is too large
Load diff
BIN
deno_wasm_dist/automerge_wasm_bg.wasm
Normal file
BIN
deno_wasm_dist/automerge_wasm_bg.wasm
Normal file
Binary file not shown.
232
deno_wasm_dist/index.d.ts
vendored
Normal file
232
deno_wasm_dist/index.d.ts
vendored
Normal file
|
@ -0,0 +1,232 @@
|
|||
export type Actor = string;
|
||||
export type ObjID = string;
|
||||
export type Change = Uint8Array;
|
||||
export type SyncMessage = Uint8Array;
|
||||
export type Prop = string | number;
|
||||
export type Hash = string;
|
||||
export type Heads = Hash[];
|
||||
export type Value = string | number | boolean | null | Date | Uint8Array
|
||||
export type MaterializeValue = { [key:string]: MaterializeValue } | Array<MaterializeValue> | Value
|
||||
export type ObjType = string | Array<ObjType | Value> | { [key: string]: ObjType | Value }
|
||||
export type FullValue =
|
||||
["str", string] |
|
||||
["int", number] |
|
||||
["uint", number] |
|
||||
["f64", number] |
|
||||
["boolean", boolean] |
|
||||
["timestamp", Date] |
|
||||
["counter", number] |
|
||||
["bytes", Uint8Array] |
|
||||
["null", null] |
|
||||
["map", ObjID] |
|
||||
["list", ObjID] |
|
||||
["text", ObjID] |
|
||||
["table", ObjID]
|
||||
|
||||
export type FullValueWithId =
|
||||
["str", string, ObjID ] |
|
||||
["int", number, ObjID ] |
|
||||
["uint", number, ObjID ] |
|
||||
["f64", number, ObjID ] |
|
||||
["boolean", boolean, ObjID ] |
|
||||
["timestamp", Date, ObjID ] |
|
||||
["counter", number, ObjID ] |
|
||||
["bytes", Uint8Array, ObjID ] |
|
||||
["null", null, ObjID ] |
|
||||
["map", ObjID ] |
|
||||
["list", ObjID] |
|
||||
["text", ObjID] |
|
||||
["table", ObjID]
|
||||
|
||||
export enum ObjTypeName {
|
||||
list = "list",
|
||||
map = "map",
|
||||
table = "table",
|
||||
text = "text",
|
||||
}
|
||||
|
||||
export type Datatype =
|
||||
"boolean" |
|
||||
"str" |
|
||||
"int" |
|
||||
"uint" |
|
||||
"f64" |
|
||||
"null" |
|
||||
"timestamp" |
|
||||
"counter" |
|
||||
"bytes" |
|
||||
"map" |
|
||||
"text" |
|
||||
"list";
|
||||
|
||||
export type SyncHave = {
|
||||
lastSync: Heads,
|
||||
bloom: Uint8Array,
|
||||
}
|
||||
|
||||
export type DecodedSyncMessage = {
|
||||
heads: Heads,
|
||||
need: Heads,
|
||||
have: SyncHave[]
|
||||
changes: Change[]
|
||||
}
|
||||
|
||||
export type DecodedChange = {
|
||||
actor: Actor,
|
||||
seq: number
|
||||
startOp: number,
|
||||
time: number,
|
||||
message: string | null,
|
||||
deps: Heads,
|
||||
hash: Hash,
|
||||
ops: Op[]
|
||||
}
|
||||
|
||||
type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
|
||||
export type ChangeToEncode = PartialBy<DecodedChange, 'hash'>
|
||||
|
||||
export type Op = {
|
||||
action: string,
|
||||
obj: ObjID,
|
||||
key: string,
|
||||
value?: string | number | boolean,
|
||||
datatype?: string,
|
||||
pred: string[],
|
||||
}
|
||||
|
||||
export type Patch = PutPatch | DelPatch | SplicePatch | IncPatch;
|
||||
|
||||
export type PutPatch = {
|
||||
action: 'put'
|
||||
path: Prop[],
|
||||
value: Value
|
||||
conflict: boolean
|
||||
}
|
||||
|
||||
export type IncPatch = {
|
||||
action: 'inc'
|
||||
path: Prop[],
|
||||
value: number
|
||||
}
|
||||
|
||||
export type DelPatch = {
|
||||
action: 'del'
|
||||
path: Prop[],
|
||||
length?: number,
|
||||
}
|
||||
|
||||
export type SplicePatch = {
|
||||
action: 'splice'
|
||||
path: Prop[],
|
||||
values: Value[],
|
||||
}
|
||||
|
||||
export function encodeChange(change: ChangeToEncode): Change;
|
||||
export function create(text_v2: boolean, actor?: Actor): Automerge;
|
||||
export function load(data: Uint8Array, text_v2: boolean, actor?: Actor): Automerge;
|
||||
export function decodeChange(change: Change): DecodedChange;
|
||||
export function initSyncState(): SyncState;
|
||||
export function encodeSyncMessage(message: DecodedSyncMessage): SyncMessage;
|
||||
export function decodeSyncMessage(msg: SyncMessage): DecodedSyncMessage;
|
||||
export function encodeSyncState(state: SyncState): Uint8Array;
|
||||
export function decodeSyncState(data: Uint8Array): SyncState;
|
||||
export function exportSyncState(state: SyncState): JsSyncState;
|
||||
export function importSyncState(state: JsSyncState): SyncState;
|
||||
|
||||
export interface API {
|
||||
create(text_v2: boolean, actor?: Actor): Automerge;
|
||||
load(data: Uint8Array, text_v2: boolean, actor?: Actor): Automerge;
|
||||
encodeChange(change: ChangeToEncode): Change;
|
||||
decodeChange(change: Change): DecodedChange;
|
||||
initSyncState(): SyncState;
|
||||
encodeSyncMessage(message: DecodedSyncMessage): SyncMessage;
|
||||
decodeSyncMessage(msg: SyncMessage): DecodedSyncMessage;
|
||||
encodeSyncState(state: SyncState): Uint8Array;
|
||||
decodeSyncState(data: Uint8Array): SyncState;
|
||||
exportSyncState(state: SyncState): JsSyncState;
|
||||
importSyncState(state: JsSyncState): SyncState;
|
||||
}
|
||||
|
||||
export class Automerge {
|
||||
// change state
|
||||
put(obj: ObjID, prop: Prop, value: Value, datatype?: Datatype): void;
|
||||
putObject(obj: ObjID, prop: Prop, value: ObjType): ObjID;
|
||||
insert(obj: ObjID, index: number, value: Value, datatype?: Datatype): void;
|
||||
insertObject(obj: ObjID, index: number, value: ObjType): ObjID;
|
||||
push(obj: ObjID, value: Value, datatype?: Datatype): void;
|
||||
pushObject(obj: ObjID, value: ObjType): ObjID;
|
||||
splice(obj: ObjID, start: number, delete_count: number, text?: string | Array<Value>): ObjID[] | undefined;
|
||||
increment(obj: ObjID, prop: Prop, value: number): void;
|
||||
delete(obj: ObjID, prop: Prop): void;
|
||||
|
||||
// returns a single value - if there is a conflict return the winner
|
||||
get(obj: ObjID, prop: Prop, heads?: Heads): Value | undefined;
|
||||
getWithType(obj: ObjID, prop: Prop, heads?: Heads): FullValue | null;
|
||||
// return all values in case of a conflict
|
||||
getAll(obj: ObjID, arg: Prop, heads?: Heads): FullValueWithId[];
|
||||
keys(obj: ObjID, heads?: Heads): string[];
|
||||
text(obj: ObjID, heads?: Heads): string;
|
||||
length(obj: ObjID, heads?: Heads): number;
|
||||
materialize(obj?: ObjID, heads?: Heads, metadata?: unknown): MaterializeValue;
|
||||
toJS(): MaterializeValue;
|
||||
|
||||
// transactions
|
||||
commit(message?: string, time?: number): Hash | null;
|
||||
emptyChange(message?: string, time?: number): Hash;
|
||||
merge(other: Automerge): Heads;
|
||||
getActorId(): Actor;
|
||||
pendingOps(): number;
|
||||
rollback(): number;
|
||||
|
||||
// patches
|
||||
enablePatches(enable: boolean): boolean;
|
||||
enableFreeze(enable: boolean): boolean;
|
||||
registerDatatype(datatype: string, callback: Function): void;
|
||||
popPatches(): Patch[];
|
||||
|
||||
// save and load to local store
|
||||
save(): Uint8Array;
|
||||
saveIncremental(): Uint8Array;
|
||||
loadIncremental(data: Uint8Array): number;
|
||||
|
||||
// sync over network
|
||||
receiveSyncMessage(state: SyncState, message: SyncMessage): void;
|
||||
generateSyncMessage(state: SyncState): SyncMessage | null;
|
||||
|
||||
// low level change functions
|
||||
applyChanges(changes: Change[]): void;
|
||||
getChanges(have_deps: Heads): Change[];
|
||||
getChangeByHash(hash: Hash): Change | null;
|
||||
getChangesAdded(other: Automerge): Change[];
|
||||
getHeads(): Heads;
|
||||
getLastLocalChange(): Change | null;
|
||||
getMissingDeps(heads?: Heads): Heads;
|
||||
|
||||
// memory management
|
||||
free(): void; // only needed if weak-refs are unsupported
|
||||
clone(actor?: string): Automerge; // TODO - remove, this is dangerous
|
||||
fork(actor?: string, heads?: Heads): Automerge;
|
||||
|
||||
// dump internal state to console.log - for debugging
|
||||
dump(): void;
|
||||
|
||||
// experimental api can go here
|
||||
applyPatches<Doc>(obj: Doc, meta?: unknown, callback?: (patch: Array<Patch>, before: Doc, after: Doc) => void): Doc;
|
||||
}
|
||||
|
||||
export interface JsSyncState {
|
||||
sharedHeads: Heads;
|
||||
lastSentHeads: Heads;
|
||||
theirHeads: Heads | undefined;
|
||||
theirHeed: Heads | undefined;
|
||||
theirHave: SyncHave[] | undefined;
|
||||
sentHashes: Heads;
|
||||
}
|
||||
|
||||
export class SyncState {
|
||||
free(): void;
|
||||
clone(): SyncState;
|
||||
lastSentHeads: Heads;
|
||||
sentHashes: Heads;
|
||||
readonly sharedHeads: Heads;
|
||||
}
|
Loading…
Add table
Reference in a new issue