@fgv/ts-web-extras 5.1.0-18 → 5.1.0-19
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/.rush/temp/{680645452ebdb4d7f294f08d3b45f143d69c3f5d.tar.log → 42a7a953924ae898114e7b6231a2408228d92433.tar.log} +8 -2
- package/.rush/temp/chunked-rush-logs/ts-web-extras.build.chunks.jsonl +19 -17
- package/.rush/temp/operation/build/all.log +19 -17
- package/.rush/temp/operation/build/log-chunks.jsonl +19 -17
- package/.rush/temp/operation/build/state.json +1 -1
- package/dist/packlets/crypto-utils/browserCryptoProvider.js +118 -1
- package/dist/packlets/crypto-utils/browserCryptoProvider.js.map +1 -1
- package/dist/test/unit/browserCryptoProvider.wrapBytes.test.js +221 -0
- package/dist/test/unit/browserCryptoProvider.wrapBytes.test.js.map +1 -0
- package/dist/ts-web-extras.d.ts +19 -0
- package/docs/CryptoUtils/classes/BrowserCryptoProvider.md +28 -0
- package/docs/CryptoUtils/classes/BrowserCryptoProvider.unwrapBytes.md +27 -0
- package/docs/CryptoUtils/classes/BrowserCryptoProvider.wrapBytes.md +28 -0
- package/docs/classes/BrowserCryptoProvider.md +28 -0
- package/docs/classes/BrowserCryptoProvider.unwrapBytes.md +27 -0
- package/docs/classes/BrowserCryptoProvider.wrapBytes.md +28 -0
- package/etc/ts-web-extras.api.md +5 -0
- package/lib/packlets/crypto-utils/browserCryptoProvider.d.ts +19 -0
- package/lib/packlets/crypto-utils/browserCryptoProvider.d.ts.map +1 -1
- package/lib/packlets/crypto-utils/browserCryptoProvider.js +118 -1
- package/lib/packlets/crypto-utils/browserCryptoProvider.js.map +1 -1
- package/lib/test/unit/browserCryptoProvider.wrapBytes.test.d.ts +2 -0
- package/lib/test/unit/browserCryptoProvider.wrapBytes.test.d.ts.map +1 -0
- package/lib/test/unit/browserCryptoProvider.wrapBytes.test.js +223 -0
- package/lib/test/unit/browserCryptoProvider.wrapBytes.test.js.map +1 -0
- package/package.json +14 -14
- package/rush-logs/ts-web-extras.build.cache.log +1 -1
- package/rush-logs/ts-web-extras.build.log +19 -17
- package/src/packlets/crypto-utils/browserCryptoProvider.ts +168 -1
- package/src/test/unit/browserCryptoProvider.wrapBytes.test.ts +325 -0
- package/temp/build/typescript/ts_8nwakTlr.json +1 -1
- package/temp/coverage/crypto-utils/browserCryptoProvider.ts.html +508 -7
- package/temp/coverage/crypto-utils/browserHashProvider.ts.html +1 -1
- package/temp/coverage/crypto-utils/index.html +9 -9
- package/temp/coverage/file-tree/directoryHandleStore.ts.html +1 -1
- package/temp/coverage/file-tree/fileApiTreeAccessors.ts.html +1 -1
- package/temp/coverage/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
- package/temp/coverage/file-tree/httpTreeAccessors.ts.html +1 -1
- package/temp/coverage/file-tree/index.html +1 -1
- package/temp/coverage/file-tree/localStorageTreeAccessors.ts.html +1 -1
- package/temp/coverage/helpers/fileTreeHelpers.ts.html +1 -1
- package/temp/coverage/helpers/index.html +1 -1
- package/temp/coverage/index.html +10 -10
- package/temp/coverage/lcov-report/crypto-utils/browserCryptoProvider.ts.html +508 -7
- package/temp/coverage/lcov-report/crypto-utils/browserHashProvider.ts.html +1 -1
- package/temp/coverage/lcov-report/crypto-utils/index.html +9 -9
- package/temp/coverage/lcov-report/file-tree/directoryHandleStore.ts.html +1 -1
- package/temp/coverage/lcov-report/file-tree/fileApiTreeAccessors.ts.html +1 -1
- package/temp/coverage/lcov-report/file-tree/fileSystemAccessTreeAccessors.ts.html +1 -1
- package/temp/coverage/lcov-report/file-tree/httpTreeAccessors.ts.html +1 -1
- package/temp/coverage/lcov-report/file-tree/index.html +1 -1
- package/temp/coverage/lcov-report/file-tree/localStorageTreeAccessors.ts.html +1 -1
- package/temp/coverage/lcov-report/helpers/fileTreeHelpers.ts.html +1 -1
- package/temp/coverage/lcov-report/helpers/index.html +1 -1
- package/temp/coverage/lcov-report/index.html +10 -10
- package/temp/coverage/lcov-report/url-utils/index.html +1 -1
- package/temp/coverage/lcov-report/url-utils/urlParams.ts.html +1 -1
- package/temp/coverage/lcov.info +236 -25
- package/temp/coverage/url-utils/index.html +1 -1
- package/temp/coverage/url-utils/urlParams.ts.html +1 -1
- package/temp/test/jest/haste-map-7492f1b44480e0cdd1f220078fb3afd8-c8dd6c3430605adeb2f1cadf4f75e791-8c9336785555d572065b28c111982ba4 +0 -0
- package/temp/test/jest/perf-cache-7492f1b44480e0cdd1f220078fb3afd8-da39a3ee5e6b4b0d3255bfef95601890 +1 -1
- package/temp/ts-web-extras.api.json +212 -0
- package/temp/ts-web-extras.api.md +5 -0
|
@@ -25,28 +25,28 @@
|
|
|
25
25
|
<div class='fl pad1y space-right2'>
|
|
26
26
|
<span class="strong">100% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>553/553</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
33
|
<span class="strong">100% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>
|
|
35
|
+
<span class='fraction'>36/36</span>
|
|
36
36
|
</div>
|
|
37
37
|
|
|
38
38
|
|
|
39
39
|
<div class='fl pad1y space-right2'>
|
|
40
40
|
<span class="strong">100% </span>
|
|
41
41
|
<span class="quiet">Functions</span>
|
|
42
|
-
<span class='fraction'>
|
|
42
|
+
<span class='fraction'>18/18</span>
|
|
43
43
|
</div>
|
|
44
44
|
|
|
45
45
|
|
|
46
46
|
<div class='fl pad1y space-right2'>
|
|
47
47
|
<span class="strong">100% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>553/553</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -449,7 +449,174 @@
|
|
|
449
449
|
<a name='L384'></a><a href='#L384'>384</a>
|
|
450
450
|
<a name='L385'></a><a href='#L385'>385</a>
|
|
451
451
|
<a name='L386'></a><a href='#L386'>386</a>
|
|
452
|
-
<a name='L387'></a><a href='#L387'>387</a
|
|
452
|
+
<a name='L387'></a><a href='#L387'>387</a>
|
|
453
|
+
<a name='L388'></a><a href='#L388'>388</a>
|
|
454
|
+
<a name='L389'></a><a href='#L389'>389</a>
|
|
455
|
+
<a name='L390'></a><a href='#L390'>390</a>
|
|
456
|
+
<a name='L391'></a><a href='#L391'>391</a>
|
|
457
|
+
<a name='L392'></a><a href='#L392'>392</a>
|
|
458
|
+
<a name='L393'></a><a href='#L393'>393</a>
|
|
459
|
+
<a name='L394'></a><a href='#L394'>394</a>
|
|
460
|
+
<a name='L395'></a><a href='#L395'>395</a>
|
|
461
|
+
<a name='L396'></a><a href='#L396'>396</a>
|
|
462
|
+
<a name='L397'></a><a href='#L397'>397</a>
|
|
463
|
+
<a name='L398'></a><a href='#L398'>398</a>
|
|
464
|
+
<a name='L399'></a><a href='#L399'>399</a>
|
|
465
|
+
<a name='L400'></a><a href='#L400'>400</a>
|
|
466
|
+
<a name='L401'></a><a href='#L401'>401</a>
|
|
467
|
+
<a name='L402'></a><a href='#L402'>402</a>
|
|
468
|
+
<a name='L403'></a><a href='#L403'>403</a>
|
|
469
|
+
<a name='L404'></a><a href='#L404'>404</a>
|
|
470
|
+
<a name='L405'></a><a href='#L405'>405</a>
|
|
471
|
+
<a name='L406'></a><a href='#L406'>406</a>
|
|
472
|
+
<a name='L407'></a><a href='#L407'>407</a>
|
|
473
|
+
<a name='L408'></a><a href='#L408'>408</a>
|
|
474
|
+
<a name='L409'></a><a href='#L409'>409</a>
|
|
475
|
+
<a name='L410'></a><a href='#L410'>410</a>
|
|
476
|
+
<a name='L411'></a><a href='#L411'>411</a>
|
|
477
|
+
<a name='L412'></a><a href='#L412'>412</a>
|
|
478
|
+
<a name='L413'></a><a href='#L413'>413</a>
|
|
479
|
+
<a name='L414'></a><a href='#L414'>414</a>
|
|
480
|
+
<a name='L415'></a><a href='#L415'>415</a>
|
|
481
|
+
<a name='L416'></a><a href='#L416'>416</a>
|
|
482
|
+
<a name='L417'></a><a href='#L417'>417</a>
|
|
483
|
+
<a name='L418'></a><a href='#L418'>418</a>
|
|
484
|
+
<a name='L419'></a><a href='#L419'>419</a>
|
|
485
|
+
<a name='L420'></a><a href='#L420'>420</a>
|
|
486
|
+
<a name='L421'></a><a href='#L421'>421</a>
|
|
487
|
+
<a name='L422'></a><a href='#L422'>422</a>
|
|
488
|
+
<a name='L423'></a><a href='#L423'>423</a>
|
|
489
|
+
<a name='L424'></a><a href='#L424'>424</a>
|
|
490
|
+
<a name='L425'></a><a href='#L425'>425</a>
|
|
491
|
+
<a name='L426'></a><a href='#L426'>426</a>
|
|
492
|
+
<a name='L427'></a><a href='#L427'>427</a>
|
|
493
|
+
<a name='L428'></a><a href='#L428'>428</a>
|
|
494
|
+
<a name='L429'></a><a href='#L429'>429</a>
|
|
495
|
+
<a name='L430'></a><a href='#L430'>430</a>
|
|
496
|
+
<a name='L431'></a><a href='#L431'>431</a>
|
|
497
|
+
<a name='L432'></a><a href='#L432'>432</a>
|
|
498
|
+
<a name='L433'></a><a href='#L433'>433</a>
|
|
499
|
+
<a name='L434'></a><a href='#L434'>434</a>
|
|
500
|
+
<a name='L435'></a><a href='#L435'>435</a>
|
|
501
|
+
<a name='L436'></a><a href='#L436'>436</a>
|
|
502
|
+
<a name='L437'></a><a href='#L437'>437</a>
|
|
503
|
+
<a name='L438'></a><a href='#L438'>438</a>
|
|
504
|
+
<a name='L439'></a><a href='#L439'>439</a>
|
|
505
|
+
<a name='L440'></a><a href='#L440'>440</a>
|
|
506
|
+
<a name='L441'></a><a href='#L441'>441</a>
|
|
507
|
+
<a name='L442'></a><a href='#L442'>442</a>
|
|
508
|
+
<a name='L443'></a><a href='#L443'>443</a>
|
|
509
|
+
<a name='L444'></a><a href='#L444'>444</a>
|
|
510
|
+
<a name='L445'></a><a href='#L445'>445</a>
|
|
511
|
+
<a name='L446'></a><a href='#L446'>446</a>
|
|
512
|
+
<a name='L447'></a><a href='#L447'>447</a>
|
|
513
|
+
<a name='L448'></a><a href='#L448'>448</a>
|
|
514
|
+
<a name='L449'></a><a href='#L449'>449</a>
|
|
515
|
+
<a name='L450'></a><a href='#L450'>450</a>
|
|
516
|
+
<a name='L451'></a><a href='#L451'>451</a>
|
|
517
|
+
<a name='L452'></a><a href='#L452'>452</a>
|
|
518
|
+
<a name='L453'></a><a href='#L453'>453</a>
|
|
519
|
+
<a name='L454'></a><a href='#L454'>454</a>
|
|
520
|
+
<a name='L455'></a><a href='#L455'>455</a>
|
|
521
|
+
<a name='L456'></a><a href='#L456'>456</a>
|
|
522
|
+
<a name='L457'></a><a href='#L457'>457</a>
|
|
523
|
+
<a name='L458'></a><a href='#L458'>458</a>
|
|
524
|
+
<a name='L459'></a><a href='#L459'>459</a>
|
|
525
|
+
<a name='L460'></a><a href='#L460'>460</a>
|
|
526
|
+
<a name='L461'></a><a href='#L461'>461</a>
|
|
527
|
+
<a name='L462'></a><a href='#L462'>462</a>
|
|
528
|
+
<a name='L463'></a><a href='#L463'>463</a>
|
|
529
|
+
<a name='L464'></a><a href='#L464'>464</a>
|
|
530
|
+
<a name='L465'></a><a href='#L465'>465</a>
|
|
531
|
+
<a name='L466'></a><a href='#L466'>466</a>
|
|
532
|
+
<a name='L467'></a><a href='#L467'>467</a>
|
|
533
|
+
<a name='L468'></a><a href='#L468'>468</a>
|
|
534
|
+
<a name='L469'></a><a href='#L469'>469</a>
|
|
535
|
+
<a name='L470'></a><a href='#L470'>470</a>
|
|
536
|
+
<a name='L471'></a><a href='#L471'>471</a>
|
|
537
|
+
<a name='L472'></a><a href='#L472'>472</a>
|
|
538
|
+
<a name='L473'></a><a href='#L473'>473</a>
|
|
539
|
+
<a name='L474'></a><a href='#L474'>474</a>
|
|
540
|
+
<a name='L475'></a><a href='#L475'>475</a>
|
|
541
|
+
<a name='L476'></a><a href='#L476'>476</a>
|
|
542
|
+
<a name='L477'></a><a href='#L477'>477</a>
|
|
543
|
+
<a name='L478'></a><a href='#L478'>478</a>
|
|
544
|
+
<a name='L479'></a><a href='#L479'>479</a>
|
|
545
|
+
<a name='L480'></a><a href='#L480'>480</a>
|
|
546
|
+
<a name='L481'></a><a href='#L481'>481</a>
|
|
547
|
+
<a name='L482'></a><a href='#L482'>482</a>
|
|
548
|
+
<a name='L483'></a><a href='#L483'>483</a>
|
|
549
|
+
<a name='L484'></a><a href='#L484'>484</a>
|
|
550
|
+
<a name='L485'></a><a href='#L485'>485</a>
|
|
551
|
+
<a name='L486'></a><a href='#L486'>486</a>
|
|
552
|
+
<a name='L487'></a><a href='#L487'>487</a>
|
|
553
|
+
<a name='L488'></a><a href='#L488'>488</a>
|
|
554
|
+
<a name='L489'></a><a href='#L489'>489</a>
|
|
555
|
+
<a name='L490'></a><a href='#L490'>490</a>
|
|
556
|
+
<a name='L491'></a><a href='#L491'>491</a>
|
|
557
|
+
<a name='L492'></a><a href='#L492'>492</a>
|
|
558
|
+
<a name='L493'></a><a href='#L493'>493</a>
|
|
559
|
+
<a name='L494'></a><a href='#L494'>494</a>
|
|
560
|
+
<a name='L495'></a><a href='#L495'>495</a>
|
|
561
|
+
<a name='L496'></a><a href='#L496'>496</a>
|
|
562
|
+
<a name='L497'></a><a href='#L497'>497</a>
|
|
563
|
+
<a name='L498'></a><a href='#L498'>498</a>
|
|
564
|
+
<a name='L499'></a><a href='#L499'>499</a>
|
|
565
|
+
<a name='L500'></a><a href='#L500'>500</a>
|
|
566
|
+
<a name='L501'></a><a href='#L501'>501</a>
|
|
567
|
+
<a name='L502'></a><a href='#L502'>502</a>
|
|
568
|
+
<a name='L503'></a><a href='#L503'>503</a>
|
|
569
|
+
<a name='L504'></a><a href='#L504'>504</a>
|
|
570
|
+
<a name='L505'></a><a href='#L505'>505</a>
|
|
571
|
+
<a name='L506'></a><a href='#L506'>506</a>
|
|
572
|
+
<a name='L507'></a><a href='#L507'>507</a>
|
|
573
|
+
<a name='L508'></a><a href='#L508'>508</a>
|
|
574
|
+
<a name='L509'></a><a href='#L509'>509</a>
|
|
575
|
+
<a name='L510'></a><a href='#L510'>510</a>
|
|
576
|
+
<a name='L511'></a><a href='#L511'>511</a>
|
|
577
|
+
<a name='L512'></a><a href='#L512'>512</a>
|
|
578
|
+
<a name='L513'></a><a href='#L513'>513</a>
|
|
579
|
+
<a name='L514'></a><a href='#L514'>514</a>
|
|
580
|
+
<a name='L515'></a><a href='#L515'>515</a>
|
|
581
|
+
<a name='L516'></a><a href='#L516'>516</a>
|
|
582
|
+
<a name='L517'></a><a href='#L517'>517</a>
|
|
583
|
+
<a name='L518'></a><a href='#L518'>518</a>
|
|
584
|
+
<a name='L519'></a><a href='#L519'>519</a>
|
|
585
|
+
<a name='L520'></a><a href='#L520'>520</a>
|
|
586
|
+
<a name='L521'></a><a href='#L521'>521</a>
|
|
587
|
+
<a name='L522'></a><a href='#L522'>522</a>
|
|
588
|
+
<a name='L523'></a><a href='#L523'>523</a>
|
|
589
|
+
<a name='L524'></a><a href='#L524'>524</a>
|
|
590
|
+
<a name='L525'></a><a href='#L525'>525</a>
|
|
591
|
+
<a name='L526'></a><a href='#L526'>526</a>
|
|
592
|
+
<a name='L527'></a><a href='#L527'>527</a>
|
|
593
|
+
<a name='L528'></a><a href='#L528'>528</a>
|
|
594
|
+
<a name='L529'></a><a href='#L529'>529</a>
|
|
595
|
+
<a name='L530'></a><a href='#L530'>530</a>
|
|
596
|
+
<a name='L531'></a><a href='#L531'>531</a>
|
|
597
|
+
<a name='L532'></a><a href='#L532'>532</a>
|
|
598
|
+
<a name='L533'></a><a href='#L533'>533</a>
|
|
599
|
+
<a name='L534'></a><a href='#L534'>534</a>
|
|
600
|
+
<a name='L535'></a><a href='#L535'>535</a>
|
|
601
|
+
<a name='L536'></a><a href='#L536'>536</a>
|
|
602
|
+
<a name='L537'></a><a href='#L537'>537</a>
|
|
603
|
+
<a name='L538'></a><a href='#L538'>538</a>
|
|
604
|
+
<a name='L539'></a><a href='#L539'>539</a>
|
|
605
|
+
<a name='L540'></a><a href='#L540'>540</a>
|
|
606
|
+
<a name='L541'></a><a href='#L541'>541</a>
|
|
607
|
+
<a name='L542'></a><a href='#L542'>542</a>
|
|
608
|
+
<a name='L543'></a><a href='#L543'>543</a>
|
|
609
|
+
<a name='L544'></a><a href='#L544'>544</a>
|
|
610
|
+
<a name='L545'></a><a href='#L545'>545</a>
|
|
611
|
+
<a name='L546'></a><a href='#L546'>546</a>
|
|
612
|
+
<a name='L547'></a><a href='#L547'>547</a>
|
|
613
|
+
<a name='L548'></a><a href='#L548'>548</a>
|
|
614
|
+
<a name='L549'></a><a href='#L549'>549</a>
|
|
615
|
+
<a name='L550'></a><a href='#L550'>550</a>
|
|
616
|
+
<a name='L551'></a><a href='#L551'>551</a>
|
|
617
|
+
<a name='L552'></a><a href='#L552'>552</a>
|
|
618
|
+
<a name='L553'></a><a href='#L553'>553</a>
|
|
619
|
+
<a name='L554'></a><a href='#L554'>554</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
453
620
|
<span class="cline-any cline-yes">1x</span>
|
|
454
621
|
<span class="cline-any cline-yes">1x</span>
|
|
455
622
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -497,6 +664,12 @@
|
|
|
497
664
|
<span class="cline-any cline-yes">1x</span>
|
|
498
665
|
<span class="cline-any cline-yes">1x</span>
|
|
499
666
|
<span class="cline-any cline-yes">1x</span>
|
|
667
|
+
<span class="cline-any cline-yes">124x</span>
|
|
668
|
+
<span class="cline-any cline-yes">124x</span>
|
|
669
|
+
<span class="cline-any cline-yes">124x</span>
|
|
670
|
+
<span class="cline-any cline-yes">124x</span>
|
|
671
|
+
<span class="cline-any cline-yes">124x</span>
|
|
672
|
+
<span class="cline-any cline-yes">124x</span>
|
|
500
673
|
<span class="cline-any cline-yes">1x</span>
|
|
501
674
|
<span class="cline-any cline-yes">1x</span>
|
|
502
675
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -835,6 +1008,167 @@
|
|
|
835
1008
|
<span class="cline-any cline-yes">1x</span>
|
|
836
1009
|
<span class="cline-any cline-yes">1x</span>
|
|
837
1010
|
<span class="cline-any cline-yes">1x</span>
|
|
1011
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1012
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1013
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1014
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1015
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1016
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1017
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1018
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1019
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1020
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1021
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1022
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1023
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1024
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1025
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1026
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1027
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1028
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1029
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1030
|
+
<span class="cline-any cline-yes">28x</span>
|
|
1031
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1032
|
+
<span class="cline-any cline-yes">4x</span>
|
|
1033
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1034
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1035
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1036
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1037
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1038
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1039
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1040
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1041
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1042
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1043
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1044
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1045
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1046
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1047
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1048
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1049
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1050
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1051
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1052
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1053
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1054
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1055
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1056
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1057
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1058
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1059
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1060
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1061
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1062
|
+
<span class="cline-any cline-yes">24x</span>
|
|
1063
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1064
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1065
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1066
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1067
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1068
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1069
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1070
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1071
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1072
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1073
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1074
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1075
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1076
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1077
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1078
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1079
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1080
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1081
|
+
<span class="cline-any cline-yes">19x</span>
|
|
1082
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1083
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1084
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1085
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1086
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1087
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1088
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1089
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1090
|
+
<span class="cline-any cline-yes">17x</span>
|
|
1091
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1092
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1093
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1094
|
+
<span class="cline-any cline-yes">21x</span>
|
|
1095
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1096
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1097
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1098
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1099
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1100
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1101
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1102
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1103
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1104
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1105
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1106
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1107
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1108
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1109
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1110
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1111
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1112
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1113
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1114
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1115
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1116
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1117
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1118
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1119
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1120
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1121
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1122
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1123
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1124
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1125
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1126
|
+
<span class="cline-any cline-yes">13x</span>
|
|
1127
|
+
<span class="cline-any cline-yes">6x</span>
|
|
1128
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1129
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1130
|
+
<span class="cline-any cline-yes">15x</span>
|
|
1131
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1132
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1133
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1134
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1135
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1136
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1137
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1138
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1139
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1140
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1141
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1142
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1143
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1144
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1145
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1146
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1147
|
+
<span class="cline-any cline-yes">49x</span>
|
|
1148
|
+
<span class="cline-any cline-yes">49x</span>
|
|
1149
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1150
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1151
|
+
<span class="cline-any cline-yes">47x</span>
|
|
1152
|
+
<span class="cline-any cline-yes">49x</span>
|
|
1153
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1154
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1155
|
+
<span class="cline-any cline-yes">49x</span>
|
|
1156
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1157
|
+
<span class="cline-any cline-yes">2x</span>
|
|
1158
|
+
<span class="cline-any cline-yes">43x</span>
|
|
1159
|
+
<span class="cline-any cline-yes">43x</span>
|
|
1160
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1161
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1162
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1163
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1164
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1165
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1166
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1167
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1168
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1169
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1170
|
+
<span class="cline-any cline-yes">1x</span>
|
|
1171
|
+
<span class="cline-any cline-yes">1x</span>
|
|
838
1172
|
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">// Copyright (c) 2024 Erik Fortune
|
|
839
1173
|
//
|
|
840
1174
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
@@ -855,10 +1189,10 @@
|
|
|
855
1189
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
856
1190
|
// SOFTWARE.
|
|
857
1191
|
|
|
858
|
-
/* c8 ignore start - Browser-only implementation cannot be tested in Node.js environment */
|
|
859
1192
|
import { captureAsyncResult, captureResult, fail, Failure, Result, succeed, Success } from '@fgv/ts-utils';
|
|
860
1193
|
import { CryptoUtils } from '@fgv/ts-extras';
|
|
861
1194
|
|
|
1195
|
+
/* c8 ignore start - Used only by browser-only methods that cannot be tested in Node.js environment */
|
|
862
1196
|
/**
|
|
863
1197
|
* Extracts an `ArrayBuffer` from a Uint8Array, handling the potential SharedArrayBuffer case.
|
|
864
1198
|
* @param arr - The Uint8Array to extract from
|
|
@@ -870,6 +1204,25 @@ function toArrayBuffer(arr: Uint8Array): ArrayBuffer {
|
|
|
870
1204
|
new Uint8Array(buffer).set(arr);
|
|
871
1205
|
return buffer;
|
|
872
1206
|
}
|
|
1207
|
+
/* c8 ignore stop */
|
|
1208
|
+
|
|
1209
|
+
/**
|
|
1210
|
+
* Returns a fresh Uint8Array view over a non-shared ArrayBuffer copy of `arr`.
|
|
1211
|
+
* Used by {@link BrowserCryptoProvider.wrapBytes | wrapBytes} and
|
|
1212
|
+
* {@link BrowserCryptoProvider.unwrapBytes | unwrapBytes}: Node 20's
|
|
1213
|
+
* webcrypto.subtle rejects raw `ArrayBuffer` for several `BufferSource`
|
|
1214
|
+
* parameters with "is not instance of ArrayBuffer, Buffer, TypedArray, or
|
|
1215
|
+
* DataView" even though `ArrayBuffer` should be valid per the spec; a
|
|
1216
|
+
* TypedArray view is accepted on Node 20+ and on browsers, and the explicit
|
|
1217
|
+
* `Uint8Array<ArrayBuffer>` return type also satisfies TypeScript's `BufferSource`
|
|
1218
|
+
* (which excludes the `SharedArrayBuffer` branch of `Uint8Array`'s buffer type).
|
|
1219
|
+
*/
|
|
1220
|
+
function toBufferView(arr: Uint8Array): Uint8Array<ArrayBuffer> {
|
|
1221
|
+
const buffer = new ArrayBuffer(arr.byteLength);
|
|
1222
|
+
const view = new Uint8Array(buffer);
|
|
1223
|
+
view.set(arr);
|
|
1224
|
+
return view;
|
|
1225
|
+
}
|
|
873
1226
|
|
|
874
1227
|
/**
|
|
875
1228
|
* Browser implementation of `ICryptoProvider` using the Web Crypto API.
|
|
@@ -883,6 +1236,7 @@ function toArrayBuffer(arr: Uint8Array): ArrayBuffer {
|
|
|
883
1236
|
export class BrowserCryptoProvider implements CryptoUtils.ICryptoProvider {
|
|
884
1237
|
private readonly _crypto: Crypto;
|
|
885
1238
|
|
|
1239
|
+
/* c8 ignore start - Existing browser-only methods cannot be tested in Node.js environment */
|
|
886
1240
|
/**
|
|
887
1241
|
* Creates a new {@link CryptoUtils.BrowserCryptoProvider | BrowserCryptoProvider}.
|
|
888
1242
|
* @param cryptoApi - Optional Crypto instance (defaults to globalThis.crypto)
|
|
@@ -1209,8 +1563,155 @@ export class BrowserCryptoProvider implements CryptoUtils.ICryptoProvider {
|
|
|
1209
1563
|
);
|
|
1210
1564
|
return result.withErrorFormat((e) => `Failed to import ${algorithm} public key from JWK: ${e}`);
|
|
1211
1565
|
}
|
|
1566
|
+
/* c8 ignore stop */
|
|
1567
|
+
|
|
1568
|
+
/**
|
|
1569
|
+
* Wraps `plaintext` for the holder of `recipientPublicKey` using
|
|
1570
|
+
* ECIES (ECDH P-256 + HKDF-SHA256 + AES-GCM-256). See
|
|
1571
|
+
* {@link CryptoUtils.ICryptoProvider.wrapBytes | ICryptoProvider.wrapBytes}.
|
|
1572
|
+
* @param plaintext - The bytes to wrap.
|
|
1573
|
+
* @param recipientPublicKey - The recipient's ECDH P-256 public `CryptoKey`.
|
|
1574
|
+
* @param options - HKDF salt and info; see {@link CryptoUtils.IWrapBytesOptions | IWrapBytesOptions}.
|
|
1575
|
+
* @returns `Success` with the wrapped payload, or `Failure` with an error.
|
|
1576
|
+
*/
|
|
1577
|
+
public async wrapBytes(
|
|
1578
|
+
plaintext: Uint8Array,
|
|
1579
|
+
recipientPublicKey: CryptoKey,
|
|
1580
|
+
options: CryptoUtils.IWrapBytesOptions
|
|
1581
|
+
): Promise<Result<CryptoUtils.IWrappedBytes>> {
|
|
1582
|
+
const recipientCheck = checkEcdhP256(recipientPublicKey, 'public', 'recipient public key');
|
|
1583
|
+
if (recipientCheck.isFailure()) {
|
|
1584
|
+
return Failure.with(`wrapBytes failed: ${recipientCheck.message}`);
|
|
1585
|
+
}
|
|
1586
|
+
const subtle = this._crypto.subtle;
|
|
1587
|
+
const result = await captureAsyncResult(async () => {
|
|
1588
|
+
const ephemeral = (await subtle.generateKey({ name: 'ECDH', namedCurve: 'P-256' }, true, [
|
|
1589
|
+
'deriveKey'
|
|
1590
|
+
])) as CryptoKeyPair;
|
|
1591
|
+
const hkdfBase = await subtle.deriveKey(
|
|
1592
|
+
{ name: 'ECDH', public: recipientPublicKey },
|
|
1593
|
+
ephemeral.privateKey,
|
|
1594
|
+
{ name: 'HKDF' },
|
|
1595
|
+
false,
|
|
1596
|
+
['deriveKey']
|
|
1597
|
+
);
|
|
1598
|
+
const wrapKey = await subtle.deriveKey(
|
|
1599
|
+
{ name: 'HKDF', salt: toBufferView(options.salt), info: toBufferView(options.info), hash: 'SHA-256' },
|
|
1600
|
+
hkdfBase,
|
|
1601
|
+
{ name: 'AES-GCM', length: 256 },
|
|
1602
|
+
false,
|
|
1603
|
+
['encrypt']
|
|
1604
|
+
);
|
|
1605
|
+
const nonce = this._crypto.getRandomValues(new Uint8Array(CryptoUtils.Constants.GCM_IV_SIZE));
|
|
1606
|
+
const ctBuf = await subtle.encrypt({ name: 'AES-GCM', iv: nonce }, wrapKey, toBufferView(plaintext));
|
|
1607
|
+
const ephemeralPublicKey = await subtle.exportKey('jwk', ephemeral.publicKey);
|
|
1608
|
+
return {
|
|
1609
|
+
ephemeralPublicKey,
|
|
1610
|
+
nonce: this.toBase64(nonce),
|
|
1611
|
+
ciphertext: this.toBase64(new Uint8Array(ctBuf))
|
|
1612
|
+
};
|
|
1613
|
+
});
|
|
1614
|
+
return result.withErrorFormat((e) => `wrapBytes failed: ${e}`);
|
|
1615
|
+
}
|
|
1616
|
+
|
|
1617
|
+
/**
|
|
1618
|
+
* Unwraps a payload produced by `wrapBytes` using the recipient's private
|
|
1619
|
+
* key. See {@link CryptoUtils.ICryptoProvider.unwrapBytes | ICryptoProvider.unwrapBytes}.
|
|
1620
|
+
* @param wrapped - The wrapped payload.
|
|
1621
|
+
* @param recipientPrivateKey - The recipient's ECDH P-256 private `CryptoKey`.
|
|
1622
|
+
* @param options - HKDF salt and info matching the wrap call.
|
|
1623
|
+
* @returns `Success` with the original `plaintext`, or `Failure` with an error.
|
|
1624
|
+
*/
|
|
1625
|
+
public async unwrapBytes(
|
|
1626
|
+
wrapped: CryptoUtils.IWrappedBytes,
|
|
1627
|
+
recipientPrivateKey: CryptoKey,
|
|
1628
|
+
options: CryptoUtils.IWrapBytesOptions
|
|
1629
|
+
): Promise<Result<Uint8Array>> {
|
|
1630
|
+
const recipientCheck = checkEcdhP256(recipientPrivateKey, 'private', 'recipient private key');
|
|
1631
|
+
if (recipientCheck.isFailure()) {
|
|
1632
|
+
return Failure.with(`unwrapBytes failed: ${recipientCheck.message}`);
|
|
1633
|
+
}
|
|
1634
|
+
const nonceResult = this.fromBase64(wrapped.nonce);
|
|
1635
|
+
if (nonceResult.isFailure()) {
|
|
1636
|
+
return Failure.with(`unwrapBytes failed: nonce: ${nonceResult.message}`);
|
|
1637
|
+
}
|
|
1638
|
+
if (nonceResult.value.length !== CryptoUtils.Constants.GCM_IV_SIZE) {
|
|
1639
|
+
return Failure.with(
|
|
1640
|
+
`unwrapBytes failed: nonce must be ${CryptoUtils.Constants.GCM_IV_SIZE} bytes (got ${nonceResult.value.length})`
|
|
1641
|
+
);
|
|
1642
|
+
}
|
|
1643
|
+
const ciphertextResult = this.fromBase64(wrapped.ciphertext);
|
|
1644
|
+
if (ciphertextResult.isFailure()) {
|
|
1645
|
+
return Failure.with(`unwrapBytes failed: ciphertext: ${ciphertextResult.message}`);
|
|
1646
|
+
}
|
|
1647
|
+
if (ciphertextResult.value.length < CryptoUtils.Constants.GCM_AUTH_TAG_SIZE) {
|
|
1648
|
+
return Failure.with(
|
|
1649
|
+
`unwrapBytes failed: ciphertext must be at least ${CryptoUtils.Constants.GCM_AUTH_TAG_SIZE} bytes (got ${ciphertextResult.value.length})`
|
|
1650
|
+
);
|
|
1651
|
+
}
|
|
1652
|
+
const subtle = this._crypto.subtle;
|
|
1653
|
+
const result = await captureAsyncResult(async () => {
|
|
1654
|
+
const ephemeralPub = await subtle.importKey(
|
|
1655
|
+
'jwk',
|
|
1656
|
+
wrapped.ephemeralPublicKey,
|
|
1657
|
+
{ name: 'ECDH', namedCurve: 'P-256' },
|
|
1658
|
+
false,
|
|
1659
|
+
[]
|
|
1660
|
+
);
|
|
1661
|
+
const hkdfBase = await subtle.deriveKey(
|
|
1662
|
+
{ name: 'ECDH', public: ephemeralPub },
|
|
1663
|
+
recipientPrivateKey,
|
|
1664
|
+
{ name: 'HKDF' },
|
|
1665
|
+
false,
|
|
1666
|
+
['deriveKey']
|
|
1667
|
+
);
|
|
1668
|
+
const wrapKey = await subtle.deriveKey(
|
|
1669
|
+
{ name: 'HKDF', salt: toBufferView(options.salt), info: toBufferView(options.info), hash: 'SHA-256' },
|
|
1670
|
+
hkdfBase,
|
|
1671
|
+
{ name: 'AES-GCM', length: 256 },
|
|
1672
|
+
false,
|
|
1673
|
+
['decrypt']
|
|
1674
|
+
);
|
|
1675
|
+
const ptBuf = await subtle.decrypt(
|
|
1676
|
+
{ name: 'AES-GCM', iv: toBufferView(nonceResult.value) },
|
|
1677
|
+
wrapKey,
|
|
1678
|
+
toBufferView(ciphertextResult.value)
|
|
1679
|
+
);
|
|
1680
|
+
return new Uint8Array(ptBuf);
|
|
1681
|
+
});
|
|
1682
|
+
return result.withErrorFormat((e) => `unwrapBytes failed: ${e}`);
|
|
1683
|
+
}
|
|
1684
|
+
}
|
|
1685
|
+
|
|
1686
|
+
/**
|
|
1687
|
+
* Verifies that `key` is an ECDH P-256 `CryptoKey` of the expected `keyType`
|
|
1688
|
+
* (public or private). Used by the wrap/unwrap methods to surface a clean
|
|
1689
|
+
* `Failure` instead of letting the WebCrypto deriveKey call throw a less
|
|
1690
|
+
* informative error later in the pipeline. Key usages are intentionally not
|
|
1691
|
+
* checked here: WebCrypto already produces a specific error if `deriveKey` is
|
|
1692
|
+
* not in `usages`, and `deriveBits` is an equally valid alternative usage that
|
|
1693
|
+
* an explicit check would have to track.
|
|
1694
|
+
* @param key - The CryptoKey to validate.
|
|
1695
|
+
* @param keyType - The required `key.type` ('public' for wrap, 'private' for unwrap).
|
|
1696
|
+
* @param label - Human-readable role label included in the failure message.
|
|
1697
|
+
* @returns `Success` with the key (unchanged) when the algorithm, curve, and
|
|
1698
|
+
* type all match; otherwise `Failure` with `<label> must be ECDH P-256 (...)`.
|
|
1699
|
+
*/
|
|
1700
|
+
function checkEcdhP256(key: CryptoKey, keyType: 'public' | 'private', label: string): Result<CryptoKey> {
|
|
1701
|
+
if (key.algorithm.name !== 'ECDH') {
|
|
1702
|
+
return Failure.with(`${label} must be ECDH P-256 (got algorithm '${key.algorithm.name}')`);
|
|
1703
|
+
}
|
|
1704
|
+
const namedCurve = (key.algorithm as EcKeyAlgorithm).namedCurve;
|
|
1705
|
+
if (namedCurve !== 'P-256') {
|
|
1706
|
+
return Failure.with(`${label} must be ECDH P-256 (got curve '${namedCurve}')`);
|
|
1707
|
+
}
|
|
1708
|
+
if (key.type !== keyType) {
|
|
1709
|
+
return Failure.with(`${label} must be a ${keyType} CryptoKey (got '${key.type}')`);
|
|
1710
|
+
}
|
|
1711
|
+
return succeed(key);
|
|
1212
1712
|
}
|
|
1213
1713
|
|
|
1714
|
+
/* c8 ignore start - Constructs a provider; only meaningful in a real browser environment */
|
|
1214
1715
|
/**
|
|
1215
1716
|
* Creates a {@link CryptoUtils.BrowserCryptoProvider | BrowserCryptoProvider} if Web
|
|
1216
1717
|
* Crypto API is available.
|
|
@@ -1228,7 +1729,7 @@ export function createBrowserCryptoProvider(): Result<BrowserCryptoProvider&g
|
|
|
1228
1729
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1229
1730
|
Code coverage generated by
|
|
1230
1731
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1231
|
-
at 2026-04-
|
|
1732
|
+
at 2026-04-27T19:21:09.128Z
|
|
1232
1733
|
</div>
|
|
1233
1734
|
<script src="../prettify.js"></script>
|
|
1234
1735
|
<script>
|
|
@@ -289,7 +289,7 @@ export class BrowserHashProvider {
|
|
|
289
289
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
290
290
|
Code coverage generated by
|
|
291
291
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
292
|
-
at 2026-04-
|
|
292
|
+
at 2026-04-27T19:21:09.128Z
|
|
293
293
|
</div>
|
|
294
294
|
<script src="../prettify.js"></script>
|
|
295
295
|
<script>
|