UNPKG

@dao-xyz/peerbit

Version:

Distributed p2p database on IPFS

142 lines 5.3 kB
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; import { variant, option, field, vec, serialize, fixedArray, } from "@dao-xyz/borsh"; import { Entry } from "@dao-xyz/peerbit-log"; import { DecryptedThing } from "@dao-xyz/peerbit-crypto"; import { MaybeSigned } from "@dao-xyz/peerbit-crypto"; import { logger as loggerFn } from "@dao-xyz/peerbit-logger"; import { TransportMessage } from "./message.js"; import { v4 as uuid } from "uuid"; const logger = loggerFn({ module: "exchange-heads" }); export class MinReplicas { get value() { throw new Error("Not implemented"); } } export let AbsolutMinReplicas = class AbsolutMinReplicas extends MinReplicas { _value; constructor(value) { super(); this._value = value; } get value() { return this._value; } }; AbsolutMinReplicas = __decorate([ variant(0), __metadata("design:paramtypes", [Number]) ], AbsolutMinReplicas); /** * This thing allows use to faster sync since we can provide * references that can be read concurrently to * the entry when doing Log.fromEntry or Log.fromEntryHash */ export let EntryWithRefs = class EntryWithRefs { entry; references; // are some parents to the entry constructor(properties) { this.entry = properties.entry; this.references = properties.references; } }; __decorate([ field({ type: Entry }), __metadata("design:type", Entry) ], EntryWithRefs.prototype, "entry", void 0); __decorate([ field({ type: vec(Entry) }), __metadata("design:type", Array) ], EntryWithRefs.prototype, "references", void 0); EntryWithRefs = __decorate([ variant(0), __metadata("design:paramtypes", [Object]) ], EntryWithRefs); export let ExchangeHeadsMessage = class ExchangeHeadsMessage extends TransportMessage { logId; heads; minReplicas; reserved = new Uint8Array(4); constructor(props) { super(); this.id = uuid(); this.logId = props.logId; this.heads = props.heads; this.minReplicas = props.minReplicas; } }; __decorate([ field({ type: fixedArray("u8", 32) }), __metadata("design:type", Uint8Array) ], ExchangeHeadsMessage.prototype, "logId", void 0); __decorate([ field({ type: vec(EntryWithRefs) }), __metadata("design:type", Array) ], ExchangeHeadsMessage.prototype, "heads", void 0); __decorate([ field({ type: option(MinReplicas) }), __metadata("design:type", MinReplicas) ], ExchangeHeadsMessage.prototype, "minReplicas", void 0); __decorate([ field({ type: fixedArray("u8", 4) }), __metadata("design:type", Uint8Array) ], ExchangeHeadsMessage.prototype, "reserved", void 0); ExchangeHeadsMessage = __decorate([ variant([0, 0]), __metadata("design:paramtypes", [Object]) ], ExchangeHeadsMessage); export let RequestHeadsMessage = class RequestHeadsMessage extends TransportMessage { address; constructor(props) { super(); if (props) { this.address = props.address; } } }; __decorate([ field({ type: "string" }), __metadata("design:type", String) ], RequestHeadsMessage.prototype, "address", void 0); RequestHeadsMessage = __decorate([ variant([0, 1]), __metadata("design:paramtypes", [Object]) ], RequestHeadsMessage); export const createExchangeHeadsMessage = async (log, heads, includeReferences, identity) => { const headsSet = new Set(heads); const headsWithRefs = await Promise.all(heads.map(async (head) => { const refs = !includeReferences ? [] : (await log.getReferenceSamples(head, { pointerCount: 8, memoryLimit: 1e6 / heads.length, })) // 1mb total limit split on all heads .filter((r) => !headsSet.has(r)); // pick a proportional amount of refs so we can efficiently load the log. TODO should be equidistant for good performance? return new EntryWithRefs({ entry: head, references: refs, }); })); logger.debug(`Send latest heads of '${log.id}'`); const message = new ExchangeHeadsMessage({ logId: log.id, heads: headsWithRefs, }); const maybeSigned = new MaybeSigned({ data: serialize(message) }); let signedMessage = maybeSigned; if (identity) { signedMessage = await signedMessage.sign(identity.sign.bind(identity)); } const decryptedMessage = new DecryptedThing({ data: serialize(signedMessage), }); // TODO encryption? return serialize(decryptedMessage); }; //# sourceMappingURL=exchange-heads.js.map