@qrkit/bc-ur 2.0.0-beta.9-qrkit.1

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.
Files changed (229) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +996 -0
  3. package/dist/commonjs/classes/FountainDecoder.d.ts +125 -0
  4. package/dist/commonjs/classes/FountainDecoder.js +453 -0
  5. package/dist/commonjs/classes/FountainDecoder.js.map +1 -0
  6. package/dist/commonjs/classes/FountainEncoder.d.ts +63 -0
  7. package/dist/commonjs/classes/FountainEncoder.js +168 -0
  8. package/dist/commonjs/classes/FountainEncoder.js.map +1 -0
  9. package/dist/commonjs/classes/RegistryItem.d.ts +104 -0
  10. package/dist/commonjs/classes/RegistryItem.js +172 -0
  11. package/dist/commonjs/classes/RegistryItem.js.map +1 -0
  12. package/dist/commonjs/classes/UR.d.ts +89 -0
  13. package/dist/commonjs/classes/UR.js +243 -0
  14. package/dist/commonjs/classes/UR.js.map +1 -0
  15. package/dist/commonjs/classes/UrFountainDecoder.d.ts +15 -0
  16. package/dist/commonjs/classes/UrFountainDecoder.js +127 -0
  17. package/dist/commonjs/classes/UrFountainDecoder.js.map +1 -0
  18. package/dist/commonjs/classes/UrFountainEncoder.d.ts +42 -0
  19. package/dist/commonjs/classes/UrFountainEncoder.js +92 -0
  20. package/dist/commonjs/classes/UrFountainEncoder.js.map +1 -0
  21. package/dist/commonjs/classes/key.helper.d.ts +27 -0
  22. package/dist/commonjs/classes/key.helper.js +70 -0
  23. package/dist/commonjs/classes/key.helper.js.map +1 -0
  24. package/dist/commonjs/encodingMethods/BytewordEncoding.d.ts +11 -0
  25. package/dist/commonjs/encodingMethods/BytewordEncoding.js +23 -0
  26. package/dist/commonjs/encodingMethods/BytewordEncoding.js.map +1 -0
  27. package/dist/commonjs/encodingMethods/CborEncoding.d.ts +44 -0
  28. package/dist/commonjs/encodingMethods/CborEncoding.js +151 -0
  29. package/dist/commonjs/encodingMethods/CborEncoding.js.map +1 -0
  30. package/dist/commonjs/encodingMethods/HexEncoding.d.ts +8 -0
  31. package/dist/commonjs/encodingMethods/HexEncoding.js +24 -0
  32. package/dist/commonjs/encodingMethods/HexEncoding.js.map +1 -0
  33. package/dist/commonjs/encodingMethods/UrEncoding.d.ts +10 -0
  34. package/dist/commonjs/encodingMethods/UrEncoding.js +19 -0
  35. package/dist/commonjs/encodingMethods/UrEncoding.js.map +1 -0
  36. package/dist/commonjs/encodingMethods/bytewords.d.ts +27 -0
  37. package/dist/commonjs/encodingMethods/bytewords.js +152 -0
  38. package/dist/commonjs/encodingMethods/bytewords.js.map +1 -0
  39. package/dist/commonjs/encodingMethods/index.d.ts +19 -0
  40. package/dist/commonjs/encodingMethods/index.js +27 -0
  41. package/dist/commonjs/encodingMethods/index.js.map +1 -0
  42. package/dist/commonjs/encodingMethods/pipeline.d.ts +19 -0
  43. package/dist/commonjs/encodingMethods/pipeline.js +80 -0
  44. package/dist/commonjs/encodingMethods/pipeline.js.map +1 -0
  45. package/dist/commonjs/enums/EncodingMethodName.d.ts +10 -0
  46. package/dist/commonjs/enums/EncodingMethodName.js +15 -0
  47. package/dist/commonjs/enums/EncodingMethodName.js.map +1 -0
  48. package/dist/commonjs/errors.d.ts +15 -0
  49. package/dist/commonjs/errors.js +39 -0
  50. package/dist/commonjs/errors.js.map +1 -0
  51. package/dist/commonjs/helpers/aliasSampling.d.ts +6 -0
  52. package/dist/commonjs/helpers/aliasSampling.js +73 -0
  53. package/dist/commonjs/helpers/aliasSampling.js.map +1 -0
  54. package/dist/commonjs/helpers/crc32.d.ts +1 -0
  55. package/dist/commonjs/helpers/crc32.js +19 -0
  56. package/dist/commonjs/helpers/crc32.js.map +1 -0
  57. package/dist/commonjs/helpers/fountainUtils.d.ts +40 -0
  58. package/dist/commonjs/helpers/fountainUtils.js +124 -0
  59. package/dist/commonjs/helpers/fountainUtils.js.map +1 -0
  60. package/dist/commonjs/helpers/sha256.d.ts +1 -0
  61. package/dist/commonjs/helpers/sha256.js +78 -0
  62. package/dist/commonjs/helpers/sha256.js.map +1 -0
  63. package/dist/commonjs/helpers/type.helper.d.ts +3 -0
  64. package/dist/commonjs/helpers/type.helper.js +3 -0
  65. package/dist/commonjs/helpers/type.helper.js.map +1 -0
  66. package/dist/commonjs/helpers/uintArrayHelper.d.ts +287 -0
  67. package/dist/commonjs/helpers/uintArrayHelper.js +545 -0
  68. package/dist/commonjs/helpers/uintArrayHelper.js.map +1 -0
  69. package/dist/commonjs/helpers/utils.d.ts +55 -0
  70. package/dist/commonjs/helpers/utils.js +123 -0
  71. package/dist/commonjs/helpers/utils.js.map +1 -0
  72. package/dist/commonjs/index-react-native.d.ts +9 -0
  73. package/dist/commonjs/index-react-native.js +15 -0
  74. package/dist/commonjs/index-react-native.js.map +1 -0
  75. package/dist/commonjs/index.d.ts +21 -0
  76. package/dist/commonjs/index.js +34 -0
  77. package/dist/commonjs/index.js.map +1 -0
  78. package/dist/commonjs/interfaces/IEncodingMethod.d.ts +9 -0
  79. package/dist/commonjs/interfaces/IEncodingMethod.js +3 -0
  80. package/dist/commonjs/interfaces/IEncodingMethod.js.map +1 -0
  81. package/dist/commonjs/package.json +3 -0
  82. package/dist/commonjs/registry.d.ts +26 -0
  83. package/dist/commonjs/registry.js +118 -0
  84. package/dist/commonjs/registry.js.map +1 -0
  85. package/dist/commonjs/test.utils.d.ts +31 -0
  86. package/dist/commonjs/test.utils.js +88 -0
  87. package/dist/commonjs/test.utils.js.map +1 -0
  88. package/dist/commonjs/wrappers/cbor2-cjs.cjs.map +1 -0
  89. package/dist/commonjs/wrappers/cbor2.d.ts +2 -0
  90. package/dist/commonjs/wrappers/cbor2.js +14 -0
  91. package/dist/commonjs/wrappers/cbor2Wrapper.d.ts +14 -0
  92. package/dist/commonjs/wrappers/cbor2Wrapper.js +49 -0
  93. package/dist/commonjs/wrappers/cbor2Wrapper.js.map +1 -0
  94. package/dist/commonjs/xoshiro.d.ts +12 -0
  95. package/dist/commonjs/xoshiro.js +52 -0
  96. package/dist/commonjs/xoshiro.js.map +1 -0
  97. package/dist/esm/classes/FountainDecoder.d.ts +125 -0
  98. package/dist/esm/classes/FountainDecoder.js +447 -0
  99. package/dist/esm/classes/FountainDecoder.js.map +1 -0
  100. package/dist/esm/classes/FountainEncoder.d.ts +63 -0
  101. package/dist/esm/classes/FountainEncoder.js +164 -0
  102. package/dist/esm/classes/FountainEncoder.js.map +1 -0
  103. package/dist/esm/classes/RegistryItem.d.ts +104 -0
  104. package/dist/esm/classes/RegistryItem.js +166 -0
  105. package/dist/esm/classes/RegistryItem.js.map +1 -0
  106. package/dist/esm/classes/UR.d.ts +89 -0
  107. package/dist/esm/classes/UR.js +239 -0
  108. package/dist/esm/classes/UR.js.map +1 -0
  109. package/dist/esm/classes/UrFountainDecoder.d.ts +15 -0
  110. package/dist/esm/classes/UrFountainDecoder.js +123 -0
  111. package/dist/esm/classes/UrFountainDecoder.js.map +1 -0
  112. package/dist/esm/classes/UrFountainEncoder.d.ts +42 -0
  113. package/dist/esm/classes/UrFountainEncoder.js +88 -0
  114. package/dist/esm/classes/UrFountainEncoder.js.map +1 -0
  115. package/dist/esm/classes/key.helper.d.ts +27 -0
  116. package/dist/esm/classes/key.helper.js +66 -0
  117. package/dist/esm/classes/key.helper.js.map +1 -0
  118. package/dist/esm/encodingMethods/BytewordEncoding.d.ts +11 -0
  119. package/dist/esm/encodingMethods/BytewordEncoding.js +19 -0
  120. package/dist/esm/encodingMethods/BytewordEncoding.js.map +1 -0
  121. package/dist/esm/encodingMethods/CborEncoding.d.ts +44 -0
  122. package/dist/esm/encodingMethods/CborEncoding.js +147 -0
  123. package/dist/esm/encodingMethods/CborEncoding.js.map +1 -0
  124. package/dist/esm/encodingMethods/HexEncoding.d.ts +8 -0
  125. package/dist/esm/encodingMethods/HexEncoding.js +20 -0
  126. package/dist/esm/encodingMethods/HexEncoding.js.map +1 -0
  127. package/dist/esm/encodingMethods/UrEncoding.d.ts +10 -0
  128. package/dist/esm/encodingMethods/UrEncoding.js +15 -0
  129. package/dist/esm/encodingMethods/UrEncoding.js.map +1 -0
  130. package/dist/esm/encodingMethods/bytewords.d.ts +27 -0
  131. package/dist/esm/encodingMethods/bytewords.js +147 -0
  132. package/dist/esm/encodingMethods/bytewords.js.map +1 -0
  133. package/dist/esm/encodingMethods/index.d.ts +19 -0
  134. package/dist/esm/encodingMethods/index.js +24 -0
  135. package/dist/esm/encodingMethods/index.js.map +1 -0
  136. package/dist/esm/encodingMethods/pipeline.d.ts +19 -0
  137. package/dist/esm/encodingMethods/pipeline.js +76 -0
  138. package/dist/esm/encodingMethods/pipeline.js.map +1 -0
  139. package/dist/esm/enums/EncodingMethodName.d.ts +10 -0
  140. package/dist/esm/enums/EncodingMethodName.js +12 -0
  141. package/dist/esm/enums/EncodingMethodName.js.map +1 -0
  142. package/dist/esm/errors.d.ts +15 -0
  143. package/dist/esm/errors.js +31 -0
  144. package/dist/esm/errors.js.map +1 -0
  145. package/dist/esm/helpers/aliasSampling.d.ts +6 -0
  146. package/dist/esm/helpers/aliasSampling.js +70 -0
  147. package/dist/esm/helpers/aliasSampling.js.map +1 -0
  148. package/dist/esm/helpers/crc32.d.ts +1 -0
  149. package/dist/esm/helpers/crc32.js +16 -0
  150. package/dist/esm/helpers/crc32.js.map +1 -0
  151. package/dist/esm/helpers/fountainUtils.d.ts +40 -0
  152. package/dist/esm/helpers/fountainUtils.js +114 -0
  153. package/dist/esm/helpers/fountainUtils.js.map +1 -0
  154. package/dist/esm/helpers/sha256.d.ts +1 -0
  155. package/dist/esm/helpers/sha256.js +75 -0
  156. package/dist/esm/helpers/sha256.js.map +1 -0
  157. package/dist/esm/helpers/type.helper.d.ts +3 -0
  158. package/dist/esm/helpers/type.helper.js +2 -0
  159. package/dist/esm/helpers/type.helper.js.map +1 -0
  160. package/dist/esm/helpers/uintArrayHelper.d.ts +287 -0
  161. package/dist/esm/helpers/uintArrayHelper.js +526 -0
  162. package/dist/esm/helpers/uintArrayHelper.js.map +1 -0
  163. package/dist/esm/helpers/utils.d.ts +55 -0
  164. package/dist/esm/helpers/utils.js +102 -0
  165. package/dist/esm/helpers/utils.js.map +1 -0
  166. package/dist/esm/index-react-native.d.ts +9 -0
  167. package/dist/esm/index-react-native.js +12 -0
  168. package/dist/esm/index-react-native.js.map +1 -0
  169. package/dist/esm/index.d.ts +21 -0
  170. package/dist/esm/index.js +16 -0
  171. package/dist/esm/index.js.map +1 -0
  172. package/dist/esm/interfaces/IEncodingMethod.d.ts +9 -0
  173. package/dist/esm/interfaces/IEncodingMethod.js +2 -0
  174. package/dist/esm/interfaces/IEncodingMethod.js.map +1 -0
  175. package/dist/esm/package.json +3 -0
  176. package/dist/esm/registry.d.ts +26 -0
  177. package/dist/esm/registry.js +114 -0
  178. package/dist/esm/registry.js.map +1 -0
  179. package/dist/esm/test.utils.d.ts +31 -0
  180. package/dist/esm/test.utils.js +83 -0
  181. package/dist/esm/test.utils.js.map +1 -0
  182. package/dist/esm/wrappers/cbor2-deno.d.mts +2 -0
  183. package/dist/esm/wrappers/cbor2-deno.mjs +5 -0
  184. package/dist/esm/wrappers/cbor2-deno.mjs.map +1 -0
  185. package/dist/esm/wrappers/cbor2.d.ts +2 -0
  186. package/dist/esm/wrappers/cbor2.js +5 -0
  187. package/dist/esm/wrappers/cbor2.js.map +1 -0
  188. package/dist/esm/wrappers/cbor2Wrapper.d.ts +5 -0
  189. package/dist/esm/wrappers/cbor2Wrapper.js +6 -0
  190. package/dist/esm/wrappers/cbor2Wrapper.js.map +1 -0
  191. package/dist/esm/xoshiro.d.ts +12 -0
  192. package/dist/esm/xoshiro.js +47 -0
  193. package/dist/esm/xoshiro.js.map +1 -0
  194. package/dist/web/bytewords.js +335 -0
  195. package/index.html +98 -0
  196. package/package.json +94 -0
  197. package/src/classes/FountainDecoder.ts +539 -0
  198. package/src/classes/FountainEncoder.ts +211 -0
  199. package/src/classes/RegistryItem.ts +240 -0
  200. package/src/classes/UR.ts +308 -0
  201. package/src/classes/UrFountainDecoder.ts +142 -0
  202. package/src/classes/UrFountainEncoder.ts +103 -0
  203. package/src/classes/key.helper.ts +85 -0
  204. package/src/encodingMethods/BytewordEncoding.ts +23 -0
  205. package/src/encodingMethods/CborEncoding.ts +196 -0
  206. package/src/encodingMethods/HexEncoding.ts +23 -0
  207. package/src/encodingMethods/UrEncoding.ts +19 -0
  208. package/src/encodingMethods/bytewords.ts +215 -0
  209. package/src/encodingMethods/index.ts +26 -0
  210. package/src/encodingMethods/pipeline.ts +103 -0
  211. package/src/enums/EncodingMethodName.ts +10 -0
  212. package/src/errors.ts +34 -0
  213. package/src/helpers/aliasSampling.ts +87 -0
  214. package/src/helpers/crc32.ts +19 -0
  215. package/src/helpers/fountainUtils.ts +157 -0
  216. package/src/helpers/sha256.ts +88 -0
  217. package/src/helpers/type.helper.ts +1 -0
  218. package/src/helpers/uintArrayHelper.ts +611 -0
  219. package/src/helpers/utils.ts +135 -0
  220. package/src/index-react-native.ts +12 -0
  221. package/src/index.ts +44 -0
  222. package/src/interfaces/IEncodingMethod.ts +10 -0
  223. package/src/registry.ts +146 -0
  224. package/src/test.utils.ts +105 -0
  225. package/src/wrappers/cbor2-cjs.cts +6 -0
  226. package/src/wrappers/cbor2-deno.mts +6 -0
  227. package/src/wrappers/cbor2.ts +7 -0
  228. package/src/wrappers/cbor2Wrapper.ts +14 -0
  229. package/src/xoshiro.ts +66 -0
@@ -0,0 +1,239 @@
1
+ import { isRegistryItem, RegistryItemBase } from "./RegistryItem.js";
2
+ import { EncodingMethodName } from "../enums/EncodingMethodName.js";
3
+ import { InvalidPathLengthError, InvalidTypeError, } from "../errors.js";
4
+ import { dataPipeline } from "../encodingMethods/index.js";
5
+ /**
6
+ * https://github.com/BlockchainCommons/Research/blob/master/papers/bcr-2020-005-ur.md
7
+ * Class that represents the structure of the data we encode/decode in this package.
8
+ * e.g. 'ur:bytes/lpamcmcfatrdcyzcpldpgwhdhtiaiaecgyktgsflguhshthfghjtjngrhsfegtiafegaktgugui'
9
+ *
10
+ *
11
+ * Single part = ur:<type>/<message(payload)>
12
+ * Multi part = ur:<type>/<seqNum-seqLength>/<fragment(payload)>
13
+ *
14
+ * CBOR encoding should not include tag on top level when UR has a tag
15
+ *
16
+ * I want to be able to create UR from encoding normal js types
17
+ * Or from any type in the pipeline
18
+ *
19
+ * Should i do it on the encoder or ur class itself?
20
+ */
21
+ export class UR {
22
+ type;
23
+ payload;
24
+ seqNum;
25
+ seqLength;
26
+ isFragment;
27
+ static pipeline = dataPipeline;
28
+ // If type is unknown it should be cbor, because default encoding will take any and convert to cbor without tagging
29
+ constructor(input) {
30
+ // Create from registry item
31
+ if (input instanceof RegistryItemBase || isRegistryItem(input)) {
32
+ const ur = UR.fromRegistryItem(input);
33
+ this.type = ur.type;
34
+ this.payload = ur.payload;
35
+ this.seqNum = ur.seqNum;
36
+ this.seqLength = ur.seqLength;
37
+ this.isFragment = ur.isFragment;
38
+ }
39
+ // Create from raw data
40
+ else if (typeof input == "object" && 'type' in input && 'payload' in input) {
41
+ const { type, payload, seqNum = 0, seqLength = 0 } = input;
42
+ this.payload = payload;
43
+ this.type = type;
44
+ this.seqNum = seqNum;
45
+ this.seqLength = seqLength;
46
+ this.isFragment = seqLength > 0;
47
+ }
48
+ else {
49
+ throw new InvalidTypeError();
50
+ }
51
+ }
52
+ // Decode
53
+ decode(until) {
54
+ return UR.pipeline.decode(this.payload, { until, enforceType: this.isFragment ? undefined : this.type });
55
+ }
56
+ // Get string representation
57
+ toString() {
58
+ return UR.getUrString(this.type, this.payload, this.seqNum, this.seqLength);
59
+ }
60
+ // Get payload in bytewords
61
+ getPayloadBytewords() {
62
+ return this.payload;
63
+ }
64
+ // Get payload in hex
65
+ getPayloadHex() {
66
+ return UR.pipeline.decode(this.payload, { until: EncodingMethodName.hex });
67
+ // TODO: add tag information
68
+ }
69
+ // Get Payload in cbor
70
+ getPayloadCbor() {
71
+ return UR.pipeline.decode(this.payload, { until: EncodingMethodName.cbor });
72
+ // TODO: add tag information
73
+ }
74
+ toRegistryItem() {
75
+ if (this.isFragment) {
76
+ throw new Error("Cannot convert a multipart ur to registry item, it needs to be decoded first");
77
+ }
78
+ // Enforce type
79
+ // registrtqueryByURType
80
+ return UR.decode(this);
81
+ }
82
+ /// Static methods
83
+ static fromRegistryItem(item) {
84
+ // First convert Registry item to bytewords
85
+ // Only on the top level, we should not include the tag
86
+ const bytewords = UR.pipeline.encode(item, { ignoreTopLevelTag: true });
87
+ // Now create new UR
88
+ return new UR({
89
+ type: item.type.URType,
90
+ payload: bytewords,
91
+ });
92
+ }
93
+ /**
94
+ * Create UR from native javascript types by encoding them to bytewords
95
+ * @param input
96
+ * @returns
97
+ */
98
+ static fromData(input) {
99
+ const bytewords = UR.pipeline.encode(input.payload);
100
+ // Now create new UR
101
+ return new UR({
102
+ ...input,
103
+ payload: bytewords,
104
+ });
105
+ }
106
+ static fromCbor(input) {
107
+ // This means we already have cbor Uint8Array
108
+ // So we will start from the next method
109
+ const bytewords = UR.pipeline.encode(input.payload, { from: EncodingMethodName.hex });
110
+ return new UR({
111
+ ...input,
112
+ payload: bytewords,
113
+ });
114
+ }
115
+ static fromHex(input) {
116
+ // This means we already have hex string
117
+ // So we will start from the next method
118
+ const bytewords = UR.pipeline.encode(input.payload, { from: EncodingMethodName.bytewords });
119
+ return new UR({
120
+ ...input,
121
+ payload: bytewords,
122
+ });
123
+ }
124
+ static fromBytewords(input) {
125
+ return new UR({
126
+ ...input,
127
+ });
128
+ }
129
+ static from(input, type) {
130
+ switch (type) {
131
+ case EncodingMethodName.bytewords:
132
+ return UR.fromBytewords(input);
133
+ case EncodingMethodName.cbor:
134
+ return UR.fromCbor(input);
135
+ case EncodingMethodName.hex:
136
+ return UR.fromHex(input);
137
+ case EncodingMethodName.ur:
138
+ return UR.fromData(input);
139
+ default:
140
+ throw new Error("Invalid encoding method");
141
+ }
142
+ }
143
+ static fromString(ur) {
144
+ return new UR(UR.parseUr(ur));
145
+ }
146
+ static encode = this.fromRegistryItem;
147
+ static decode(ur) {
148
+ // Force cbor type
149
+ return UR.pipeline.decode(ur.payload);
150
+ }
151
+ /**
152
+ * Check if the given string is a valid UR
153
+ * For single part ur, it should be in the form of "ur:<type>/<payload>" which is "ur:<lowercase letters, numbers or dashes>/<bytewords>"
154
+ * For multi part ur, it should be in the form of "ur:<type>/<seqNum-seqLength>/<fragment>" which is "ur:<lowercase letters, numbers or dashes>/<number-number>/<bytewords>"
155
+ * ur uses minimal bytewords encoding style which is a-z and has checksome bytes at the end
156
+ *
157
+ * @param input
158
+ * @returns
159
+ */
160
+ static validate(input) {
161
+ // TODO: use bytewords encoding to validate the payload
162
+ const singlePartPattern = /^ur:[a-z0-9-]+\/[a-z]+$/;
163
+ const multiPartPattern = /^ur:[a-z0-9-]+\/[0-9]+-[0-9]+\/[a-z]+$/;
164
+ return singlePartPattern.test(input) || multiPartPattern.test(input);
165
+ }
166
+ /**
167
+ * Generates a UR string from the given type and payload.
168
+ * Single part = ur:<type>/<message(payload)> if seqNum and seqLength are 0
169
+ * Multi part = ur:<type>/<seqNum-seqLength>/<fragment(payload)>
170
+ */
171
+ static getUrString(type, payload, seqNum = 0, seqLen = 0) {
172
+ // Single UR
173
+ if (seqNum === 0 && seqLen === 0) {
174
+ return joinUri("ur", [type, payload]);
175
+ }
176
+ // Multi part UR
177
+ const seq = `${seqNum}-${seqLen}`;
178
+ return joinUri("ur", [type, seq, payload]);
179
+ }
180
+ /**
181
+ * Parses a UR and performs basic validation
182
+ * @param message e.g. "UR:BYTES/6-23/LPAMCHCFATTTCYCLEHGSDPHDHGEHFGHKKKDL..."
183
+ */
184
+ static parseUr(message) {
185
+ const lowercase = message.toLowerCase(); // e.g. "ur:bytes/6-23/lpamchcfatttcyclehgsdphdhgehfghkkkdl..."
186
+ // check if it is valid ur string
187
+ if (!UR.validate(lowercase)) {
188
+ throw new Error("Invalid UR string");
189
+ }
190
+ const components = lowercase.slice(3).split("/");
191
+ let isFragment = false;
192
+ let seqNum = 0;
193
+ let seqLength = 0;
194
+ let payload = "";
195
+ // Check for the number of components
196
+ switch (components.length) {
197
+ case 2:
198
+ // single part ur
199
+ isFragment = false;
200
+ break;
201
+ case 3:
202
+ // multi part ur
203
+ isFragment = true;
204
+ break;
205
+ default:
206
+ throw new InvalidPathLengthError();
207
+ }
208
+ const type = components[0]; //e.g. "bytes"
209
+ if (isFragment) {
210
+ const seq = components[1]; //e.g. "6-23"
211
+ const [num, length] = seq.split("-").map(Number);
212
+ seqNum = num;
213
+ seqLength = length;
214
+ payload = components[2];
215
+ }
216
+ else {
217
+ payload = components[1];
218
+ }
219
+ return {
220
+ type,
221
+ payload,
222
+ seqNum,
223
+ seqLength,
224
+ isFragment,
225
+ };
226
+ }
227
+ }
228
+ /// Helper functions
229
+ /**
230
+ * Generates a uri. e.g. 'ur:bytes/6-22/lpamcmcfatrdcyzcpldpgwhdhtiaiaecgyktgsflguhshthfghjtjngrhsfegtiafegaktgugui'
231
+ * @param scheme scheme of the uri. e.g. "ur"
232
+ * @param pathComponents adds additional information to the uri in the form of a path (divided by "/"). e.g. "bytes/6-22/lpamcmcfatrdcyzcpldpgwhdhtiaiaecgyktgsflguhshthfghjtjngrhsfegtiafegaktgugui"
233
+ * @returns the complete uri.
234
+ */
235
+ function joinUri(scheme, pathComponents) {
236
+ const path = pathComponents.join("/");
237
+ return [scheme, path].join(":");
238
+ }
239
+ //# sourceMappingURL=UR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UR.js","sourceRoot":"","sources":["../../../src/classes/UR.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { RegistryItem } from "../classes/RegistryItem.js";
2
+ import { FountainDecoder, MultipartPayload } from "./FountainDecoder.js";
3
+ import { UR } from "./UR.js";
4
+ export declare class UrFountainDecoder extends FountainDecoder {
5
+ expectedType: string;
6
+ resultUr: UR;
7
+ decodedData: RegistryItem | any;
8
+ constructor(parts?: UR[] | string[]);
9
+ reset(): void;
10
+ setExpectedValuesUr(part: UR, decodedPart: MultipartPayload): void;
11
+ protected validateUr(part: UR, decodedPart: MultipartPayload): boolean;
12
+ receivePartUr(part: UR | string): boolean;
13
+ finalize(): void;
14
+ getDecodedData(): RegistryItem | any;
15
+ }
@@ -0,0 +1,123 @@
1
+ import { EncodingMethodName } from "../enums/EncodingMethodName.js";
2
+ import { FountainDecoder, validateDecodedMultipart } from "./FountainDecoder.js";
3
+ import { UR } from "./UR.js";
4
+ export class UrFountainDecoder extends FountainDecoder {
5
+ expectedType;
6
+ resultUr;
7
+ decodedData;
8
+ constructor(parts = []) {
9
+ super();
10
+ parts.forEach((part) => {
11
+ this.receivePartUr(part);
12
+ });
13
+ }
14
+ reset() {
15
+ super.reset();
16
+ this.resultUr = undefined;
17
+ this.expectedType = undefined;
18
+ }
19
+ setExpectedValuesUr(part, decodedPart) {
20
+ this.expectedType = part.type;
21
+ this.expectedPartCount = part.seqLength;
22
+ super.setExpectedValues(decodedPart);
23
+ }
24
+ validateUr(part, decodedPart) {
25
+ // Check if UR is a fragment
26
+ if (!part.isFragment) {
27
+ return false;
28
+ }
29
+ // Check the type of the UR
30
+ if (part.type !== this.expectedType) {
31
+ return false;
32
+ }
33
+ // Expect metadata ur seqNum to be equal to the decoded part seqNum
34
+ if (part.seqNum !== decodedPart.seqNum) {
35
+ return false;
36
+ }
37
+ // Expect metadata ur seqLength to be equal to the decoded part seqLength
38
+ if (part.seqLength !== decodedPart.seqLength) {
39
+ return false;
40
+ }
41
+ // Validate decoded paylad
42
+ return super.validatePart(decodedPart);
43
+ }
44
+ receivePartUr(part) {
45
+ // If we already have a result, we're done
46
+ if (this.done) {
47
+ return false;
48
+ }
49
+ // Convert string into UR
50
+ if (typeof part === "string") {
51
+ part = UR.fromString(part);
52
+ }
53
+ // If what we received is not a multupart UR, then we're done
54
+ if (!part.isFragment) {
55
+ // If this is not a fragment and we have not received any fragments yet then its the whole UR
56
+ if (!this.started) {
57
+ this.resultUr = part;
58
+ this.started = true;
59
+ this.done = true;
60
+ try {
61
+ this.decodedData = this.resultUr.decode();
62
+ }
63
+ catch (error) {
64
+ this.error = error;
65
+ }
66
+ // Finish here
67
+ return true;
68
+ }
69
+ // If we have received fragments before then this is an error
70
+ else {
71
+ return false;
72
+ }
73
+ }
74
+ let parsed;
75
+ try {
76
+ const decoded = part.decode();
77
+ parsed = validateDecodedMultipart(decoded);
78
+ }
79
+ catch (e) {
80
+ console.error(e);
81
+ return false;
82
+ }
83
+ // If this is the first part we've seen then set expected values
84
+ if (!this.started)
85
+ this.setExpectedValuesUr(part, parsed);
86
+ // If this is a fragment validate UR
87
+ if (!this.validateUr(part, parsed)) {
88
+ return false;
89
+ }
90
+ return super.receivePart(parsed);
91
+ }
92
+ // Assemble data and generate single result UR
93
+ finalize() {
94
+ super.finalize();
95
+ if (this.error) {
96
+ return;
97
+ }
98
+ if (this.resultRaw !== undefined) {
99
+ // Result data is already in CBOR
100
+ // Just convert it to bytewords instead of encoding it again
101
+ const payload = UR.pipeline.encode(this.resultRaw, { from: EncodingMethodName.hex });
102
+ this.resultUr = new UR({
103
+ type: this.expectedType,
104
+ payload: payload,
105
+ });
106
+ // Now Try to decode the result UR
107
+ try {
108
+ this.decodedData = this.resultUr.decode();
109
+ }
110
+ catch (error) {
111
+ this.error = error;
112
+ }
113
+ }
114
+ }
115
+ getDecodedData() {
116
+ if (!this.isSuccessful()) {
117
+ console.log("Fountain decoding was not successful");
118
+ return undefined;
119
+ }
120
+ return this.decodedData;
121
+ }
122
+ }
123
+ //# sourceMappingURL=UrFountainDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UrFountainDecoder.js","sourceRoot":"","sources":["../../../src/classes/UrFountainDecoder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAoB,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAE7B,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IAC7C,YAAY,CAAS;IACrB,QAAQ,CAAK;IACb,WAAW,CAAqB;IAEvC,YAAY,QAAyB,EAAE;QACrC,KAAK,EAAE,CAAC;QACR,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;YACrB,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK;QACV,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;QAC1B,IAAI,CAAC,YAAY,GAAG,SAAS,CAAC;IAChC,CAAC;IAED,mBAAmB,CAAC,IAAQ,EAAE,WAA6B;QACzD,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,SAAS,CAAC;QACxC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACvC,CAAC;IAES,UAAU,CAAC,IAAQ,EAAE,WAA6B;QAC1D,4BAA4B;QAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,2BAA2B;QAC3B,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,YAAY,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mEAAmE;QACnE,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yEAAyE;QACzE,IAAI,IAAI,CAAC,SAAS,KAAK,WAAW,CAAC,SAAS,EAAE,CAAC;YAC7C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,0BAA0B;QAC1B,OAAO,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAED,aAAa,CAAC,IAAiB;QAC7B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,KAAK,CAAC;QACf,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAED,6DAA6D;QAC7D,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,6FAA6F;YAC7F,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;gBAClB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;gBACrB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;gBACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBAEjB,IAAI,CAAC;oBACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC5C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;gBACrB,CAAC;gBAED,cAAc;gBACd,OAAO,IAAI,CAAC;YACd,CAAC;YACD,6DAA6D;iBACxD,CAAC;gBACJ,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QAED,IAAI,MAAwB,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,GAAG,wBAAwB,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,gEAAgE;QAChE,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,IAAI,CAAC,mBAAmB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE1D,oCAAoC;QACpC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;IAED,8CAA8C;IACvC,QAAQ;QACb,KAAK,CAAC,QAAQ,EAAE,CAAC;QAEjB,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,OAAO;QACT,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;YACjC,iCAAiC;YACjC,4DAA4D;YAC5D,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC;YACrF,IAAI,CAAC,QAAQ,GAAG,IAAI,EAAE,CAAC;gBACrB,IAAI,EAAE,IAAI,CAAC,YAAY;gBACvB,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;YAEH,kCAAkC;YAClC,IAAI,CAAC;gBACH,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YAC5C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;YACpD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF"}
@@ -0,0 +1,42 @@
1
+ import { RegistryItem } from "../classes/RegistryItem.js";
2
+ import { UR } from "./UR.js";
3
+ import { FountainEncoder } from "./FountainEncoder.js";
4
+ /**
5
+ * UrFountainEncoder encodes data on the fly using an internal state to keep generating UR fragments of the payload.
6
+ * It extends the FountainEncoder class to provide additional functionality specific to UR encoding.
7
+ */
8
+ export declare class UrFountainEncoder extends FountainEncoder {
9
+ /** The UR type of the input data */
10
+ private _type;
11
+ /** The original input data as a UR object */
12
+ private _inputUr;
13
+ /** Reset counter to 1 after hitting `fragmentCount * ratio`; if undefined or 0, it goes forever */
14
+ repeatAfterRatio: number;
15
+ /**
16
+ * Creates an instance of UrFountainEncoder.
17
+ * @param input - The input data to be encoded, either as a RegistryItem or UR.
18
+ * @param maxFragmentLength - The maximum length of each fragment.
19
+ * @param minFragmentLength - The minimum length of each fragment.
20
+ * @param firstSeqNum - The sequence number to start with.
21
+ * @param repeatAfterRatio - The ratio after which the sequence number resets. Default is 2. If 0 fountain goes forever.
22
+ */
23
+ constructor(input: RegistryItem | UR, maxFragmentLength?: number, minFragmentLength?: number, firstSeqNum?: number, repeatAfterRatio?: number);
24
+ /**
25
+ * Return all the fragments based on the fountain ratio at once as an array of Uint8Arrays.
26
+ * @param fountainRatio - The ratio of the fountain fragments to the pure fragments. Default is 0.
27
+ * @returns An array of UR objects representing the fragments.
28
+ */
29
+ getAllPartsUr(fountainRatio?: number): UR[];
30
+ /**
31
+ * Give the 'next' fragment for the ur for which the fountainEncoder was created.
32
+ * @returns The 'next' fragment, represented as a Ur multipart string.
33
+ */
34
+ nextPartUr(): UR;
35
+ /**
36
+ * Converts a fragment to a UR object.
37
+ * @param seqNum - The sequence number of the fragment.
38
+ * @param fragment - The fragment data as a Uint8Array.
39
+ * @returns A UR object representing the fragment.
40
+ */
41
+ private fragment2Ur;
42
+ }
@@ -0,0 +1,88 @@
1
+ import { isRegistryItem, RegistryItemBase } from "../classes/RegistryItem.js";
2
+ import { UR } from "./UR.js";
3
+ import { FountainEncoder } from "./FountainEncoder.js";
4
+ import { EncodingMethodName } from "../enums/EncodingMethodName.js";
5
+ /**
6
+ * UrFountainEncoder encodes data on the fly using an internal state to keep generating UR fragments of the payload.
7
+ * It extends the FountainEncoder class to provide additional functionality specific to UR encoding.
8
+ */
9
+ export class UrFountainEncoder extends FountainEncoder {
10
+ /** The UR type of the input data */
11
+ _type;
12
+ /** The original input data as a UR object */
13
+ _inputUr;
14
+ /** Reset counter to 1 after hitting `fragmentCount * ratio`; if undefined or 0, it goes forever */
15
+ repeatAfterRatio = 2;
16
+ /**
17
+ * Creates an instance of UrFountainEncoder.
18
+ * @param input - The input data to be encoded, either as a RegistryItem or UR.
19
+ * @param maxFragmentLength - The maximum length of each fragment.
20
+ * @param minFragmentLength - The minimum length of each fragment.
21
+ * @param firstSeqNum - The sequence number to start with.
22
+ * @param repeatAfterRatio - The ratio after which the sequence number resets. Default is 2. If 0 fountain goes forever.
23
+ */
24
+ constructor(input, maxFragmentLength = 100, minFragmentLength = 10, firstSeqNum = 0, repeatAfterRatio = 2) {
25
+ let inputUr;
26
+ // If the input is a RegistryItem, convert it to a Ur
27
+ if (input instanceof RegistryItemBase || isRegistryItem(input)) {
28
+ inputUr = UR.fromRegistryItem(input);
29
+ }
30
+ else {
31
+ inputUr = input;
32
+ }
33
+ // Input in CBOR
34
+ let inputCBOR = inputUr.getPayloadCbor();
35
+ super(inputCBOR, maxFragmentLength, minFragmentLength, firstSeqNum);
36
+ this._inputUr = inputUr;
37
+ this._type = inputUr.type;
38
+ this.repeatAfterRatio = repeatAfterRatio;
39
+ }
40
+ /**
41
+ * Return all the fragments based on the fountain ratio at once as an array of Uint8Arrays.
42
+ * @param fountainRatio - The ratio of the fountain fragments to the pure fragments. Default is 0.
43
+ * @returns An array of UR objects representing the fragments.
44
+ */
45
+ getAllPartsUr(fountainRatio = 0) {
46
+ const allParts = super.getAllParts(fountainRatio);
47
+ return allParts.map((part, index) => this.fragment2Ur(index + 1, part));
48
+ }
49
+ /**
50
+ * Give the 'next' fragment for the ur for which the fountainEncoder was created.
51
+ * @returns The 'next' fragment, represented as a Ur multipart string.
52
+ */
53
+ nextPartUr() {
54
+ // Reset the sequence number if we hit the ratio
55
+ if (this.repeatAfterRatio) {
56
+ if (this._seqNum > this._pureFragments.length * this.repeatAfterRatio) {
57
+ this._seqNum = 0;
58
+ }
59
+ }
60
+ const encodedFragment = super.nextPart();
61
+ return this.fragment2Ur(this._seqNum, encodedFragment);
62
+ }
63
+ /**
64
+ * Converts a fragment to a UR object.
65
+ * @param seqNum - The sequence number of the fragment.
66
+ * @param fragment - The fragment data as a Uint8Array.
67
+ * @returns A UR object representing the fragment.
68
+ */
69
+ fragment2Ur(seqNum, fragment) {
70
+ // Fragment is already encoded in CBOR
71
+ // Just convert it to bytewords instead of encoding it again
72
+ const payload = UR.pipeline.encode(fragment, { from: EncodingMethodName.hex });
73
+ if (this.isSinglePart()) {
74
+ return new UR({
75
+ type: this._type,
76
+ payload: payload,
77
+ });
78
+ }
79
+ return new UR({
80
+ type: this._type,
81
+ payload: payload,
82
+ seqNum: seqNum,
83
+ seqLength: this._pureFragments.length,
84
+ isFragment: true,
85
+ });
86
+ }
87
+ }
88
+ //# sourceMappingURL=UrFountainEncoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UrFountainEncoder.js","sourceRoot":"","sources":["../../../src/classes/UrFountainEncoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAgB,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC5F,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;;GAGG;AACH,MAAM,OAAO,iBAAkB,SAAQ,eAAe;IACpD,oCAAoC;IAC5B,KAAK,CAAS;IACtB,6CAA6C;IACrC,QAAQ,CAAK;IACrB,mGAAmG;IAC5F,gBAAgB,GAAG,CAAC,CAAC;IAE5B;;;;;;;OAOG;IACH,YACE,KAAwB,EACxB,oBAA4B,GAAG,EAC/B,oBAA4B,EAAE,EAC9B,cAAsB,CAAC,EACvB,gBAAgB,GAAG,CAAC;QAGpB,IAAI,OAAO,CAAC;QACZ,qDAAqD;QACrD,IAAI,KAAK,YAAY,gBAAgB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/D,OAAO,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;aACI,CAAC;YACJ,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC;QAED,gBAAgB;QAChB,IAAI,SAAS,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;QAEzC,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,WAAW,CAAC,CAAC;QAEpE,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;QACxB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IAC3C,CAAC;IAGD;;;;OAIG;IACH,aAAa,CAAC,gBAAwB,CAAC;QACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,GAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;IACxE,CAAC;IAED;;;OAGG;IACI,UAAU;QACf,gDAAgD;QAChD,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC1B,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtE,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;YACnB,CAAC;QACH,CAAC;QACD,MAAM,eAAe,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzC,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACzD,CAAC;IAED;;;;;OAKG;IACK,WAAW,CAAC,MAAa,EAAE,QAAmB;QACpD,sCAAsC;QACtC,4DAA4D;QAC5D,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAC,IAAI,EAAE,kBAAkB,CAAC,GAAG,EAAC,CAAC,CAAC;QAC7E,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;YACxB,OAAO,IAAI,EAAE,CAAC;gBACZ,IAAI,EAAE,IAAI,CAAC,KAAK;gBAChB,OAAO,EAAE,OAAO;aACjB,CAAC,CAAC;QACL,CAAC;QACD,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,EAAE,IAAI,CAAC,KAAK;YAChB,OAAO,EAAE,OAAO;YAChB,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,IAAI,CAAC,cAAc,CAAC,MAAM;YACrC,UAAU,EAAE,IAAI;SACjB,CAAC,CAAA;IACJ,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * This file contains helper functions for encoding and decoding keys
3
+ */
4
+ /**
5
+ * Interface for the key to integer mapping
6
+ */
7
+ export type IKeyMap = Record<string, string | number>;
8
+ /**
9
+ * For some CDDL types we use integer as keys to keep the CBOR encoded data small
10
+ * This function converts the data keys to their respective integer values
11
+ *
12
+ * It needs to return MAP because cbor library only then encodes the keys as integers
13
+ *
14
+ * @param data Object that has key value pairs
15
+ * @param keyMap Map of the keys to integers values
16
+ * @returns Map with integer keys
17
+ */
18
+ export declare function encodeKeys(data: object, keyMap: IKeyMap, allowKeysNotInMap: boolean): Map<string | number, any>;
19
+ /**
20
+ * For some CDDL types we use integer as keys to keep the CBOR encoded data small
21
+ * This function converts the data keys back to their respective string values
22
+ *
23
+ * @param _data Object that has encoded key - value pairs
24
+ * @param keyMap Map of the keys to integer values
25
+ * @returns Object with string keys
26
+ */
27
+ export declare function decodeKeys(data: Map<string | number, any> | Record<string | number, any>, keyMap: IKeyMap, allowKeysNotInMap: boolean): object;
@@ -0,0 +1,66 @@
1
+ /**
2
+ * This file contains helper functions for encoding and decoding keys
3
+ */
4
+ /**
5
+ * For some CDDL types we use integer as keys to keep the CBOR encoded data small
6
+ * This function converts the data keys to their respective integer values
7
+ *
8
+ * It needs to return MAP because cbor library only then encodes the keys as integers
9
+ *
10
+ * @param data Object that has key value pairs
11
+ * @param keyMap Map of the keys to integers values
12
+ * @returns Map with integer keys
13
+ */
14
+ export function encodeKeys(data, keyMap, allowKeysNotInMap) {
15
+ const map = new Map();
16
+ // If we have a mapping, use it to map the data
17
+ // Check if our data is an object
18
+ if (typeof data !== "object")
19
+ return undefined;
20
+ // Create a set from the keys of the data
21
+ const keys = new Set(Object.keys(data));
22
+ // Add the keys in the correct order to the map
23
+ for (const key in keyMap) {
24
+ // Check if the key exists in the data
25
+ if (data[key] !== undefined)
26
+ map.set(keyMap[key], data[key]);
27
+ keys.delete(key);
28
+ }
29
+ if (allowKeysNotInMap) {
30
+ // Add other keys as string if they are not existent in the map
31
+ keys.forEach((key) => {
32
+ map.set(key, data[key]);
33
+ });
34
+ }
35
+ return map;
36
+ }
37
+ /**
38
+ * For some CDDL types we use integer as keys to keep the CBOR encoded data small
39
+ * This function converts the data keys back to their respective string values
40
+ *
41
+ * @param _data Object that has encoded key - value pairs
42
+ * @param keyMap Map of the keys to integer values
43
+ * @returns Object with string keys
44
+ */
45
+ export function decodeKeys(data, keyMap, allowKeysNotInMap) {
46
+ // If we have a mapping, use it to map the data
47
+ const result = {};
48
+ // Convert the data to a map if it is not already
49
+ const _data = data instanceof Map ? data : new Map(Object.entries(data));
50
+ // Get all the keys in the data
51
+ const keys = new Set(_data.keys());
52
+ // Add the keys in the correct order
53
+ for (const key in keyMap) {
54
+ if (_data.has(keyMap[key]))
55
+ result[key] = _data.get(keyMap[key]);
56
+ keys.delete(keyMap[key]);
57
+ }
58
+ if (allowKeysNotInMap) {
59
+ // Add other keys as string if they are not existent in the map
60
+ keys.forEach((key) => {
61
+ result[key] = _data.get(key);
62
+ });
63
+ }
64
+ return result;
65
+ }
66
+ //# sourceMappingURL=key.helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"key.helper.js","sourceRoot":"","sources":["../../../src/classes/key.helper.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH;;;;;;;;;GASG;AACH,MAAM,UAAU,UAAU,CACxB,IAAY,EACZ,MAAe,EACf,iBAA0B;IAE1B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;IACtB,+CAA+C;IAC/C,iCAAiC;IACjC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAE/C,yCAAyC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAExC,+CAA+C;IAC/C,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,sCAAsC;QACtC,IAAG,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,+DAA+D;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,UAAU,CACxB,IAA8D,EAC9D,MAAe,EACf,iBAA0B;IAE1B,+CAA+C;IAC/C,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,iDAAiD;IACjD,MAAM,KAAK,GAAG,IAAI,YAAY,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzE,+BAA+B;IAC/B,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAEnC,oCAAoC;IACpC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QACzB,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACjE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,CAAC;IAED,IAAI,iBAAiB,EAAE,CAAC;QACtB,+DAA+D;QAC/D,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACnB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { STYLES } from "./bytewords.js";
2
+ import { EncodingMethodName } from "../enums/EncodingMethodName.js";
3
+ import { IEncodingMethod } from "../interfaces/IEncodingMethod.js";
4
+ export declare class BytewordEncoding implements IEncodingMethod<string, string> {
5
+ private _name;
6
+ readonly _style: STYLES;
7
+ get name(): EncodingMethodName;
8
+ constructor(style?: STYLES);
9
+ encode(payload: string): string;
10
+ decode(payload: string): string;
11
+ }
@@ -0,0 +1,19 @@
1
+ import { STYLES, decode, encode } from "./bytewords.js";
2
+ import { EncodingMethodName } from "../enums/EncodingMethodName.js";
3
+ export class BytewordEncoding {
4
+ _name = EncodingMethodName.bytewords;
5
+ _style;
6
+ get name() {
7
+ return this._name;
8
+ }
9
+ constructor(style = STYLES.MINIMAL) {
10
+ this._style = style;
11
+ }
12
+ encode(payload) {
13
+ return encode(payload, this._style);
14
+ }
15
+ decode(payload) {
16
+ return decode(payload, this._style);
17
+ }
18
+ }
19
+ //# sourceMappingURL=BytewordEncoding.js.map