Skip to content

Commit 64ad66b

Browse files
committed
feat: 🎸 cleanup XDR implementation
1 parent fd40a92 commit 64ad66b

File tree

3 files changed

+16
-47
lines changed

3 files changed

+16
-47
lines changed

src/xdr/XdrDecoder.ts

Lines changed: 9 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export class XdrDecoder<R extends IReader & IReaderResettable = IReader & IReade
3030
public readAny(): unknown {
3131
// Basic implementation - in practice this would need schema info
3232
// For now, we'll throw as this should be used with schema decoder
33-
throw new Error('XdrDecoder.readAny() requires explicit type methods or use XdrSchemaDecoder');
33+
throw new Error('not implemented');
3434
}
3535

3636
/**
@@ -122,17 +122,11 @@ export class XdrDecoder<R extends IReader & IReaderResettable = IReader & IReade
122122
*/
123123
public readOpaque(size: number): Uint8Array {
124124
const reader = this.reader;
125-
const data = new Uint8Array(size);
126-
127-
// Read actual data
128-
for (let i = 0; i < size; i++) {
129-
data[i] = reader.u8();
130-
}
125+
const data = reader.buf(size);
131126

132127
// Skip padding bytes to reach 4-byte boundary
133-
const paddedSize = Math.ceil(size / 4) * 4;
134-
const padding = paddedSize - size;
135-
reader.skip(padding);
128+
const paddedSize = size % 4 === 0 ? size : size + (4 - (size % 4));
129+
reader.skip(paddedSize - size);
136130

137131
return data;
138132
}
@@ -153,20 +147,13 @@ export class XdrDecoder<R extends IReader & IReaderResettable = IReader & IReade
153147
public readString(): string {
154148
const size = this.readUnsignedInt();
155149
const reader = this.reader;
156-
157-
// Read UTF-8 bytes
158-
const utf8Bytes = new Uint8Array(size);
159-
for (let i = 0; i < size; i++) {
160-
utf8Bytes[i] = reader.u8();
161-
}
150+
const text = reader.utf8(size);
162151

163152
// Skip padding bytes to reach 4-byte boundary
164-
const paddedSize = Math.ceil(size / 4) * 4;
165-
const padding = paddedSize - size;
166-
reader.skip(padding);
153+
const paddedSize = size % 4 === 0 ? size : size + (4 - (size % 4));
154+
reader.skip(paddedSize - size);
167155

168-
// Decode UTF-8 to string
169-
return new TextDecoder('utf-8').decode(utf8Bytes);
156+
return text;
170157
}
171158

172159
/**
@@ -182,9 +169,7 @@ export class XdrDecoder<R extends IReader & IReaderResettable = IReader & IReade
182169
*/
183170
public readArray<T>(size: number, elementReader: () => T): T[] {
184171
const array: T[] = [];
185-
for (let i = 0; i < size; i++) {
186-
array.push(elementReader());
187-
}
172+
for (let i = 0; i < size; i++) array.push(elementReader());
188173
return array;
189174
}
190175

src/xdr/XdrEncoder.ts

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,6 @@ export class XdrEncoder implements BinaryJsonEncoder {
102102
public writeHyper(hyper: number | bigint): void {
103103
const writer = this.writer;
104104
writer.ensureCapacity(8);
105-
106105
if (typeof hyper === 'bigint') {
107106
writer.view.setBigInt64(writer.x, hyper, false); // big-endian
108107
} else {
@@ -171,15 +170,9 @@ export class XdrEncoder implements BinaryJsonEncoder {
171170
const writer = this.writer;
172171
const paddedSize = Math.ceil(size / 4) * 4;
173172
writer.ensureCapacity(paddedSize);
174-
175-
// Write data
176173
writer.buf(data, size);
177-
178-
// Write padding bytes
179174
const padding = paddedSize - size;
180-
for (let i = 0; i < padding; i++) {
181-
writer.u8(0);
182-
}
175+
for (let i = 0; i < padding; i++) writer.u8(0);
183176
}
184177

185178
/**
@@ -202,13 +195,9 @@ export class XdrEncoder implements BinaryJsonEncoder {
202195
const lengthOffset = writer.x;
203196
writer.x += 4; // Reserve space for length
204197
const bytesWritten = writer.utf8(str);
205-
206-
// Calculate and write padding
207198
const paddedSize = Math.ceil(bytesWritten / 4) * 4;
208199
const padding = paddedSize - bytesWritten;
209-
for (let i = 0; i < padding; i++) {
210-
writer.u8(0);
211-
}
200+
for (let i = 0; i < padding; i++) writer.u8(0);
212201

213202
// Go back and write the actual byte length
214203
const currentPos = writer.x;
@@ -232,14 +221,9 @@ export class XdrEncoder implements BinaryJsonEncoder {
232221
*/
233222
public writeNumber(num: number): void {
234223
if (Number.isInteger(num)) {
235-
if (num >= -2147483648 && num <= 2147483647) {
236-
this.writeInt(num);
237-
} else {
238-
this.writeHyper(num);
239-
}
240-
} else {
241-
this.writeDouble(num);
242-
}
224+
if (num >= -2147483648 && num <= 2147483647) this.writeInt(num);
225+
else this.writeHyper(num);
226+
} else this.writeDouble(num);
243227
}
244228

245229
/**

src/xdr/__tests__/XdrDecoder.spec.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,12 @@ describe('XdrDecoder', () => {
278278
describe('decode method', () => {
279279
test('decode method calls readAny which throws', () => {
280280
const encoded = new Uint8Array([0, 0, 0, 42]);
281-
expect(() => decoder.decode(encoded)).toThrow('XdrDecoder.readAny() requires explicit type methods');
281+
expect(() => decoder.decode(encoded)).toThrow('not implemented');
282282
});
283283

284284
test('read method calls readAny which throws', () => {
285285
const encoded = new Uint8Array([0, 0, 0, 42]);
286-
expect(() => decoder.read(encoded)).toThrow('XdrDecoder.readAny() requires explicit type methods');
286+
expect(() => decoder.read(encoded)).toThrow('not implemented');
287287
});
288288
});
289289

0 commit comments

Comments
 (0)