@meshconnect/uwc-core 0.10.1 → 1.0.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 (56) hide show
  1. package/README.md +928 -0
  2. package/dist/events.d.ts +71 -0
  3. package/dist/events.d.ts.map +1 -0
  4. package/dist/events.js +2 -0
  5. package/dist/events.js.map +1 -0
  6. package/dist/index.d.ts +2 -4
  7. package/dist/index.d.ts.map +1 -1
  8. package/dist/index.js +1 -3
  9. package/dist/index.js.map +1 -1
  10. package/dist/managers/event-manager.d.ts +22 -3
  11. package/dist/managers/event-manager.d.ts.map +1 -1
  12. package/dist/managers/event-manager.js +63 -7
  13. package/dist/managers/event-manager.js.map +1 -1
  14. package/dist/services/connection-service.d.ts +5 -2
  15. package/dist/services/connection-service.d.ts.map +1 -1
  16. package/dist/services/connection-service.js +36 -9
  17. package/dist/services/connection-service.js.map +1 -1
  18. package/dist/services/network-switch-service.d.ts +2 -1
  19. package/dist/services/network-switch-service.d.ts.map +1 -1
  20. package/dist/services/network-switch-service.js +15 -3
  21. package/dist/services/network-switch-service.js.map +1 -1
  22. package/dist/services/signature-service.d.ts +3 -1
  23. package/dist/services/signature-service.d.ts.map +1 -1
  24. package/dist/services/signature-service.js +10 -5
  25. package/dist/services/signature-service.js.map +1 -1
  26. package/dist/services/transaction-service.d.ts +3 -1
  27. package/dist/services/transaction-service.d.ts.map +1 -1
  28. package/dist/services/transaction-service.js +10 -5
  29. package/dist/services/transaction-service.js.map +1 -1
  30. package/dist/services/wallet-capabilities-service.d.ts +2 -1
  31. package/dist/services/wallet-capabilities-service.d.ts.map +1 -1
  32. package/dist/services/wallet-capabilities-service.js +9 -2
  33. package/dist/services/wallet-capabilities-service.js.map +1 -1
  34. package/dist/universal-wallet-connector.d.ts +56 -8
  35. package/dist/universal-wallet-connector.d.ts.map +1 -1
  36. package/dist/universal-wallet-connector.js +299 -194
  37. package/dist/universal-wallet-connector.js.map +1 -1
  38. package/dist/utils/abort.d.ts +14 -0
  39. package/dist/utils/abort.d.ts.map +1 -0
  40. package/dist/utils/abort.js +31 -0
  41. package/dist/utils/abort.js.map +1 -0
  42. package/package.json +3 -3
  43. package/src/events.ts +73 -0
  44. package/src/index.ts +11 -8
  45. package/src/managers/event-manager.test.ts +70 -0
  46. package/src/managers/event-manager.ts +80 -9
  47. package/src/services/connection-service.test.ts +148 -19
  48. package/src/services/connection-service.ts +63 -12
  49. package/src/services/network-switch-service.ts +22 -3
  50. package/src/services/signature-service.ts +13 -5
  51. package/src/services/transaction-service.ts +13 -5
  52. package/src/services/wallet-capabilities-service.ts +14 -2
  53. package/src/universal-wallet-connector.test.ts +196 -3
  54. package/src/universal-wallet-connector.ts +430 -222
  55. package/src/utils/abort.test.ts +68 -0
  56. package/src/utils/abort.ts +38 -0
@@ -0,0 +1,68 @@
1
+ import { describe, it, expect } from 'vitest'
2
+ import { raceAbort } from './abort'
3
+
4
+ describe('raceAbort', () => {
5
+ it('returns the promise unchanged when no signal is provided', async () => {
6
+ const p = Promise.resolve(42)
7
+ await expect(raceAbort(p)).resolves.toBe(42)
8
+ })
9
+
10
+ it('resolves with the promise value when the signal stays unset', async () => {
11
+ const controller = new AbortController()
12
+ const p = Promise.resolve('ok')
13
+ await expect(raceAbort(p, controller.signal)).resolves.toBe('ok')
14
+ })
15
+
16
+ it('rejects with the signal reason when already aborted', async () => {
17
+ const controller = new AbortController()
18
+ const reason = new Error('cancelled')
19
+ controller.abort(reason)
20
+ await expect(
21
+ raceAbort(new Promise(() => {}), controller.signal)
22
+ ).rejects.toBe(reason)
23
+ })
24
+
25
+ it('rejects mid-flight when the signal fires while the promise is pending', async () => {
26
+ const controller = new AbortController()
27
+ const pending: Promise<unknown> = new Promise(() => {})
28
+
29
+ const raced = raceAbort(pending, controller.signal)
30
+ controller.abort()
31
+
32
+ await expect(raced).rejects.toMatchObject({ name: 'AbortError' })
33
+ })
34
+
35
+ it('forwards the underlying promise rejection when no abort happens', async () => {
36
+ const controller = new AbortController()
37
+ const err = new Error('underlying')
38
+ await expect(
39
+ raceAbort(Promise.reject(err), controller.signal)
40
+ ).rejects.toBe(err)
41
+ })
42
+
43
+ it('removes its abort listener after the promise settles', async () => {
44
+ const controller = new AbortController()
45
+ let listenerCount = 0
46
+ const originalAdd = controller.signal.addEventListener.bind(
47
+ controller.signal
48
+ )
49
+ const originalRemove = controller.signal.removeEventListener.bind(
50
+ controller.signal
51
+ )
52
+ controller.signal.addEventListener = ((
53
+ ...args: Parameters<typeof originalAdd>
54
+ ) => {
55
+ listenerCount++
56
+ return originalAdd(...args)
57
+ }) as typeof originalAdd
58
+ controller.signal.removeEventListener = ((
59
+ ...args: Parameters<typeof originalRemove>
60
+ ) => {
61
+ listenerCount--
62
+ return originalRemove(...args)
63
+ }) as typeof originalRemove
64
+
65
+ await raceAbort(Promise.resolve('done'), controller.signal)
66
+ expect(listenerCount).toBe(0)
67
+ })
68
+ })
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Race a promise against an AbortSignal. If the signal fires before the
3
+ * promise settles, the returned promise rejects immediately with the signal's
4
+ * `reason` (defaulting to a `DOMException('Aborted', 'AbortError')` to match
5
+ * the platform contract).
6
+ *
7
+ * The underlying operation is NOT cancelled — wallet prompts in particular
8
+ * can't usually be aborted by the dapp side. What this guarantees is that
9
+ * the CALLER's await returns promptly so the UI can move on; any late result
10
+ * from the underlying promise is discarded (a `.then` after rejection is a
11
+ * no-op for the awaiter).
12
+ */
13
+ export function raceAbort<T>(
14
+ promise: Promise<T>,
15
+ signal?: AbortSignal
16
+ ): Promise<T> {
17
+ if (!signal) return promise
18
+ if (signal.aborted) {
19
+ return Promise.reject(
20
+ signal.reason ?? new DOMException('Aborted', 'AbortError')
21
+ )
22
+ }
23
+ return new Promise<T>((resolve, reject) => {
24
+ const onAbort = () =>
25
+ reject(signal.reason ?? new DOMException('Aborted', 'AbortError'))
26
+ signal.addEventListener('abort', onAbort, { once: true })
27
+ promise.then(
28
+ value => {
29
+ signal.removeEventListener('abort', onAbort)
30
+ resolve(value)
31
+ },
32
+ error => {
33
+ signal.removeEventListener('abort', onAbort)
34
+ reject(error)
35
+ }
36
+ )
37
+ })
38
+ }