@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,447 @@
1
+ import { difference, isSubset } from "../helpers/utils.js";
2
+ import { concatUint8Arrays, isUint8Array } from "../helpers/uintArrayHelper.js";
3
+ import { InvalidChecksumError } from "../errors.js";
4
+ import { chooseFragments } from "../helpers/fountainUtils.js";
5
+ import { arrayContains, arraysEqual, bufferXOR, getCRC, setDifference } from "../helpers/utils.js";
6
+ import { CborEncoding } from "../encodingMethods/CborEncoding.js";
7
+ const cborEncoder = new CborEncoding();
8
+ class FountainBlock {
9
+ _indexes;
10
+ _fragment;
11
+ constructor(_indexes, _fragment) {
12
+ this._indexes = _indexes;
13
+ this._fragment = _fragment;
14
+ }
15
+ /** What blocks is mixed in this block */
16
+ get indexes() {
17
+ return this._indexes;
18
+ }
19
+ /** Data */
20
+ get fragment() {
21
+ return this._fragment;
22
+ }
23
+ isSimple() {
24
+ return this.indexes.length === 1;
25
+ }
26
+ isSubsetOf(other) {
27
+ // Dont use set use array
28
+ // return isSubset(new Set(this.indexes), new Set(other.indexes));
29
+ return arrayContains(other.indexes, this.indexes);
30
+ }
31
+ isSupersetOf(other) {
32
+ // return isSubset(new Set(other.indexes), new Set(this.indexes));
33
+ return arrayContains(this.indexes, other.indexes);
34
+ }
35
+ reduceBy(other) {
36
+ // Check if the other block is a subset of this block
37
+ if (!this.isSupersetOf(other)) {
38
+ return this;
39
+ }
40
+ // Otherwise reduce the other block from this block
41
+ // const newIndexes = difference(new Set(this.indexes), new Set(other.indexes));
42
+ const newIndexes = setDifference(this.indexes, other.indexes);
43
+ const newFragment = bufferXOR(this.fragment, other.fragment);
44
+ return new FountainBlock([...newIndexes], newFragment);
45
+ }
46
+ }
47
+ export class FountainDecoder {
48
+ /** Did we received any parts and started decoding */
49
+ started = false;
50
+ done = false;
51
+ /** Stores the error if decoding fauls */
52
+ error;
53
+ /** Stores the decoded data*/
54
+ resultRaw = undefined;
55
+ /** Stores the expected length of the final message */
56
+ expectedMessageLength = 0;
57
+ /** Stores the expected checksum of the final message */
58
+ expectedChecksum = 0;
59
+ /** Stores the expected message length of each fragment */
60
+ expectedFragmentLength = 0;
61
+ /** Total number of simple fragments */
62
+ expectedPartCount = 0;
63
+ /** Mixed Parts that we cannot reduce to simple parts yet */
64
+ mixedBlocks = [];
65
+ /** Non-mixed single parts */
66
+ simpleBlocks = [];
67
+ /** Queue of parts that may take part in reduction */
68
+ queuedBlocks = [];
69
+ // For tracking the progress of decoding we can keep seen indexes and decoded indexes
70
+ /** Bitmap array of seen block */
71
+ seenBlocks = [];
72
+ /** Bitmap array of decoded blocks */
73
+ decodedBlocks = [];
74
+ /** Keeps track of the how many parts have been processed */
75
+ processedPartsCount = 0;
76
+ get result() {
77
+ return this.resultRaw || this.error;
78
+ }
79
+ isSuccessful() {
80
+ return this.done && !this.error;
81
+ }
82
+ isComplete() {
83
+ return this.done;
84
+ }
85
+ constructor(parts = []) {
86
+ parts.forEach((part) => this.receivePart(part));
87
+ }
88
+ reset() {
89
+ this.error = undefined;
90
+ this.resultRaw = undefined;
91
+ this.expectedMessageLength = 0;
92
+ this.expectedChecksum = 0;
93
+ this.expectedFragmentLength = 0;
94
+ this.mixedBlocks = [];
95
+ this.simpleBlocks = [];
96
+ this.queuedBlocks = [];
97
+ this.seenBlocks = [];
98
+ this.decodedBlocks = [];
99
+ this.processedPartsCount = 0;
100
+ }
101
+ setExpectedValues(decodedPart) {
102
+ this.expectedPartCount = decodedPart.seqLength;
103
+ this.expectedMessageLength = decodedPart.messageLength;
104
+ this.expectedChecksum = decodedPart.checksum;
105
+ this.expectedFragmentLength = decodedPart.fragment.length;
106
+ this.seenBlocks = new Array(this.expectedPartCount).fill(0);
107
+ this.decodedBlocks = new Array(this.expectedPartCount).fill(0);
108
+ // Set started so we know we have expected values
109
+ this.started = true;
110
+ this.done = false;
111
+ }
112
+ /**
113
+ * Set the expected values on the initial run the current decoder.
114
+ * And check if the next multipart ur is a 'member' of the originally scanned ur with the current decoder.
115
+ * @param decodedPart received multipart ur
116
+ * @returns boolean indicating if the multipart ur is a 'member' of the originally scanned ur with the current decoder.
117
+ */
118
+ validatePart(decodedPart) {
119
+ // If this part's values don't match the first part's values, throw away the part
120
+ if (this.expectedPartCount !== decodedPart.seqLength) {
121
+ // TODO: display proper error message
122
+ return false;
123
+ }
124
+ if (this.expectedMessageLength !== decodedPart.messageLength) {
125
+ return false;
126
+ }
127
+ if (this.expectedChecksum !== decodedPart.checksum) {
128
+ return false;
129
+ }
130
+ if (this.expectedFragmentLength !== decodedPart.fragment.length) {
131
+ return false;
132
+ }
133
+ // This part should be processed
134
+ return true;
135
+ }
136
+ finalize() {
137
+ if (this.simpleBlocks.length !== this.expectedPartCount) {
138
+ console.warn("Not all parts have been received");
139
+ return;
140
+ }
141
+ // Sort the simple blocks by their index
142
+ const sortedParts = [...this.simpleBlocks].sort((a, b) => a.indexes[0] - b.indexes[0]);
143
+ // Get fragments in order and combine them to message
144
+ const message = joinFragments(sortedParts.map((p) => p.fragment), this.expectedMessageLength);
145
+ // Get the final checksum
146
+ const checksum = getCRC(message);
147
+ if (checksum === this.expectedChecksum) {
148
+ this.resultRaw = message;
149
+ }
150
+ else {
151
+ this.error = new InvalidChecksumError();
152
+ }
153
+ this.done = true;
154
+ }
155
+ parseInput(input) {
156
+ // Check the type of input payload
157
+ if (input instanceof Uint8Array) {
158
+ return parseMultipartCbor(input);
159
+ }
160
+ else if (typeof input === "object") {
161
+ // Check its correct type
162
+ if (!validateMultipartPayload(input)) {
163
+ throw new Error("Invalid multipart payload");
164
+ }
165
+ return input;
166
+ }
167
+ throw new Error("Invalid input type");
168
+ }
169
+ receivePart(encodedPart) {
170
+ // If we already have a result, we're done
171
+ if (this.done) {
172
+ return false;
173
+ }
174
+ let decodedPart;
175
+ try {
176
+ decodedPart = this.parseInput(encodedPart);
177
+ }
178
+ catch (error) {
179
+ // Skip receiving invalid parts
180
+ console.warn("Cannot parse part", error);
181
+ return false;
182
+ }
183
+ try {
184
+ // If this is the first part we've seen then set expected values
185
+ if (!this.started)
186
+ this.setExpectedValues(decodedPart);
187
+ // Validate part
188
+ if (!this.validatePart(decodedPart)) {
189
+ return false;
190
+ }
191
+ // Now we can start processing the part
192
+ // Find which original data fragments are in this fragment what is mixed in this
193
+ let indexes = chooseFragments(decodedPart.seqNum, decodedPart.seqLength, decodedPart.checksum);
194
+ // order the indexes
195
+ indexes = indexes.sort((a, b) => a - b);
196
+ // Get the data
197
+ const fragment = decodedPart.fragment;
198
+ const block = new FountainBlock(indexes, fragment);
199
+ this.queuedBlocks.push(block);
200
+ this.processQueue();
201
+ this.processedPartsCount += 1;
202
+ }
203
+ catch (error) {
204
+ // Skip receiving invalid parts
205
+ console.warn("Error receiving part", error);
206
+ return false;
207
+ }
208
+ return true;
209
+ }
210
+ // http://blog.notdot.net/2012/01/Damn-Cool-Algorithms-Fountain-Codes
211
+ processQueue() {
212
+ // Process the queued blocks until queue is empty or we're done
213
+ while (!this.done && this.queuedBlocks.length > 0) {
214
+ const block = this.queuedBlocks.shift();
215
+ // Add indexes to seen indexes
216
+ block.indexes.forEach((index) => {
217
+ this.seenBlocks[index] = 1;
218
+ });
219
+ if (block.isSimple()) {
220
+ this.processSimpleBlock(block);
221
+ }
222
+ else {
223
+ this.processMixedBlock(block);
224
+ }
225
+ }
226
+ }
227
+ /**
228
+ * Process a "pure" fragment. this is a original fragment that is not mixed with any other fragments.
229
+ * @param block object with the indexes and the fragment payload buffer.
230
+ * @returns
231
+ */
232
+ processSimpleBlock(block) {
233
+ if (!block.isSimple()) {
234
+ throw new Error("Part is not simple");
235
+ }
236
+ // Don't process duplicate blocks
237
+ // if (this.simpleBlocks.has(block.indexes)) return;
238
+ if (this.simpleBlocks.some((b) => arraysEqual(b.indexes, block.indexes)))
239
+ return;
240
+ // Add our block to simple blocks
241
+ this.simpleBlocks.push(block);
242
+ // Keep track of the decoded blocks
243
+ this.decodedBlocks[block.indexes[0]] = 1;
244
+ // If we've received all the parts
245
+ if (this.simpleBlocks.length == this.expectedPartCount) {
246
+ this.finalize();
247
+ }
248
+ else {
249
+ // Otherwise try to reduce the all the mixed parts by this simple part
250
+ this.reduceAllMixedBlocksBy(block);
251
+ }
252
+ }
253
+ /**
254
+ * Process the mixed parts
255
+ * @param newPart
256
+ * @returns
257
+ */
258
+ processMixedBlock(newPart) {
259
+ // Check if already have this block, if so pass
260
+ // if (this.mixedBlocks.has(newPart.indexes)) {
261
+ // return;
262
+ // }
263
+ if (this.mixedBlocks.some((b) => arraysEqual(b.indexes, newPart.indexes))) {
264
+ return;
265
+ }
266
+ // Get all simple blocks that we have that makes up this part and reduce current block by whatever we have
267
+ let reducedBlock = this.simpleBlocks.reduce((proccessed, currentSimple) => proccessed.reduceBy(currentSimple), newPart);
268
+ // Now check if we have a simple part if so add it to the queue
269
+ if (reducedBlock.isSimple()) {
270
+ this.queuedBlocks.push(reducedBlock);
271
+ return;
272
+ }
273
+ // We still have have a mixed block
274
+ // So we will check if there are any subsets of this block that we can reduce
275
+ // So if we have 1x2x3 try to find subparts (1x2, 2x3, 1x3) that will directly reduce this part to simple part
276
+ // For now we will go though all the parts and try to reduce them so if we have 1x2x3x4 XOR 1x2 we will get 3x4
277
+ reducedBlock = this.mixedBlocks.reduce((proccessed, currentMixed) => proccessed.reduceBy(currentMixed), reducedBlock);
278
+ // If after all the operations we have a simple part add it to the queue
279
+ if (reducedBlock.isSimple()) {
280
+ this.queuedBlocks.push(reducedBlock);
281
+ return;
282
+ }
283
+ // If we dont have a simple part we will try to reduce all the mixed parts by this part
284
+ this.reduceAllMixedBlocksBy(reducedBlock);
285
+ // Then add our part to the mixed parts
286
+ this.mixedBlocks.push(reducedBlock);
287
+ }
288
+ /**
289
+ * Process all the mixed blocks by the given block
290
+ * If the mixed part can be reduced to a simple part, add it to the queue
291
+ * If a mixed part is reduced to simpler part add it to the mixed
292
+ * @param block
293
+ */
294
+ reduceAllMixedBlocksBy(block) {
295
+ const newMixed = [];
296
+ // Try to reduce all the mixed parts by this simple part
297
+ this.mixedBlocks
298
+ .map((mixedPart) => mixedPart.reduceBy(block))
299
+ .forEach((reducedPart) => {
300
+ if (reducedPart.isSimple()) {
301
+ // Add to the queue if it is a simple part
302
+ this.queuedBlocks.push(reducedPart);
303
+ }
304
+ else {
305
+ // Otherwise add it to as a new mixed part
306
+ newMixed.push(reducedPart);
307
+ }
308
+ });
309
+ // Override the mixed parts with new reduces parts
310
+ this.mixedBlocks = newMixed;
311
+ }
312
+ /**
313
+ *
314
+ *
315
+ * The next part it receives is 3: A ⊕ B ⊕ C ⊕ D.
316
+ * Each time a part is received, the decoder checks to see whether the set of fragments it contains
317
+ * is a proper subset or superset of the set of fragments in any part is has received.
318
+ * If so, it can reduce the superset part by the subset part. In this case,
319
+ * it discovers it can reduce the incoming part 3: A ⊕ B ⊕ C ⊕ D by XORing it with part 1: A ⊕ B ⊕ C,
320
+ * yielding the simple part 3: D.
321
+ */
322
+ /**
323
+ *
324
+ * Try the reduce mixed part A by the part B
325
+ * If B is a subset of A then we can reduce A by B
326
+ * Otherwise return A
327
+ *
328
+ * @param a existing mixedpart
329
+ * @param b newly received mixedpart
330
+ * @returns
331
+ */
332
+ reducePartByPart_(a, b) {
333
+ // If the fragments mixed into `b` are a strict (proper) subset of those in `a`...
334
+ const aSet = new Set(a.indexes);
335
+ const bSet = new Set(b.indexes);
336
+ // If B is a subset of A then we can reduce A by B
337
+ if (isSubset(bSet, aSet)) {
338
+ // A - B => new indexes in the mixed part
339
+ const newIndexes = difference(aSet, bSet);
340
+ const newFragment = bufferXOR(a.fragment, b.fragment);
341
+ return new FountainBlock([...newIndexes], newFragment);
342
+ }
343
+ // If A is a subset of B then we can reduce B by A
344
+ // else if (isSubset(aSet, bSet)) {
345
+ // // B - A => new indexes in the mixed part
346
+ // const newIndexes = difference(bSet, aSet);
347
+ // const newFragment = bufferXOR(b.fragment, a.fragment);
348
+ // return new FountainEncodedPart([...newIndexes], newFragment);
349
+ // }
350
+ else {
351
+ // If A is not reducable by B then return A
352
+ return a;
353
+ }
354
+ }
355
+ reducePartByPart(a, b) {
356
+ // If the fragments mixed into `b` are a strict (proper) subset of those in `a`...
357
+ if (arrayContains(a.indexes, b.indexes)) {
358
+ const newIndexes = setDifference(a.indexes, b.indexes);
359
+ const newFragment = bufferXOR(a.fragment, b.fragment);
360
+ return new FountainBlock(newIndexes, newFragment);
361
+ }
362
+ else {
363
+ // `a` is not reducable by `b`, so return a
364
+ return a;
365
+ }
366
+ }
367
+ estimatedPercentComplete() {
368
+ if (this.done) {
369
+ return 1;
370
+ }
371
+ const expectedPartCount = this.expectedPartCount;
372
+ if (expectedPartCount === 0) {
373
+ return 0;
374
+ }
375
+ // We multiply the expectedPartCount by `1.75` as a way to compensate for the facet
376
+ // that `this.processedPartsCount` also tracks the duplicate parts that have been
377
+ // processeed.
378
+ return Math.min(0.99, this.processedPartsCount / (expectedPartCount * 1.75));
379
+ }
380
+ getProgress() {
381
+ if (this.done) {
382
+ return 1;
383
+ }
384
+ const expectedPartCount = this.expectedPartCount;
385
+ if (expectedPartCount === 0) {
386
+ return 0;
387
+ }
388
+ return this.simpleBlocks.length / expectedPartCount;
389
+ }
390
+ getDecodedData() {
391
+ if (!this.isSuccessful()) {
392
+ console.log('Fountain decoding was not successful');
393
+ return undefined;
394
+ }
395
+ return cborEncoder.decode(this.resultRaw);
396
+ }
397
+ getError() {
398
+ return this.error;
399
+ }
400
+ }
401
+ /**
402
+ * Parse CBOR encoded Multipart Payload
403
+ * @param encodeded
404
+ * @returns
405
+ */
406
+ export function parseMultipartCbor(encodeded) {
407
+ const decoded = cborEncoder.decode(encodeded);
408
+ return validateDecodedMultipart(decoded);
409
+ }
410
+ /**
411
+ * Validate and convert the decoded multipart payload to MultipartPayload object
412
+ * @param decoded
413
+ * @returns
414
+ */
415
+ export function validateDecodedMultipart(decoded) {
416
+ const [seqNum, seqLength, messageLength, checksum, fragment] = decoded;
417
+ if (!validateMultipartPayload({ seqNum, seqLength, messageLength, checksum, fragment })) {
418
+ throw new Error("Invalid multipart payload");
419
+ }
420
+ return { seqNum, seqLength, messageLength, checksum, fragment };
421
+ }
422
+ function validateMultipartPayload(decoded) {
423
+ if (typeof decoded.seqNum !== "number" ||
424
+ typeof decoded.seqLength !== "number" ||
425
+ typeof decoded.messageLength !== "number" ||
426
+ typeof decoded.checksum !== "number" ||
427
+ !isUint8Array(decoded.fragment) ||
428
+ decoded.fragment.length === 0) {
429
+ return false;
430
+ }
431
+ return true;
432
+ }
433
+ /**
434
+ * Join the fragments together.
435
+ * @param fragments fragments to join
436
+ * @param messageLength length of the expected message, full if not provided.
437
+ * @returns the concatenated fragments with the expected length.
438
+ */
439
+ function joinFragments(fragments, messageLength) {
440
+ let result = concatUint8Arrays(fragments);
441
+ if (messageLength) {
442
+ // with 'slice', we remove the additionally created buffer parts, needed to achieve the minimum fragment length.
443
+ result = result.slice(0, messageLength);
444
+ }
445
+ return result;
446
+ }
447
+ //# sourceMappingURL=FountainDecoder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FountainDecoder.js","sourceRoot":"","sources":["../../../src/classes/FountainDecoder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { findNominalFragmentLength } from "../helpers/fountainUtils.js";
2
+ /** [seqNum, seqLength, messageLength, checksum, fragment] */
3
+ export type IMultipartUrPayload = [number, number, number, number, Uint8Array];
4
+ /**
5
+ * Encode data on the fly. This encoder uses an internal state to keep generating ur fragments of the payload.
6
+ */
7
+ export declare class FountainEncoder {
8
+ fragmentLenghtFinder: typeof findNominalFragmentLength;
9
+ /** Total data size of the input message */
10
+ _messageLength: number;
11
+ /** Maximum data size in the fragment */
12
+ protected _maxFragmentLength: number;
13
+ /** Minumum data size in the fragment */
14
+ protected _minFragmentLength: number;
15
+ /** Calculated data size in the fragment */
16
+ _nominalFragmentLength: number;
17
+ /** Array of pure fragments (without any fountain encoded) */
18
+ _pureFragments: Uint8Array[];
19
+ /** Current index of the fragment start from 1 */
20
+ protected _seqNum: number;
21
+ /** Checksum of the original data */
22
+ protected _checksum: number;
23
+ /** Original Input data as UR */
24
+ protected _input: Uint8Array;
25
+ constructor(input: Uint8Array, maxFragmentLength?: number, minFragmentLength?: number, firstSeqNum?: number);
26
+ setFragmentLengthFinder(fn: typeof findNominalFragmentLength): void;
27
+ /**
28
+ * Return all the fragments based on the fountain ratio at once as an array of Uint8Arrays.
29
+ * @param fountainRatio The ratio of the fountain fragments to the pure fragments. Default is 0.
30
+ * @returns
31
+ */
32
+ getAllParts(fountainRatio?: number): Uint8Array[];
33
+ protected encodeFragment(seqNum: number, fragment: Uint8Array): Uint8Array;
34
+ /**
35
+ * Reset the state of the encoder to start generating fragments from the beginning.
36
+ */
37
+ reset(): void;
38
+ /**
39
+ * Checks if all the pure fragments (full payload data) for this ur is generated.
40
+ * @returns boolean indicating if generated fragments have included all the data.
41
+ */
42
+ isComplete(): boolean;
43
+ /**
44
+ * Checks if there is only one fragment generated for the ur.
45
+ * @returns boolean if the ur payload is contained in one fragment.
46
+ */
47
+ isSinglePart(): boolean;
48
+ /**
49
+ * Gets the count of the "pure" fragments. These are fragments where the data is not mixed.
50
+ * @returns The count of the "pure" fragments.
51
+ */
52
+ getPureFragmentCount(): number;
53
+ /**
54
+ * Get the pure fragments of the ur.
55
+ * @returns the pure fragments of the ur as an array of Uint8Arrays.
56
+ */
57
+ getPureFragments(): Uint8Array[];
58
+ /**
59
+ * Give the 'next' fragment for the ur for which the fountainEncoder was created.
60
+ * @returns the 'next' fragment, represented as a Ur multipart string.
61
+ */
62
+ nextPart(): Uint8Array;
63
+ }