Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add namespace to peer pre-have messages #314

Merged
merged 1 commit into from
Oct 5, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions proto/buf.gen.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,4 @@ plugins:
- useOptionals=none
- outputPartialMethods=true
- stringEnums=true
- enumsAsLiterals=true
10 changes: 10 additions & 0 deletions proto/extensions.proto
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,17 @@ message ProjectExtension {
}

message HaveExtension {

enum Namespace {
auth = 0;
config = 1;
data = 2;
blobIndex = 3;
blob = 4;
}

bytes discoveryKey = 1;
uint64 start = 2;
bytes encodedBitfield = 3;
Namespace namespace = 4;
}
34 changes: 21 additions & 13 deletions src/core-manager/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ const CREATE_SQL = `CREATE TABLE IF NOT EXISTS ${TABLE} (
/**
* @typedef {Object} Events
* @property {(coreRecord: CoreRecord) => void} add-core
* @property {(coreDiscoveryId: string, peerId: string, msg: { start: number, bitfield: Uint32Array }) => void} peer-have
* @property {(namespace: Namespace, msg: { coreDiscoveryId: string, peerId: string, start: number, bitfield: Uint32Array }) => void} peer-have
*/

/**
Expand Down Expand Up @@ -470,15 +470,21 @@ export class CoreManager extends TypedEmitter {
}

/**
* @param {HaveMsg} msg
* @param {Omit<HaveMsg, 'namespace'> & { namespace: Namespace | 'UNRECOGNIZED' }} msg
* @param {any} peer
*/
#handleHaveMessage(msg, peer) {
const { start, discoveryKey, bitfield } = msg
const { start, discoveryKey, bitfield, namespace } = msg
if (namespace === 'UNRECOGNIZED') return
/** @type {string} */
const peerId = peer.remotePublicKey.toString('hex')
const discoveryId = discoveryKey.toString('hex')
this.emit('peer-have', discoveryId, peerId, { start, bitfield })
const coreDiscoveryId = discoveryKey.toString('hex')
this.emit('peer-have', namespace, {
coreDiscoveryId,
peerId,
start,
bitfield,
})
}

/**
Expand All @@ -494,7 +500,7 @@ export class CoreManager extends TypedEmitter {

peer.protomux.cork()

for (const { core } of this.#coreIndex) {
for (const { core, namespace } of this.#coreIndex) {
// We want ready() rather than update() because we are only interested in local data
await core.ready()
if (core.length === 0) continue
Expand All @@ -505,7 +511,7 @@ export class CoreManager extends TypedEmitter {
// @ts-ignore - accessing internal property
const bitfieldIterator = core.core.bitfield.want(0, core.length)
for (const { start, bitfield } of bitfieldIterator) {
const message = { start, bitfield, discoveryKey }
const message = { start, bitfield, discoveryKey, namespace }
this.#haveExtension.send(message, peer)
}
}
Expand All @@ -519,6 +525,7 @@ export class CoreManager extends TypedEmitter {
* @property {Buffer} discoveryKey
* @property {number} start
* @property {Uint32Array} bitfield
* @property {Namespace} namespace
*/

const ProjectExtensionCodec = {
Expand All @@ -534,24 +541,25 @@ const ProjectExtensionCodec = {

const HaveExtensionCodec = {
/** @param {HaveMsg} msg */
encode({ start, discoveryKey, bitfield }) {
encode({ start, discoveryKey, bitfield, namespace }) {
const encodedBitfield = rle.encode(bitfield)
const msg = { start, discoveryKey, encodedBitfield }
const msg = { start, discoveryKey, encodedBitfield, namespace }
return HaveExtension.encode(msg).finish()
},
/**
* @param {Buffer | Uint8Array} buf
* @returns {HaveMsg}
* @returns {Omit<HaveMsg, 'namespace'> & { namespace: HaveMsg['namespace'] | 'UNRECOGNIZED' }}
*/
decode(buf) {
const { start, discoveryKey, encodedBitfield } = HaveExtension.decode(buf)
const { start, discoveryKey, encodedBitfield, namespace } =
HaveExtension.decode(buf)
try {
const bitfield = rle.decode(encodedBitfield)
return { start, discoveryKey, bitfield }
return { start, discoveryKey, bitfield, namespace }
} catch (e) {
// TODO: Log error
console.error(e)
return { start, discoveryKey, bitfield: new Uint32Array() }
return { start, discoveryKey, bitfield: new Uint32Array(), namespace }
}
},
}
Expand Down
16 changes: 16 additions & 0 deletions src/generated/extensions.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,19 @@ export interface HaveExtension {
discoveryKey: Buffer;
start: number;
encodedBitfield: Buffer;
namespace: HaveExtension_Namespace;
}
export declare const HaveExtension_Namespace: {
readonly auth: "auth";
readonly config: "config";
readonly data: "data";
readonly blobIndex: "blobIndex";
readonly blob: "blob";
readonly UNRECOGNIZED: "UNRECOGNIZED";
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just for my own understanding, this is added in by the ts-proto step because of the enumsAsLiterals=true change? isn't immediately clear to me where this comes from but could kind of guess

};
export type HaveExtension_Namespace = typeof HaveExtension_Namespace[keyof typeof HaveExtension_Namespace];
export declare function haveExtension_NamespaceFromJSON(object: any): HaveExtension_Namespace;
export declare function haveExtension_NamespaceToNumber(object: HaveExtension_Namespace): number;
export declare const ProjectExtension: {
encode(message: ProjectExtension, writer?: _m0.Writer): _m0.Writer;
decode(input: _m0.Reader | Uint8Array, length?: number): ProjectExtension;
Expand Down Expand Up @@ -54,18 +66,22 @@ export declare const HaveExtension: {
discoveryKey?: Buffer;
start?: number;
encodedBitfield?: Buffer;
namespace?: HaveExtension_Namespace;
} & {
discoveryKey?: Buffer;
start?: number;
encodedBitfield?: Buffer;
namespace?: HaveExtension_Namespace;
} & { [K in Exclude<keyof I, keyof HaveExtension>]: never; }>(base?: I): HaveExtension;
fromPartial<I_1 extends {
discoveryKey?: Buffer;
start?: number;
encodedBitfield?: Buffer;
namespace?: HaveExtension_Namespace;
} & {
discoveryKey?: Buffer;
start?: number;
encodedBitfield?: Buffer;
namespace?: HaveExtension_Namespace;
} & { [K_1 in Exclude<keyof I_1, keyof HaveExtension>]: never; }>(object: I_1): HaveExtension;
};
67 changes: 65 additions & 2 deletions src/generated/extensions.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,54 @@
/* eslint-disable */
import Long from "long";
import _m0 from "protobufjs/minimal.js";
export var HaveExtension_Namespace = {
auth: "auth",
config: "config",
data: "data",
blobIndex: "blobIndex",
blob: "blob",
UNRECOGNIZED: "UNRECOGNIZED",
};
export function haveExtension_NamespaceFromJSON(object) {
switch (object) {
case 0:
case "auth":
return HaveExtension_Namespace.auth;
case 1:
case "config":
return HaveExtension_Namespace.config;
case 2:
case "data":
return HaveExtension_Namespace.data;
case 3:
case "blobIndex":
return HaveExtension_Namespace.blobIndex;
case 4:
case "blob":
return HaveExtension_Namespace.blob;
case -1:
case "UNRECOGNIZED":
default:
return HaveExtension_Namespace.UNRECOGNIZED;
}
}
export function haveExtension_NamespaceToNumber(object) {
switch (object) {
case HaveExtension_Namespace.auth:
return 0;
case HaveExtension_Namespace.config:
return 1;
case HaveExtension_Namespace.data:
return 2;
case HaveExtension_Namespace.blobIndex:
return 3;
case HaveExtension_Namespace.blob:
return 4;
case HaveExtension_Namespace.UNRECOGNIZED:
default:
return -1;
}
}
function createBaseProjectExtension() {
return {
wantCoreKeys: [],
Expand Down Expand Up @@ -107,7 +155,12 @@ export var ProjectExtension = {
},
};
function createBaseHaveExtension() {
return { discoveryKey: Buffer.alloc(0), start: 0, encodedBitfield: Buffer.alloc(0) };
return {
discoveryKey: Buffer.alloc(0),
start: 0,
encodedBitfield: Buffer.alloc(0),
namespace: HaveExtension_Namespace.auth,
};
}
export var HaveExtension = {
encode: function (message, writer) {
Expand All @@ -121,6 +174,9 @@ export var HaveExtension = {
if (message.encodedBitfield.length !== 0) {
writer.uint32(26).bytes(message.encodedBitfield);
}
if (message.namespace !== HaveExtension_Namespace.auth) {
writer.uint32(32).int32(haveExtension_NamespaceToNumber(message.namespace));
}
return writer;
},
decode: function (input, length) {
Expand Down Expand Up @@ -148,6 +204,12 @@ export var HaveExtension = {
}
message.encodedBitfield = reader.bytes();
continue;
case 4:
if (tag !== 32) {
break;
}
message.namespace = haveExtension_NamespaceFromJSON(reader.int32());
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
Expand All @@ -160,11 +222,12 @@ export var HaveExtension = {
return HaveExtension.fromPartial(base !== null && base !== void 0 ? base : {});
},
fromPartial: function (object) {
var _a, _b, _c;
var _a, _b, _c, _d;
var message = createBaseHaveExtension();
message.discoveryKey = (_a = object.discoveryKey) !== null && _a !== void 0 ? _a : Buffer.alloc(0);
message.start = (_b = object.start) !== null && _b !== void 0 ? _b : 0;
message.encodedBitfield = (_c = object.encodedBitfield) !== null && _c !== void 0 ? _c : Buffer.alloc(0);
message.namespace = (_d = object.namespace) !== null && _d !== void 0 ? _d : HaveExtension_Namespace.auth;
return message;
},
};
Expand Down
72 changes: 71 additions & 1 deletion src/generated/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,60 @@ export interface HaveExtension {
discoveryKey: Buffer;
start: number;
encodedBitfield: Buffer;
namespace: HaveExtension_Namespace;
}

export const HaveExtension_Namespace = {
auth: "auth",
config: "config",
data: "data",
blobIndex: "blobIndex",
blob: "blob",
UNRECOGNIZED: "UNRECOGNIZED",
} as const;

export type HaveExtension_Namespace = typeof HaveExtension_Namespace[keyof typeof HaveExtension_Namespace];

export function haveExtension_NamespaceFromJSON(object: any): HaveExtension_Namespace {
switch (object) {
case 0:
case "auth":
return HaveExtension_Namespace.auth;
case 1:
case "config":
return HaveExtension_Namespace.config;
case 2:
case "data":
return HaveExtension_Namespace.data;
case 3:
case "blobIndex":
return HaveExtension_Namespace.blobIndex;
case 4:
case "blob":
return HaveExtension_Namespace.blob;
case -1:
case "UNRECOGNIZED":
default:
return HaveExtension_Namespace.UNRECOGNIZED;
}
}

export function haveExtension_NamespaceToNumber(object: HaveExtension_Namespace): number {
switch (object) {
case HaveExtension_Namespace.auth:
return 0;
case HaveExtension_Namespace.config:
return 1;
case HaveExtension_Namespace.data:
return 2;
case HaveExtension_Namespace.blobIndex:
return 3;
case HaveExtension_Namespace.blob:
return 4;
case HaveExtension_Namespace.UNRECOGNIZED:
default:
return -1;
}
}

function createBaseProjectExtension(): ProjectExtension {
Expand Down Expand Up @@ -125,7 +179,12 @@ export const ProjectExtension = {
};

function createBaseHaveExtension(): HaveExtension {
return { discoveryKey: Buffer.alloc(0), start: 0, encodedBitfield: Buffer.alloc(0) };
return {
discoveryKey: Buffer.alloc(0),
start: 0,
encodedBitfield: Buffer.alloc(0),
namespace: HaveExtension_Namespace.auth,
};
}

export const HaveExtension = {
Expand All @@ -139,6 +198,9 @@ export const HaveExtension = {
if (message.encodedBitfield.length !== 0) {
writer.uint32(26).bytes(message.encodedBitfield);
}
if (message.namespace !== HaveExtension_Namespace.auth) {
writer.uint32(32).int32(haveExtension_NamespaceToNumber(message.namespace));
}
return writer;
},

Expand Down Expand Up @@ -170,6 +232,13 @@ export const HaveExtension = {

message.encodedBitfield = reader.bytes() as Buffer;
continue;
case 4:
if (tag !== 32) {
break;
}

message.namespace = haveExtension_NamespaceFromJSON(reader.int32());
continue;
}
if ((tag & 7) === 4 || tag === 0) {
break;
Expand All @@ -187,6 +256,7 @@ export const HaveExtension = {
message.discoveryKey = object.discoveryKey ?? Buffer.alloc(0);
message.start = object.start ?? 0;
message.encodedBitfield = object.encodedBitfield ?? Buffer.alloc(0);
message.namespace = object.namespace ?? HaveExtension_Namespace.auth;
return message;
},
};
Expand Down
13 changes: 7 additions & 6 deletions src/generated/rpc.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,13 @@ export interface InviteResponse {
projectKey: Buffer;
decision: InviteResponse_Decision;
}
export declare enum InviteResponse_Decision {
REJECT = "REJECT",
ACCEPT = "ACCEPT",
ALREADY = "ALREADY",
UNRECOGNIZED = "UNRECOGNIZED"
}
export declare const InviteResponse_Decision: {
readonly REJECT: "REJECT";
readonly ACCEPT: "ACCEPT";
readonly ALREADY: "ALREADY";
readonly UNRECOGNIZED: "UNRECOGNIZED";
};
export type InviteResponse_Decision = typeof InviteResponse_Decision[keyof typeof InviteResponse_Decision];
export declare function inviteResponse_DecisionFromJSON(object: any): InviteResponse_Decision;
export declare function inviteResponse_DecisionToNumber(object: InviteResponse_Decision): number;
export interface DeviceInfo {
Expand Down
Loading
Loading