Skip to content
Closed
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
33 changes: 27 additions & 6 deletions borsh-ts/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -92,12 +92,22 @@ export class BinaryWriter {
this.writeBuffer(Buffer.from(array));
}

public writeArray(array: any[], fn: any) {
public writeArray(array: any[], fn: any, len?: number) {
this.maybeResize();
this.writeU32(array.length);

if (len == null) {
this.writeU32(array.length);
}

let i = len || array.length
for (const elem of array) {
this.maybeResize();
fn(elem);
i--
}

if (i !== 0) {
throw new BorshError(`Expecting a fixed array of {len} elements`)
}
}

Expand Down Expand Up @@ -185,8 +195,11 @@ export class BinaryReader {
}

@handlingRangeError
readArray(fn: any): any[] {
const len = this.readU32();
readArray(fn: any, len?: number): any[] {
if (len == null) {
len = this.readU32();
}

const result = Array<any>();
for (let i = 0; i < len; ++i) {
result.push(fn());
Expand All @@ -212,7 +225,11 @@ function serializeField(schema: Schema, fieldName: string, value: any, fieldType
}
writer.writeFixedArray(value);
} else {
writer.writeArray(value, (item: any) => { serializeField(schema, fieldName, item, fieldType[0], writer); });
let len = null
if (typeof fieldType[1] === 'number') {
len = fieldType[1]
}
writer.writeArray(value, (item: any) => { serializeField(schema, fieldName, item, fieldType[0], writer); }, len);
}
} else if (fieldType.kind !== undefined) {
switch (fieldType.kind) {
Expand Down Expand Up @@ -281,7 +298,11 @@ function deserializeField(schema: Schema, fieldName: string, fieldType: any, rea
return reader.readFixedArray(fieldType[0]);
}

return reader.readArray(() => deserializeField(schema, fieldName, fieldType[0], reader));
let len = null
if (typeof fieldType[1] === 'number') {
len = fieldType[1]
}
return reader.readArray(() => deserializeField(schema, fieldName, fieldType[0], reader), len);
}

return deserializeStruct(schema, fieldType, reader);
Expand Down
4 changes: 2 additions & 2 deletions lib/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export declare class BinaryWriter {
private writeBuffer;
writeString(str: string): void;
writeFixedArray(array: Uint8Array): void;
writeArray(array: any[], fn: any): void;
writeArray(array: any[], fn: any, len?: number): void;
toArray(): Uint8Array;
}
export declare class BinaryReader {
Expand All @@ -35,7 +35,7 @@ export declare class BinaryReader {
private readBuffer;
readString(): string;
readFixedArray(len: number): Uint8Array;
readArray(fn: any): any[];
readArray(fn: any, len?: number): any[];
}
export declare function serialize(schema: Schema, obj: any): Uint8Array;
export declare function deserialize(schema: Schema, classType: any, buffer: Buffer): any;
29 changes: 23 additions & 6 deletions lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,12 +103,19 @@ class BinaryWriter {
writeFixedArray(array) {
this.writeBuffer(Buffer.from(array));
}
writeArray(array, fn) {
writeArray(array, fn, len) {
this.maybeResize();
this.writeU32(array.length);
if (len == null) {
this.writeU32(array.length);
}
let i = len || array.length;
for (const elem of array) {
this.maybeResize();
fn(elem);
i--;
}
if (i !== 0) {
throw new BorshError(`Expecting a fixed array of {len} elements`);
}
}
toArray() {
Expand Down Expand Up @@ -178,8 +185,10 @@ class BinaryReader {
readFixedArray(len) {
return new Uint8Array(this.readBuffer(len));
}
readArray(fn) {
const len = this.readU32();
readArray(fn, len) {
if (len == null) {
len = this.readU32();
}
const result = Array();
for (let i = 0; i < len; ++i) {
result.push(fn());
Expand Down Expand Up @@ -226,7 +235,11 @@ function serializeField(schema, fieldName, value, fieldType, writer) {
writer.writeFixedArray(value);
}
else {
writer.writeArray(value, (item) => { serializeField(schema, fieldName, item, fieldType[0], writer); });
let len = null;
if (typeof fieldType[1] === 'number') {
len = fieldType[1];
}
writer.writeArray(value, (item) => { serializeField(schema, fieldName, item, fieldType[0], writer); }, len);
}
}
else if (fieldType.kind !== undefined) {
Expand Down Expand Up @@ -297,7 +310,11 @@ function deserializeField(schema, fieldName, fieldType, reader) {
if (typeof fieldType[0] === 'number') {
return reader.readFixedArray(fieldType[0]);
}
return reader.readArray(() => deserializeField(schema, fieldName, fieldType[0], reader));
let len = null;
if (typeof fieldType[1] === 'number') {
len = fieldType[1];
}
return reader.readArray(() => deserializeField(schema, fieldName, fieldType[0], reader), len);
}
return deserializeStruct(schema, fieldType, reader);
}
Expand Down