@marcuspuchalla/nachos 0.1.0 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +32 -0
- package/README.md +1 -1
- package/dist/{chunk-7CFYWHS6.js → chunk-2MTLSQ7E.js} +58 -10
- package/dist/chunk-2MTLSQ7E.js.map +1 -0
- package/dist/{chunk-ZRPJUEIZ.js → chunk-5A5T56JB.js} +170 -22
- package/dist/chunk-5A5T56JB.js.map +1 -0
- package/dist/{chunk-2HBCILJS.cjs → chunk-PTWN7K3Y.cjs} +169 -21
- package/dist/chunk-PTWN7K3Y.cjs.map +1 -0
- package/dist/{chunk-2FUTHZQQ.cjs → chunk-R62CQQNI.cjs} +58 -10
- package/dist/chunk-R62CQQNI.cjs.map +1 -0
- package/dist/encoder/index.cjs +13 -13
- package/dist/encoder/index.js +1 -1
- package/dist/index.cjs +20 -20
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +4 -4
- package/dist/metafile-cjs.json +1 -1
- package/dist/metafile-esm.json +1 -1
- package/dist/parser/index.cjs +14 -14
- package/dist/parser/index.d.cts +1 -1
- package/dist/parser/index.d.ts +1 -1
- package/dist/parser/index.js +1 -1
- package/dist/{useCborTag-BfTIV8HM.d.cts → useCborTag-Cs1CZuXZ.d.cts} +2 -2
- package/dist/{useCborTag-B_iaShG6.d.ts → useCborTag-xV2Pz2VY.d.ts} +2 -2
- package/package.json +1 -1
- package/src/__tests__/roundtrip.test.ts +702 -0
- package/src/encoder/__tests__/cbor-collection-encoder.test.ts +26 -0
- package/src/encoder/__tests__/cbor-encoder-errors.test.ts +812 -0
- package/src/encoder/__tests__/cbor-string-encoder.test.ts +14 -0
- package/src/encoder/composables/useCborCollectionEncoder.ts +30 -0
- package/src/encoder/composables/useCborEncoder.ts +6 -1
- package/src/encoder/composables/useCborSimpleEncoder.ts +7 -2
- package/src/encoder/composables/useCborStringEncoder.ts +23 -10
- package/src/parser/__tests__/cbor-float-errors.test.ts +41 -0
- package/src/parser/__tests__/cbor-security-dos-protection.test.ts +2 -2
- package/src/parser/__tests__/cbor-standard-tags.test.ts +29 -0
- package/src/parser/__tests__/cbor-string-errors.test.ts +4 -4
- package/src/parser/__tests__/cbor-tag-errors.test.ts +1 -1
- package/src/parser/composables/useCborFloat.ts +93 -8
- package/src/parser/composables/useCborParser.ts +0 -19
- package/src/parser/composables/useCborString.ts +22 -4
- package/src/parser/composables/useCborTag.ts +104 -16
- package/dist/chunk-2FUTHZQQ.cjs.map +0 -1
- package/dist/chunk-2HBCILJS.cjs.map +0 -1
- package/dist/chunk-7CFYWHS6.js.map +0 -1
- package/dist/chunk-ZRPJUEIZ.js.map +0 -1
- package/src/encoder/composables/#useCborTagEncoder.ts# +0 -158
|
@@ -1,158 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CBOR Tag Encoder Composable
|
|
3
|
-
* Handles Major Type 6 (Semantic Tags)
|
|
4
|
-
* Following RFC 8949 specification
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import type { EncodeResult, TaggedValue, EncodableValue } from '../types'
|
|
8
|
-
import { bytesToHex, writeUint, writeBigUint } from '../utils'
|
|
9
|
-
|
|
10
|
-
/**
|
|
11
|
-
* CBOR Tag Encoder Composable
|
|
12
|
-
*
|
|
13
|
-
* Provides functions to encode tagged values to CBOR format:
|
|
14
|
-
* - Major Type 6: Semantic tags (0 to 2^64-1)
|
|
15
|
-
*
|
|
16
|
-
* Tags provide semantic meaning to CBOR values:
|
|
17
|
-
* - Tag 0: Date/time string (RFC 3339)
|
|
18
|
-
* - Tag 1: Epoch timestamp
|
|
19
|
-
* - Tag 2: Positive bignum
|
|
20
|
-
* - Tag 3: Negative bignum
|
|
21
|
-
* - Tag 258: Cardano set (CIP-0005)
|
|
22
|
-
* - And many more...
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```ts
|
|
26
|
-
* const { encodeTag } = useCborTagEncoder()
|
|
27
|
-
*
|
|
28
|
-
* // Encode date/time string (tag 0)
|
|
29
|
-
* const result1 = encodeTag(0, '2013-03-21T20:04:00Z', encode)
|
|
30
|
-
* // result1.hex: 'c074323031332d30332d32315432303a30343a30305a'
|
|
31
|
-
*
|
|
32
|
-
* // Encode positive bignum (tag 2)
|
|
33
|
-
* const result2 = encodeTag(2, new Uint8Array([0x01, 0xff]), encode)
|
|
34
|
-
* // result2.hex: 'c24201ff'
|
|
35
|
-
*
|
|
36
|
-
* // Encode Cardano set (tag 258)
|
|
37
|
-
* const result3 = encodeTag(258, [1, 2, 3], encode)
|
|
38
|
-
* // result3.hex: 'd9010283010203'
|
|
39
|
-
* ```
|
|
40
|
-
*/
|
|
41
|
-
export function useCborTagEncoder() {
|
|
42
|
-
/**
|
|
43
|
-
* Encode tag number (Major Type 6 header)
|
|
44
|
-
*
|
|
45
|
-
* Tag numbers use the same encoding rules as unsigned integers:
|
|
46
|
-
* - 0-23: Direct encoding in initial byte (0xc0-0xd7)
|
|
47
|
-
* - 24-255: 0xd8 + 1 byte
|
|
48
|
-
* - 256-65535: 0xd9 + 2 bytes
|
|
49
|
-
* - 65536-4294967295: 0xda + 4 bytes
|
|
50
|
-
* - 4294967296-2^64-1: 0xdb + 8 bytes
|
|
51
|
-
*
|
|
52
|
-
* @param tagNumber - Tag number (0 to 2^64-1)
|
|
53
|
-
* @returns Encoded tag header bytes
|
|
54
|
-
* @throws Error if tag number is negative or >= 2^64
|
|
55
|
-
*/
|
|
56
|
-
const encodeTagNumber = (tagNumber: number | bigint): Uint8Array => {
|
|
57
|
-
// Convert to BigInt for consistent handling
|
|
58
|
-
const bigTag = typeof tagNumber === 'bigint' ? tagNumber : BigInt(tagNumber)
|
|
59
|
-
|
|
60
|
-
// Validate tag is non-negative
|
|
61
|
-
if (bigTag < 0n) {
|
|
62
|
-
throw new Error('Tag number cannot be negative')
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Validate tag doesn't exceed 2^64-1
|
|
66
|
-
const MAX_UINT64 = 18446744073709551615n // 2^64 - 1
|
|
67
|
-
if (bigTag > MAX_UINT64) {
|
|
68
|
-
throw new Error('Tag number exceeds maximum (2^64-1)')
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
let bytes: Uint8Array
|
|
72
|
-
|
|
73
|
-
// Direct encoding (0-23) - Major type 6 (0xc0) + tag number
|
|
74
|
-
if (bigTag <= 23n) {
|
|
75
|
-
bytes = new Uint8Array([0xc0 + Number(bigTag)])
|
|
76
|
-
}
|
|
77
|
-
// 1-byte encoding (24-255) - 0xd8 + 1 byte
|
|
78
|
-
else if (bigTag <= 255n) {
|
|
79
|
-
bytes = new Uint8Array([0xd8, Number(bigTag)])
|
|
80
|
-
}
|
|
81
|
-
// 2-byte encoding (256-65535) - 0xd9 + 2 bytes
|
|
82
|
-
else if (bigTag <= 65535n) {
|
|
83
|
-
const valueBytes = writeUint(Number(bigTag), 2)
|
|
84
|
-
bytes = new Uint8Array([0xd9, ...valueBytes])
|
|
85
|
-
}
|
|
86
|
-
// 4-byte encoding (65536-4294967295) - 0xda + 4 bytes
|
|
87
|
-
else if (bigTag <= 4294967295n) {
|
|
88
|
-
const valueBytes = writeUint(Number(bigTag), 4)
|
|
89
|
-
bytes = new Uint8Array([0xda, ...valueBytes])
|
|
90
|
-
}
|
|
91
|
-
// 8-byte encoding (> 4294967295) - 0xdb + 8 bytes
|
|
92
|
-
else {
|
|
93
|
-
const valueBytes = writeBigUint(bigTag, 8)
|
|
94
|
-
bytes = new Uint8Array([0xdb, ...valueBytes])
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
return bytes
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Encode tagged value (tag + content)
|
|
102
|
-
*
|
|
103
|
-
* A tagged value consists of:
|
|
104
|
-
* 1. Tag number (Major Type 6 header)
|
|
105
|
-
* 2. Tagged content (recursively encoded value)
|
|
106
|
-
*
|
|
107
|
-
* The encode function is passed as a parameter to avoid circular dependencies.
|
|
108
|
-
*
|
|
109
|
-
* @param tagNumber - Tag number
|
|
110
|
-
* @param value - Value to tag
|
|
111
|
-
* @param encode - Encoder function for the tagged value
|
|
112
|
-
* @returns Encoded CBOR bytes and hex string
|
|
113
|
-
*/
|
|
114
|
-
const encodeTag = (
|
|
115
|
-
tagNumber: number | bigint,
|
|
116
|
-
value: EncodableValue,
|
|
117
|
-
encode: (value: EncodableValue) => EncodeResult
|
|
118
|
-
): EncodeResult => {
|
|
119
|
-
// Encode tag number
|
|
120
|
-
const tagBytes = encodeTagNumber(tagNumber)
|
|
121
|
-
|
|
122
|
-
// Recursively encode the tagged value
|
|
123
|
-
const valueResult = encode(value)
|
|
124
|
-
|
|
125
|
-
// Concatenate tag header + value bytes
|
|
126
|
-
const totalLength = tagBytes.length + valueResult.bytes.length
|
|
127
|
-
const bytes = new Uint8Array(totalLength)
|
|
128
|
-
bytes.set(tagBytes, 0)
|
|
129
|
-
bytes.set(valueResult.bytes, tagBytes.length)
|
|
130
|
-
|
|
131
|
-
return {
|
|
132
|
-
bytes,
|
|
133
|
-
hex: bytesToHex(bytes)
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
/**
|
|
138
|
-
* Encode TaggedValue object
|
|
139
|
-
*
|
|
140
|
-
* Convenience function for encoding { tag, value } objects.
|
|
141
|
-
*
|
|
142
|
-
* @param taggedValue - Object with tag and value properties
|
|
143
|
-
* @param encode - Encoder function for the tagged value
|
|
144
|
-
* @returns Encoded CBOR bytes and hex string
|
|
145
|
-
*/
|
|
146
|
-
const encodeTaggedValue = (
|
|
147
|
-
taggedValue: TaggedValue,
|
|
148
|
-
encode: (value: EncodableValue) => EncodeResult
|
|
149
|
-
): EncodeResult => {
|
|
150
|
-
return encodeTag(taggedValue.tag, taggedValue.value, encode)
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
return {
|
|
154
|
-
encodeTagNumber,
|
|
155
|
-
encodeTag,
|
|
156
|
-
encodeTaggedValue
|
|
157
|
-
}
|
|
158
|
-
}
|