Skip to content

Commit 5e9a433

Browse files
committed
chore: add code type info
1 parent 783bce4 commit 5e9a433

File tree

5 files changed

+64
-39
lines changed

5 files changed

+64
-39
lines changed

src/bases/base.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ class ComposedDecoder {
136136
/** @type {Object<string, UnibaseDecoder<Prefix>>} */
137137
this.decoders = decoders
138138
// so that we can distinguish between unibase and multibase
139-
/** @type {void} */
139+
/** @type {null} */
140140
this.prefix = null
141141
}
142142

src/block.js

Lines changed: 31 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
import CID from './cid.js'
44

55
/**
6+
* @template {number} Code
67
* @template T
78
* @class
89
*/
910
export default class Block {
1011
/**
1112
* @param {CID|null} cid
12-
* @param {number} code
13+
* @param {Code} code
1314
* @param {T} data
1415
* @param {Uint8Array} bytes
1516
* @param {BlockConfig} config
@@ -56,30 +57,33 @@ export default class Block {
5657
}
5758

5859
/**
60+
* @template {number} Code
5961
* @template T
60-
* @param {Encoder<T>} codec
62+
* @param {Encoder<Code, T>} codec
6163
* @param {BlockConfig} options
6264
*/
6365
static encoder (codec, options) {
6466
return new BlockEncoder(codec, options)
6567
}
6668

6769
/**
70+
* @template {number} Code
6871
* @template T
69-
* @param {Decoder<T>} codec
72+
* @param {Decoder<Code, T>} codec
7073
* @param {BlockConfig} options
7174
*/
7275
static decoder (codec, options) {
7376
return new BlockDecoder(codec, options)
7477
}
7578

7679
/**
80+
* @template {number} Code
7781
* @template T
7882
* @param {Object} codec
79-
* @param {Encoder<T>} codec.encoder
80-
* @param {Decoder<T>} codec.decoder
81-
* @param {Object} [options]
82-
* @returns {BlockCodec<T>}
83+
* @param {Encoder<Code, T>} codec.encoder
84+
* @param {Decoder<Code, T>} codec.decoder
85+
* @param {BlockConfig} options
86+
* @returns {BlockCodec<Code, T>}
8387
*/
8488

8589
static codec ({ encoder, decoder }, options) {
@@ -178,12 +182,13 @@ const createCID = async (hasher, bytes, code) => {
178182
}
179183

180184
/**
185+
* @template {number} Code
181186
* @template T
182187
*/
183188
class BlockCodec {
184189
/**
185-
* @param {Encoder<T>} encoder
186-
* @param {Decoder<T>} decoder
190+
* @param {Encoder<Code, T>} encoder
191+
* @param {Decoder<Code, T>} decoder
187192
* @param {BlockConfig} config
188193
*/
189194

@@ -195,17 +200,17 @@ class BlockCodec {
195200

196201
/**
197202
* @param {Uint8Array} bytes
198-
* @param {BlockConfig} [options]
199-
* @returns {Block<T>}
203+
* @param {Partial<BlockConfig>} [options]
204+
* @returns {Block<Code, T>}
200205
*/
201206
decode (bytes, options) {
202207
return this.decoder.decode(bytes, { ...this.config, ...options })
203208
}
204209

205210
/**
206211
* @param {T} data
207-
* @param {BlockConfig} [options]
208-
* @returns {Block<T>}
212+
* @param {Partial<BlockConfig>} [options]
213+
* @returns {Block<Code, T>}
209214
*/
210215
encode (data, options) {
211216
return this.encoder.encode(data, { ...this.config, ...options })
@@ -214,11 +219,12 @@ class BlockCodec {
214219

215220
/**
216221
* @class
222+
* @template {number} Code
217223
* @template T
218224
*/
219225
class BlockEncoder {
220226
/**
221-
* @param {Encoder<T>} codec
227+
* @param {Encoder<Code, T>} codec
222228
* @param {BlockConfig} config
223229
*/
224230
constructor (codec, config) {
@@ -228,8 +234,8 @@ class BlockEncoder {
228234

229235
/**
230236
* @param {T} data
231-
* @param {BlockConfig} [options]
232-
* @returns {Block}
237+
* @param {Partial<BlockConfig>} [options]
238+
* @returns {Block<Code, T>}
233239
*/
234240
encode (data, options) {
235241
const { codec } = this
@@ -240,11 +246,12 @@ class BlockEncoder {
240246

241247
/**
242248
* @class
249+
* @template {number} Code
243250
* @template T
244251
*/
245252
class BlockDecoder {
246253
/**
247-
* @param {Decoder<T>} codec
254+
* @param {Decoder<Code, T>} codec
248255
* @param {BlockConfig} config
249256
*/
250257
constructor (codec, config) {
@@ -255,7 +262,7 @@ class BlockDecoder {
255262
/**
256263
* @param {Uint8Array} bytes
257264
* @param {Partial<BlockConfig>} [options]
258-
* @returns {Block}
265+
* @returns {Block<Code, T>}
259266
*/
260267
decode (bytes, options) {
261268
const data = this.codec.decode(bytes)
@@ -283,16 +290,19 @@ class BlockDecoder {
283290
*/
284291

285292
/**
293+
* @template {number} Code
286294
* @template T
287-
* @typedef {import('./codecs/interface').BlockEncoder<T>} Encoder
295+
* @typedef {import('./codecs/interface').BlockEncoder<Code, T>} Encoder
288296
*/
289297

290298
/**
299+
* @template {number} Code
291300
* @template T
292-
* @typedef {import('./codecs/interface').BlockDecoder} Decoder
301+
* @typedef {import('./codecs/interface').BlockDecoder<Code, T>} Decoder
293302
*/
294303

295304
/**
305+
* @template {number} Code
296306
* @template T
297-
* @typedef {import('./codecs/interface').BlockCodec} Codec
307+
* @typedef {import('./codecs/interface').BlockCodec<Code, T>} Codec
298308
*/

src/codecs/codec.js

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,17 @@ export const codec = ({ name, code, decode, encode }) =>
1515
new Codec(name, code, encode, decode)
1616

1717
/**
18+
* @template {number} Code
1819
* @template T
19-
* @typedef {import('./interface').BlockEncoder<T>} BlockEncoder
20+
* @typedef {import('./interface').BlockEncoder<Code, T>} BlockEncoder
2021
*/
2122

2223
/**
2324
* @class
2425
* @template T
2526
* @template {string} Name
2627
* @template {number} Code
27-
* @implements {BlockEncoder<T>}
28+
* @implements {BlockEncoder<Code, T>}
2829
*/
2930
export class Encoder {
3031
/**
@@ -40,36 +41,42 @@ export class Encoder {
4041
}
4142

4243
/**
44+
* @template {number} Code
4345
* @template T
44-
* @typedef {import('./interface').BlockDecoder<T>} BlockDecoder
46+
* @typedef {import('./interface').BlockDecoder<Code, T>} BlockDecoder
4547
*/
4648

4749
/**
4850
* @class
51+
* @template {number} Code
4952
* @template T
50-
* @implements {BlockDecoder<T>}
53+
* @implements {BlockDecoder<Code, T>}
5154
*/
5255
export class Decoder {
5356
/**
57+
* @param {string} name
58+
* @param {Code} code
5459
* @param {(bytes:Uint8Array) => T} decode
5560
*/
56-
constructor (code, decode) {
61+
constructor (name, code, decode) {
62+
this.name = name
5763
this.code = code
5864
this.decode = decode
5965
}
6066
}
6167

6268
/**
69+
* @template {number} Code
6370
* @template T
64-
* @typedef {import('./interface').BlockCodec<T>} BlockCodec
71+
* @typedef {import('./interface').BlockCodec<Code, T>} BlockCodec
6572
*/
6673

6774
/**
6875
* @class
6976
* @template {string} Name
7077
* @template {number} Code
7178
* @template T
72-
* @implements {BlockCodec<T>}
79+
* @implements {BlockCodec<Code, T>}
7380
*/
7481
export class Codec {
7582
/**
@@ -86,8 +93,8 @@ export class Codec {
8693
}
8794

8895
get decoder () {
89-
const { name, decode } = this
90-
const decoder = new Decoder(name, decode)
96+
const { name, code, decode } = this
97+
const decoder = new Decoder(name, code, decode)
9198
Object.defineProperty(this, 'decoder', { value: decoder })
9299
return decoder
93100
}

src/codecs/interface.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,31 @@
11
/**
22
* IPLD encoder part of the codec.
33
*/
4-
export interface BlockEncoder<T> {
4+
export interface BlockEncoder<Code extends number, T> {
55
name: string
6-
code: number
7-
encode(data: T): Uint8Array
6+
code: Code
7+
encode(data: T): ByteView<T>
88
}
99

1010
/**
1111
* IPLD decoder part of the codec.
1212
*/
13-
export interface BlockDecoder<T> {
14-
code: number
15-
decode(bytes: Uint8Array): T
13+
export interface BlockDecoder<Code extends number, T> {
14+
code: Code
15+
decode(bytes: ByteView<T>): T
1616
}
1717

1818
/**
1919
* IPLD codec that is just Encoder + Decoder however it is
2020
* separate those capabilties as sender requires encoder and receiver
2121
* requires decoder.
2222
*/
23-
export interface BlockCodec<T> extends BlockEncoder<T>, BlockDecoder<T> { }
23+
export interface BlockCodec<Code extends number, T> extends BlockEncoder<Code, T>, BlockDecoder<Code, T> { }
2424

25+
26+
// This just a hack to retain type information abouth the data that
27+
// is incoded `T` Because it's a union `data` field is never going
28+
// to be usable anyway.
29+
type ByteView<T> =
30+
| Uint8Array
31+
| Uint8Array & { data: T }

src/legacy.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ const legacy = (codec, { hashes }) => {
2727
}
2828

2929
if (bytes.isBinary(obj)) {
30+
// @ts-ignore
3031
return Buffer.from(obj)
3132
}
3233

@@ -93,7 +94,7 @@ const legacy = (codec, { hashes }) => {
9394
let value = codec.decode(buff)
9495
const entries = path.split('/').filter(x => x)
9596
while (entries.length) {
96-
value = value[entries.shift()]
97+
value = value[/** @type {string} */(entries.shift())]
9798
if (typeof value === 'undefined') throw new Error('Not found')
9899
if (OldCID.isCID(value)) {
99100
return { value, remainderPath: entries.join('/') }

0 commit comments

Comments
 (0)