@effect/platform-browser 4.0.0-beta.7 → 4.0.0-beta.71

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 (91) hide show
  1. package/dist/BrowserCrypto.d.ts +81 -0
  2. package/dist/BrowserCrypto.d.ts.map +1 -0
  3. package/dist/BrowserCrypto.js +119 -0
  4. package/dist/BrowserCrypto.js.map +1 -0
  5. package/dist/BrowserHttpClient.d.ts +40 -16
  6. package/dist/BrowserHttpClient.d.ts.map +1 -1
  7. package/dist/BrowserHttpClient.js +74 -18
  8. package/dist/BrowserHttpClient.js.map +1 -1
  9. package/dist/BrowserKeyValueStore.d.ts +37 -14
  10. package/dist/BrowserKeyValueStore.d.ts.map +1 -1
  11. package/dist/BrowserKeyValueStore.js +185 -10
  12. package/dist/BrowserKeyValueStore.js.map +1 -1
  13. package/dist/BrowserPersistence.d.ts +40 -0
  14. package/dist/BrowserPersistence.d.ts.map +1 -0
  15. package/dist/BrowserPersistence.js +207 -0
  16. package/dist/BrowserPersistence.js.map +1 -0
  17. package/dist/BrowserRuntime.d.ts +79 -4
  18. package/dist/BrowserRuntime.d.ts.map +1 -1
  19. package/dist/BrowserRuntime.js +19 -1
  20. package/dist/BrowserRuntime.js.map +1 -1
  21. package/dist/BrowserSocket.d.ts +64 -6
  22. package/dist/BrowserSocket.d.ts.map +1 -1
  23. package/dist/BrowserSocket.js +64 -6
  24. package/dist/BrowserSocket.js.map +1 -1
  25. package/dist/BrowserStream.d.ts +48 -5
  26. package/dist/BrowserStream.d.ts.map +1 -1
  27. package/dist/BrowserStream.js +48 -5
  28. package/dist/BrowserStream.js.map +1 -1
  29. package/dist/BrowserWorker.d.ts +25 -4
  30. package/dist/BrowserWorker.d.ts.map +1 -1
  31. package/dist/BrowserWorker.js +62 -6
  32. package/dist/BrowserWorker.js.map +1 -1
  33. package/dist/BrowserWorkerRunner.d.ts +31 -6
  34. package/dist/BrowserWorkerRunner.d.ts.map +1 -1
  35. package/dist/BrowserWorkerRunner.js +65 -10
  36. package/dist/BrowserWorkerRunner.js.map +1 -1
  37. package/dist/Clipboard.d.ts +77 -13
  38. package/dist/Clipboard.d.ts.map +1 -1
  39. package/dist/Clipboard.js +57 -11
  40. package/dist/Clipboard.js.map +1 -1
  41. package/dist/Geolocation.d.ts +101 -24
  42. package/dist/Geolocation.d.ts.map +1 -1
  43. package/dist/Geolocation.js +69 -16
  44. package/dist/Geolocation.js.map +1 -1
  45. package/dist/IndexedDb.d.ts +89 -0
  46. package/dist/IndexedDb.d.ts.map +1 -0
  47. package/dist/IndexedDb.js +99 -0
  48. package/dist/IndexedDb.js.map +1 -0
  49. package/dist/IndexedDbDatabase.d.ts +169 -0
  50. package/dist/IndexedDbDatabase.d.ts.map +1 -0
  51. package/dist/IndexedDbDatabase.js +343 -0
  52. package/dist/IndexedDbDatabase.js.map +1 -0
  53. package/dist/IndexedDbQueryBuilder.d.ts +438 -0
  54. package/dist/IndexedDbQueryBuilder.d.ts.map +1 -0
  55. package/dist/IndexedDbQueryBuilder.js +935 -0
  56. package/dist/IndexedDbQueryBuilder.js.map +1 -0
  57. package/dist/IndexedDbTable.d.ts +191 -0
  58. package/dist/IndexedDbTable.d.ts.map +1 -0
  59. package/dist/IndexedDbTable.js +96 -0
  60. package/dist/IndexedDbTable.js.map +1 -0
  61. package/dist/IndexedDbVersion.d.ts +94 -0
  62. package/dist/IndexedDbVersion.d.ts.map +1 -0
  63. package/dist/IndexedDbVersion.js +39 -0
  64. package/dist/IndexedDbVersion.js.map +1 -0
  65. package/dist/Permissions.d.ts +76 -16
  66. package/dist/Permissions.d.ts.map +1 -1
  67. package/dist/Permissions.js +66 -11
  68. package/dist/Permissions.js.map +1 -1
  69. package/dist/index.d.ts +38 -10
  70. package/dist/index.d.ts.map +1 -1
  71. package/dist/index.js +38 -10
  72. package/dist/index.js.map +1 -1
  73. package/package.json +4 -3
  74. package/src/BrowserCrypto.ts +129 -0
  75. package/src/BrowserHttpClient.ts +84 -24
  76. package/src/BrowserKeyValueStore.ts +201 -12
  77. package/src/BrowserPersistence.ts +376 -0
  78. package/src/BrowserRuntime.ts +79 -4
  79. package/src/BrowserSocket.ts +64 -6
  80. package/src/BrowserStream.ts +48 -5
  81. package/src/BrowserWorker.ts +62 -6
  82. package/src/BrowserWorkerRunner.ts +65 -10
  83. package/src/Clipboard.ts +74 -13
  84. package/src/Geolocation.ts +97 -20
  85. package/src/IndexedDb.ts +127 -0
  86. package/src/IndexedDbDatabase.ts +664 -0
  87. package/src/IndexedDbQueryBuilder.ts +2048 -0
  88. package/src/IndexedDbTable.ts +285 -0
  89. package/src/IndexedDbVersion.ts +133 -0
  90. package/src/Permissions.ts +71 -14
  91. package/src/index.ts +45 -10
@@ -1,14 +1,49 @@
1
+ /**
2
+ * Effect service for the browser Permissions API.
3
+ *
4
+ * This module wraps `navigator.permissions` in a `Permissions` service and a
5
+ * browser-backed layer. It lets browser programs query whether a capability is
6
+ * currently `granted`, `prompt`, or `denied` before deciding which UI or
7
+ * feature flow to show for geolocation, notifications, clipboard access,
8
+ * camera, microphone, persistent storage, and other browser-gated features.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * A permission query is a status read, not an access request. The service
13
+ * delegates to `navigator.permissions.query({ name })` and returns the browser's
14
+ * `PermissionStatus`, while browser rejections are represented as
15
+ * `PermissionsError` values.
16
+ *
17
+ * **Common tasks**
18
+ *
19
+ * - Check whether a feature is already available before rendering a prompt or
20
+ * settings path.
21
+ * - Require permission querying through Effect context instead of reaching for
22
+ * the ambient `navigator` in application code.
23
+ * - Provide the live browser implementation with `layer`.
24
+ *
25
+ * **Gotchas**
26
+ *
27
+ * Browser support for permission names and states is uneven, and unsupported or
28
+ * invalid descriptors may reject. Some permissions are only meaningful in
29
+ * secure contexts or after user activation. Returned `PermissionStatus` objects
30
+ * can change when the user updates browser settings or responds to prompts; if
31
+ * you subscribe to `change` or `onchange`, clean up listeners with the
32
+ * surrounding Effect scope.
33
+ *
34
+ * @since 4.0.0
35
+ */
36
+ import * as Context from "effect/Context";
1
37
  import * as Effect from "effect/Effect";
2
38
  import * as Layer from "effect/Layer";
3
- import * as ServiceMap from "effect/ServiceMap";
4
39
  declare const TypeId = "~@effect/platform-browser/Permissions";
5
40
  declare const ErrorTypeId = "~@effect/platform-browser/Permissions/PermissionsError";
6
41
  /**
7
42
  * Wrapper on the Permission API (`navigator.permissions`) with methods for
8
43
  * querying status of permissions.
9
44
  *
10
- * @since 1.0.0
11
- * @category Models
45
+ * @category models
46
+ * @since 4.0.0
12
47
  */
13
48
  export interface Permissions {
14
49
  readonly [TypeId]: typeof TypeId;
@@ -19,24 +54,28 @@ export interface Permissions {
19
54
  name: Name;
20
55
  }, PermissionsError>;
21
56
  }
22
- declare const PermissionsInvalidStateError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
57
+ declare const PermissionsInvalidStateError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
23
58
  readonly _tag: "InvalidStateError";
24
59
  } & Readonly<A>;
25
60
  /**
26
- * @since 1.0.0
61
+ * Error reason for an `InvalidStateError` raised by the browser Permissions API.
62
+ *
27
63
  * @category errors
64
+ * @since 4.0.0
28
65
  */
29
66
  export declare class PermissionsInvalidStateError extends PermissionsInvalidStateError_base<{
30
67
  readonly cause: unknown;
31
68
  }> {
32
69
  get message(): string;
33
70
  }
34
- declare const PermissionsTypeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
71
+ declare const PermissionsTypeError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
35
72
  readonly _tag: "TypeError";
36
73
  } & Readonly<A>;
37
74
  /**
38
- * @since 1.0.0
75
+ * Error reason for a `TypeError` raised by the browser Permissions API.
76
+ *
39
77
  * @category errors
78
+ * @since 4.0.0
40
79
  */
41
80
  export declare class PermissionsTypeError extends PermissionsTypeError_base<{
42
81
  readonly cause: unknown;
@@ -44,16 +83,20 @@ export declare class PermissionsTypeError extends PermissionsTypeError_base<{
44
83
  get message(): string;
45
84
  }
46
85
  /**
47
- * @since 1.0.0
86
+ * Union of browser Permissions API error reasons represented by the service.
87
+ *
48
88
  * @category errors
89
+ * @since 4.0.0
49
90
  */
50
91
  export type PermissionsErrorReason = PermissionsInvalidStateError | PermissionsTypeError;
51
- declare const PermissionsError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").Equals<A, {}> extends true ? void : { readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }) => import("effect/Cause").YieldableError & {
92
+ declare const PermissionsError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
52
93
  readonly _tag: "PermissionsError";
53
94
  } & Readonly<A>;
54
95
  /**
55
- * @since 1.0.0
96
+ * Tagged error wrapping a browser Permissions API failure reason.
97
+ *
56
98
  * @category errors
99
+ * @since 4.0.0
57
100
  */
58
101
  export declare class PermissionsError extends PermissionsError_base<{
59
102
  readonly reason: PermissionsErrorReason;
@@ -65,15 +108,32 @@ export declare class PermissionsError extends PermissionsError_base<{
65
108
  get message(): string;
66
109
  }
67
110
  /**
68
- * @since 1.0.0
69
- * @category Service
111
+ * Service tag for the browser `Permissions` service.
112
+ *
113
+ * **When to use**
114
+ *
115
+ * Use when an Effect needs to require or provide browser permission querying
116
+ * through the context.
117
+ *
118
+ * @category services
119
+ * @since 4.0.0
70
120
  */
71
- export declare const Permissions: ServiceMap.Service<Permissions, Permissions>;
121
+ export declare const Permissions: Context.Service<Permissions, Permissions>;
72
122
  /**
73
- * A layer that directly interfaces with the `navigator.permissions` api
123
+ * Provides the `Permissions` service using the browser `navigator.permissions` API.
124
+ *
125
+ * **When to use**
126
+ *
127
+ * Use when browser programs need a live `Permissions` service backed by the
128
+ * ambient `navigator.permissions` implementation.
129
+ *
130
+ * **Details**
131
+ *
132
+ * `query` delegates to `navigator.permissions.query({ name })` and wraps
133
+ * rejected browser operations in `PermissionsError`.
74
134
  *
75
- * @since 1.0.0
76
- * @category Layers
135
+ * @category layers
136
+ * @since 4.0.0
77
137
  */
78
138
  export declare const layer: Layer.Layer<Permissions>;
79
139
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"Permissions.d.ts","sourceRoot":"","sources":["../src/Permissions.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,UAAU,MAAM,mBAAmB,CAAA;AAE/C,QAAA,MAAM,MAAM,0CAA0C,CAAA;AACtD,QAAA,MAAM,WAAW,2DAA2D,CAAA;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM,CAAA;IAEhC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,SAAS,cAAc,EAC1C,IAAI,EAAE,IAAI,KACP,MAAM,CAAC,MAAM,CAGhB,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,EAC/C,gBAAgB,CACjB,CAAA;CACF;;;;AAED;;;GAGG;AACH,qBAAa,4BAA6B,SAAQ,kCAAsC;IACtF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED;;;GAGG;AACH,qBAAa,oBAAqB,SAAQ,0BAA8B;IACtE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;GAGG;AACH,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,GAAG,oBAAoB,CAAA;;;;AAExF;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;CACxC,CAAC;gBACY,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE;IAO9D,QAAQ,CAAC,CAAC,WAAW,CAAC,4DAAc;IAEpC,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,UAAU,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAA2C,CAAA;AAEhH;;;;;GAKG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAe1C,CAAA"}
1
+ {"version":3,"file":"Permissions.d.ts","sourceRoot":"","sources":["../src/Permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAA;AAEzC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AAErC,QAAA,MAAM,MAAM,0CAA0C,CAAA;AACtD,QAAA,MAAM,WAAW,2DAA2D,CAAA;AAE5E;;;;;;GAMG;AACH,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,MAAM,CAAA;IAEhC;;OAEG;IACH,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,SAAS,cAAc,EAC1C,IAAI,EAAE,IAAI,KACP,MAAM,CAAC,MAAM,CAGhB,IAAI,CAAC,gBAAgB,EAAE,MAAM,CAAC,GAAG;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,EAC/C,gBAAgB,CACjB,CAAA;CACF;;;;AAED;;;;;GAKG;AACH,qBAAa,4BAA6B,SAAQ,kCAAsC;IACtF,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;;;;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,0BAA8B;IACtE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAC;IACA,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,4BAA4B,GAAG,oBAAoB,CAAA;;;;AAExF;;;;;GAKG;AACH,qBAAa,gBAAiB,SAAQ,sBAAqC;IACzE,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;CACxC,CAAC;gBACY,KAAK,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,sBAAsB,CAAA;KAAE;IAO9D,QAAQ,CAAC,CAAC,WAAW,CAAC,4DAAc;IAEpC,IAAa,OAAO,IAAI,MAAM,CAE7B;CACF;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,WAAW,EAAE,WAAW,CAAwC,CAAA;AAE1G;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,WAAW,CAe1C,CAAA"}
@@ -1,15 +1,49 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * Effect service for the browser Permissions API.
3
+ *
4
+ * This module wraps `navigator.permissions` in a `Permissions` service and a
5
+ * browser-backed layer. It lets browser programs query whether a capability is
6
+ * currently `granted`, `prompt`, or `denied` before deciding which UI or
7
+ * feature flow to show for geolocation, notifications, clipboard access,
8
+ * camera, microphone, persistent storage, and other browser-gated features.
9
+ *
10
+ * **Mental model**
11
+ *
12
+ * A permission query is a status read, not an access request. The service
13
+ * delegates to `navigator.permissions.query({ name })` and returns the browser's
14
+ * `PermissionStatus`, while browser rejections are represented as
15
+ * `PermissionsError` values.
16
+ *
17
+ * **Common tasks**
18
+ *
19
+ * - Check whether a feature is already available before rendering a prompt or
20
+ * settings path.
21
+ * - Require permission querying through Effect context instead of reaching for
22
+ * the ambient `navigator` in application code.
23
+ * - Provide the live browser implementation with `layer`.
24
+ *
25
+ * **Gotchas**
26
+ *
27
+ * Browser support for permission names and states is uneven, and unsupported or
28
+ * invalid descriptors may reject. Some permissions are only meaningful in
29
+ * secure contexts or after user activation. Returned `PermissionStatus` objects
30
+ * can change when the user updates browser settings or responds to prompts; if
31
+ * you subscribe to `change` or `onchange`, clean up listeners with the
32
+ * surrounding Effect scope.
33
+ *
34
+ * @since 4.0.0
3
35
  */
36
+ import * as Context from "effect/Context";
4
37
  import * as Data from "effect/Data";
5
38
  import * as Effect from "effect/Effect";
6
39
  import * as Layer from "effect/Layer";
7
- import * as ServiceMap from "effect/ServiceMap";
8
40
  const TypeId = "~@effect/platform-browser/Permissions";
9
41
  const ErrorTypeId = "~@effect/platform-browser/Permissions/PermissionsError";
10
42
  /**
11
- * @since 1.0.0
43
+ * Error reason for an `InvalidStateError` raised by the browser Permissions API.
44
+ *
12
45
  * @category errors
46
+ * @since 4.0.0
13
47
  */
14
48
  export class PermissionsInvalidStateError extends /*#__PURE__*/Data.TaggedError("InvalidStateError") {
15
49
  get message() {
@@ -17,8 +51,10 @@ export class PermissionsInvalidStateError extends /*#__PURE__*/Data.TaggedError(
17
51
  }
18
52
  }
19
53
  /**
20
- * @since 1.0.0
54
+ * Error reason for a `TypeError` raised by the browser Permissions API.
55
+ *
21
56
  * @category errors
57
+ * @since 4.0.0
22
58
  */
23
59
  export class PermissionsTypeError extends /*#__PURE__*/Data.TaggedError("TypeError") {
24
60
  get message() {
@@ -26,8 +62,10 @@ export class PermissionsTypeError extends /*#__PURE__*/Data.TaggedError("TypeErr
26
62
  }
27
63
  }
28
64
  /**
29
- * @since 1.0.0
65
+ * Tagged error wrapping a browser Permissions API failure reason.
66
+ *
30
67
  * @category errors
68
+ * @since 4.0.0
31
69
  */
32
70
  export class PermissionsError extends /*#__PURE__*/Data.TaggedError("PermissionsError") {
33
71
  constructor(props) {
@@ -42,15 +80,32 @@ export class PermissionsError extends /*#__PURE__*/Data.TaggedError("Permissions
42
80
  }
43
81
  }
44
82
  /**
45
- * @since 1.0.0
46
- * @category Service
83
+ * Service tag for the browser `Permissions` service.
84
+ *
85
+ * **When to use**
86
+ *
87
+ * Use when an Effect needs to require or provide browser permission querying
88
+ * through the context.
89
+ *
90
+ * @category services
91
+ * @since 4.0.0
47
92
  */
48
- export const Permissions = /*#__PURE__*/ServiceMap.Service(TypeId);
93
+ export const Permissions = /*#__PURE__*/Context.Service(TypeId);
49
94
  /**
50
- * A layer that directly interfaces with the `navigator.permissions` api
95
+ * Provides the `Permissions` service using the browser `navigator.permissions` API.
96
+ *
97
+ * **When to use**
98
+ *
99
+ * Use when browser programs need a live `Permissions` service backed by the
100
+ * ambient `navigator.permissions` implementation.
101
+ *
102
+ * **Details**
103
+ *
104
+ * `query` delegates to `navigator.permissions.query({ name })` and wraps
105
+ * rejected browser operations in `PermissionsError`.
51
106
  *
52
- * @since 1.0.0
53
- * @category Layers
107
+ * @category layers
108
+ * @since 4.0.0
54
109
  */
55
110
  export const layer = /*#__PURE__*/Layer.succeed(Permissions, /*#__PURE__*/Permissions.of({
56
111
  [TypeId]: TypeId,
@@ -1 +1 @@
1
- {"version":3,"file":"Permissions.js","names":["Data","Effect","Layer","ServiceMap","TypeId","ErrorTypeId","PermissionsInvalidStateError","TaggedError","message","_tag","PermissionsTypeError","PermissionsError","constructor","props","cause","reason","Permissions","Service","layer","succeed","of","query","name","tryPromise","try","navigator","permissions","catch","DOMException"],"sources":["../src/Permissions.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAGA,OAAO,KAAKA,IAAI,MAAM,aAAa;AACnC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AACrC,OAAO,KAAKC,UAAU,MAAM,mBAAmB;AAE/C,MAAMC,MAAM,GAAG,uCAAuC;AACtD,MAAMC,WAAW,GAAG,wDAAwD;AAyB5E;;;;AAIA,OAAM,MAAOC,4BAA6B,sBAAQN,IAAI,CAACO,WAAW,CAAC,mBAAmB,CAEpF;EACA,IAAaC,OAAOA,CAAA;IAClB,OAAO,IAAI,CAACC,IAAI;EAClB;;AAGF;;;;AAIA,OAAM,MAAOC,oBAAqB,sBAAQV,IAAI,CAACO,WAAW,CAAC,WAAW,CAEpE;EACA,IAAaC,OAAOA,CAAA;IAClB,OAAO,IAAI,CAACC,IAAI;EAClB;;AASF;;;;AAIA,OAAM,MAAOE,gBAAiB,sBAAQX,IAAI,CAACO,WAAW,CAAC,kBAAkB,CAEvE;EACAK,YAAYC,KAAkD;IAC5D,KAAK,CAAC;MACJ,GAAGA,KAAK;MACRC,KAAK,EAAED,KAAK,CAACE,MAAM,CAACD;KACd,CAAC;EACX;EAES,CAACT,WAAW,IAAIA,WAAW;EAEpC,IAAaG,OAAOA,CAAA;IAClB,OAAO,IAAI,CAACO,MAAM,CAACP,OAAO;EAC5B;;AAGF;;;;AAIA,OAAO,MAAMQ,WAAW,gBAAiDb,UAAU,CAACc,OAAO,CAAcb,MAAM,CAAC;AAEhH;;;;;;AAMA,OAAO,MAAMc,KAAK,gBAA6BhB,KAAK,CAACiB,OAAO,CAC1DH,WAAW,eACXA,WAAW,CAACI,EAAE,CAAC;EACb,CAAChB,MAAM,GAAGA,MAAM;EAChBiB,KAAK,EAAGC,IAAI,IACVrB,MAAM,CAACsB,UAAU,CAAC;IAChBC,GAAG,EAAEA,CAAA,KAAMC,SAAS,CAACC,WAAW,CAACL,KAAK,CAAC;MAAEC;IAAI,CAAE,CAAiB;IAChEK,KAAK,EAAGb,KAAK,IACX,IAAIH,gBAAgB,CAAC;MACnBI,MAAM,EAAED,KAAK,YAAYc,YAAY,GACjC,IAAItB,4BAA4B,CAAC;QAAEQ;MAAK,CAAE,CAAC,GAC3C,IAAIJ,oBAAoB,CAAC;QAAEI;MAAK,CAAE;KACvC;GACJ;CACJ,CAAC,CACH","ignoreList":[]}
1
+ {"version":3,"file":"Permissions.js","names":["Context","Data","Effect","Layer","TypeId","ErrorTypeId","PermissionsInvalidStateError","TaggedError","message","_tag","PermissionsTypeError","PermissionsError","constructor","props","cause","reason","Permissions","Service","layer","succeed","of","query","name","tryPromise","try","navigator","permissions","catch","DOMException"],"sources":["../src/Permissions.ts"],"sourcesContent":[null],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,OAAO,KAAKA,OAAO,MAAM,gBAAgB;AACzC,OAAO,KAAKC,IAAI,MAAM,aAAa;AACnC,OAAO,KAAKC,MAAM,MAAM,eAAe;AACvC,OAAO,KAAKC,KAAK,MAAM,cAAc;AAErC,MAAMC,MAAM,GAAG,uCAAuC;AACtD,MAAMC,WAAW,GAAG,wDAAwD;AAyB5E;;;;;;AAMA,OAAM,MAAOC,4BAA6B,sBAAQL,IAAI,CAACM,WAAW,CAAC,mBAAmB,CAEpF;EACA,IAAaC,OAAOA,CAAA;IAClB,OAAO,IAAI,CAACC,IAAI;EAClB;;AAGF;;;;;;AAMA,OAAM,MAAOC,oBAAqB,sBAAQT,IAAI,CAACM,WAAW,CAAC,WAAW,CAEpE;EACA,IAAaC,OAAOA,CAAA;IAClB,OAAO,IAAI,CAACC,IAAI;EAClB;;AAWF;;;;;;AAMA,OAAM,MAAOE,gBAAiB,sBAAQV,IAAI,CAACM,WAAW,CAAC,kBAAkB,CAEvE;EACAK,YAAYC,KAAkD;IAC5D,KAAK,CAAC;MACJ,GAAGA,KAAK;MACRC,KAAK,EAAED,KAAK,CAACE,MAAM,CAACD;KACd,CAAC;EACX;EAES,CAACT,WAAW,IAAIA,WAAW;EAEpC,IAAaG,OAAOA,CAAA;IAClB,OAAO,IAAI,CAACO,MAAM,CAACP,OAAO;EAC5B;;AAGF;;;;;;;;;;;AAWA,OAAO,MAAMQ,WAAW,gBAA8ChB,OAAO,CAACiB,OAAO,CAAcb,MAAM,CAAC;AAE1G;;;;;;;;;;;;;;;;AAgBA,OAAO,MAAMc,KAAK,gBAA6Bf,KAAK,CAACgB,OAAO,CAC1DH,WAAW,eACXA,WAAW,CAACI,EAAE,CAAC;EACb,CAAChB,MAAM,GAAGA,MAAM;EAChBiB,KAAK,EAAGC,IAAI,IACVpB,MAAM,CAACqB,UAAU,CAAC;IAChBC,GAAG,EAAEA,CAAA,KAAMC,SAAS,CAACC,WAAW,CAACL,KAAK,CAAC;MAAEC;IAAI,CAAE,CAAiB;IAChEK,KAAK,EAAGb,KAAK,IACX,IAAIH,gBAAgB,CAAC;MACnBI,MAAM,EAAED,KAAK,YAAYc,YAAY,GACjC,IAAItB,4BAA4B,CAAC;QAAEQ;MAAK,CAAE,CAAC,GAC3C,IAAIJ,oBAAoB,CAAC;QAAEI;MAAK,CAAE;KACvC;GACJ;CACJ,CAAC,CACH","ignoreList":[]}
package/dist/index.d.ts CHANGED
@@ -1,44 +1,72 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
  /**
5
5
  * @since 1.0.0
6
6
  */
7
+ export * as BrowserCrypto from "./BrowserCrypto.ts";
8
+ /**
9
+ * @since 4.0.0
10
+ */
7
11
  export * as BrowserHttpClient from "./BrowserHttpClient.ts";
8
12
  /**
9
- * @since 1.0.0
13
+ * @since 4.0.0
10
14
  */
11
15
  export * as BrowserKeyValueStore from "./BrowserKeyValueStore.ts";
12
16
  /**
13
- * @since 1.0.0
17
+ * @since 4.0.0
18
+ */
19
+ export * as BrowserPersistence from "./BrowserPersistence.ts";
20
+ /**
21
+ * @since 4.0.0
14
22
  */
15
23
  export * as BrowserRuntime from "./BrowserRuntime.ts";
16
24
  /**
17
- * @since 1.0.0
25
+ * @since 4.0.0
18
26
  */
19
27
  export * as BrowserSocket from "./BrowserSocket.ts";
20
28
  /**
21
- * @since 1.0.0
29
+ * @since 4.0.0
22
30
  */
23
31
  export * as BrowserStream from "./BrowserStream.ts";
24
32
  /**
25
- * @since 1.0.0
33
+ * @since 4.0.0
26
34
  */
27
35
  export * as BrowserWorker from "./BrowserWorker.ts";
28
36
  /**
29
- * @since 1.0.0
37
+ * @since 4.0.0
30
38
  */
31
39
  export * as BrowserWorkerRunner from "./BrowserWorkerRunner.ts";
32
40
  /**
33
- * @since 1.0.0
41
+ * @since 4.0.0
34
42
  */
35
43
  export * as Clipboard from "./Clipboard.ts";
36
44
  /**
37
- * @since 1.0.0
45
+ * @since 4.0.0
38
46
  */
39
47
  export * as Geolocation from "./Geolocation.ts";
40
48
  /**
41
- * @since 1.0.0
49
+ * @since 4.0.0
50
+ */
51
+ export * as IndexedDb from "./IndexedDb.ts";
52
+ /**
53
+ * @since 4.0.0
54
+ */
55
+ export * as IndexedDbDatabase from "./IndexedDbDatabase.ts";
56
+ /**
57
+ * @since 4.0.0
58
+ */
59
+ export * as IndexedDbQueryBuilder from "./IndexedDbQueryBuilder.ts";
60
+ /**
61
+ * @since 4.0.0
62
+ */
63
+ export * as IndexedDbTable from "./IndexedDbTable.ts";
64
+ /**
65
+ * @since 4.0.0
66
+ */
67
+ export * as IndexedDbVersion from "./IndexedDbVersion.ts";
68
+ /**
69
+ * @since 4.0.0
42
70
  */
43
71
  export * as Permissions from "./Permissions.ts";
44
72
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAA;AAE3D;;GAEG;AACH,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAA;AAEjE;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAA;AAE/D;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAE/C;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAA;AAE3D;;GAEG;AACH,OAAO,KAAK,oBAAoB,MAAM,2BAA2B,CAAA;AAEjE;;GAEG;AACH,OAAO,KAAK,kBAAkB,MAAM,yBAAyB,CAAA;AAE7D;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,aAAa,MAAM,oBAAoB,CAAA;AAEnD;;GAEG;AACH,OAAO,KAAK,mBAAmB,MAAM,0BAA0B,CAAA;AAE/D;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA;AAE/C;;GAEG;AACH,OAAO,KAAK,SAAS,MAAM,gBAAgB,CAAA;AAE3C;;GAEG;AACH,OAAO,KAAK,iBAAiB,MAAM,wBAAwB,CAAA;AAE3D;;GAEG;AACH,OAAO,KAAK,qBAAqB,MAAM,4BAA4B,CAAA;AAEnE;;GAEG;AACH,OAAO,KAAK,cAAc,MAAM,qBAAqB,CAAA;AAErD;;GAEG;AACH,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD;;GAEG;AACH,OAAO,KAAK,WAAW,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -1,45 +1,73 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * @since 4.0.0
3
3
  */
4
4
  // @barrel: Auto-generated exports. Do not edit manually.
5
5
  /**
6
6
  * @since 1.0.0
7
7
  */
8
+ export * as BrowserCrypto from "./BrowserCrypto.js";
9
+ /**
10
+ * @since 4.0.0
11
+ */
8
12
  export * as BrowserHttpClient from "./BrowserHttpClient.js";
9
13
  /**
10
- * @since 1.0.0
14
+ * @since 4.0.0
11
15
  */
12
16
  export * as BrowserKeyValueStore from "./BrowserKeyValueStore.js";
13
17
  /**
14
- * @since 1.0.0
18
+ * @since 4.0.0
19
+ */
20
+ export * as BrowserPersistence from "./BrowserPersistence.js";
21
+ /**
22
+ * @since 4.0.0
15
23
  */
16
24
  export * as BrowserRuntime from "./BrowserRuntime.js";
17
25
  /**
18
- * @since 1.0.0
26
+ * @since 4.0.0
19
27
  */
20
28
  export * as BrowserSocket from "./BrowserSocket.js";
21
29
  /**
22
- * @since 1.0.0
30
+ * @since 4.0.0
23
31
  */
24
32
  export * as BrowserStream from "./BrowserStream.js";
25
33
  /**
26
- * @since 1.0.0
34
+ * @since 4.0.0
27
35
  */
28
36
  export * as BrowserWorker from "./BrowserWorker.js";
29
37
  /**
30
- * @since 1.0.0
38
+ * @since 4.0.0
31
39
  */
32
40
  export * as BrowserWorkerRunner from "./BrowserWorkerRunner.js";
33
41
  /**
34
- * @since 1.0.0
42
+ * @since 4.0.0
35
43
  */
36
44
  export * as Clipboard from "./Clipboard.js";
37
45
  /**
38
- * @since 1.0.0
46
+ * @since 4.0.0
39
47
  */
40
48
  export * as Geolocation from "./Geolocation.js";
41
49
  /**
42
- * @since 1.0.0
50
+ * @since 4.0.0
51
+ */
52
+ export * as IndexedDb from "./IndexedDb.js";
53
+ /**
54
+ * @since 4.0.0
55
+ */
56
+ export * as IndexedDbDatabase from "./IndexedDbDatabase.js";
57
+ /**
58
+ * @since 4.0.0
59
+ */
60
+ export * as IndexedDbQueryBuilder from "./IndexedDbQueryBuilder.js";
61
+ /**
62
+ * @since 4.0.0
63
+ */
64
+ export * as IndexedDbTable from "./IndexedDbTable.js";
65
+ /**
66
+ * @since 4.0.0
67
+ */
68
+ export * as IndexedDbVersion from "./IndexedDbVersion.js";
69
+ /**
70
+ * @since 4.0.0
43
71
  */
44
72
  export * as Permissions from "./Permissions.js";
45
73
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["BrowserHttpClient","BrowserKeyValueStore","BrowserRuntime","BrowserSocket","BrowserStream","BrowserWorker","BrowserWorkerRunner","Clipboard","Geolocation","Permissions"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAIA;AAEA;;;AAGA,OAAO,KAAKA,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,oBAAoB,MAAM,2BAA2B;AAEjE;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,mBAAmB,MAAM,0BAA0B;AAE/D;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAKC,WAAW,MAAM,kBAAkB","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["BrowserCrypto","BrowserHttpClient","BrowserKeyValueStore","BrowserPersistence","BrowserRuntime","BrowserSocket","BrowserStream","BrowserWorker","BrowserWorkerRunner","Clipboard","Geolocation","IndexedDb","IndexedDbDatabase","IndexedDbQueryBuilder","IndexedDbTable","IndexedDbVersion","Permissions"],"sources":["../src/index.ts"],"sourcesContent":[null],"mappings":"AAAA;;;AAIA;AAEA;;;AAGA,OAAO,KAAKA,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,oBAAoB,MAAM,2BAA2B;AAEjE;;;AAGA,OAAO,KAAKC,kBAAkB,MAAM,yBAAyB;AAE7D;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,aAAa,MAAM,oBAAoB;AAEnD;;;AAGA,OAAO,KAAKC,mBAAmB,MAAM,0BAA0B;AAE/D;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,WAAW,MAAM,kBAAkB;AAE/C;;;AAGA,OAAO,KAAKC,SAAS,MAAM,gBAAgB;AAE3C;;;AAGA,OAAO,KAAKC,iBAAiB,MAAM,wBAAwB;AAE3D;;;AAGA,OAAO,KAAKC,qBAAqB,MAAM,4BAA4B;AAEnE;;;AAGA,OAAO,KAAKC,cAAc,MAAM,qBAAqB;AAErD;;;AAGA,OAAO,KAAKC,gBAAgB,MAAM,uBAAuB;AAEzD;;;AAGA,OAAO,KAAKC,WAAW,MAAM,kBAAkB","ignoreList":[]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@effect/platform-browser",
3
3
  "type": "module",
4
- "version": "4.0.0-beta.7",
4
+ "version": "4.0.0-beta.71",
5
5
  "license": "MIT",
6
6
  "description": "Platform specific implementations for the browser",
7
7
  "homepage": "https://effect.website",
@@ -45,11 +45,12 @@
45
45
  "provenance": true
46
46
  },
47
47
  "peerDependencies": {
48
- "effect": "^4.0.0-beta.7"
48
+ "effect": "^4.0.0-beta.71"
49
49
  },
50
50
  "devDependencies": {
51
51
  "mock-xmlhttprequest": "^8.4.1",
52
- "effect": "^4.0.0-beta.7"
52
+ "fake-indexeddb": "^6.2.5",
53
+ "effect": "^4.0.0-beta.71"
53
54
  },
54
55
  "dependencies": {
55
56
  "multipasta": "^0.2.7"
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Browser-backed implementation of Effect's Crypto service.
3
+ *
4
+ * This module provides a `Crypto.Crypto` layer backed by the Web Crypto API.
5
+ * The {@link WebCrypto} context reference defaults to `globalThis.crypto`, so
6
+ * browser programs can use the standard implementation while tests or embedded
7
+ * runtimes can provide their own `Crypto` object.
8
+ *
9
+ * **Mental model**
10
+ *
11
+ * {@link layer} reads {@link WebCrypto}, adapts `getRandomValues` to the
12
+ * random byte primitive used by `effect/Crypto`, and delegates digest requests
13
+ * to `crypto.subtle.digest`. Higher-level helpers such as UUID generation are
14
+ * derived by the core Crypto service from those primitives.
15
+ *
16
+ * **Common tasks**
17
+ *
18
+ * - Provide cryptographic randomness, UUID generation, and digest operations in
19
+ * browser Effect programs with {@link layer}
20
+ * - Override {@link WebCrypto} in tests to make randomness or digest output
21
+ * deterministic
22
+ *
23
+ * **Gotchas**
24
+ *
25
+ * - The browser must expose `globalThis.crypto`; otherwise layer acquisition
26
+ * dies because no secure randomness source is available.
27
+ * - Digest support depends on `crypto.subtle.digest` and the algorithms the
28
+ * browser accepts. Rejected digest operations fail with `PlatformError`.
29
+ *
30
+ * **Example** (Provide browser crypto)
31
+ *
32
+ * ```ts
33
+ * import { BrowserCrypto } from "@effect/platform-browser"
34
+ * import { Crypto, Effect } from "effect"
35
+ *
36
+ * const program = Effect.gen(function*() {
37
+ * const crypto = yield* Crypto.Crypto
38
+ * return yield* crypto.randomUUIDv4
39
+ * })
40
+ *
41
+ * Effect.runPromise(
42
+ * program.pipe(Effect.provide(BrowserCrypto.layer))
43
+ * ).then(console.log)
44
+ * ```
45
+ *
46
+ * @since 1.0.0
47
+ */
48
+ import * as Context from "effect/Context"
49
+ import * as EffectCrypto from "effect/Crypto"
50
+ import * as Effect from "effect/Effect"
51
+ import * as Layer from "effect/Layer"
52
+ import * as PlatformError from "effect/PlatformError"
53
+
54
+ /**
55
+ * Browser Web Crypto APIs used by the Crypto service implementation.
56
+ *
57
+ * @category models
58
+ * @since 1.0.0
59
+ */
60
+ export const WebCrypto = Context.Reference<Crypto>("@effect/platform-browser/Crypto/WebCrypto", {
61
+ defaultValue: () => globalThis.crypto
62
+ })
63
+
64
+ /**
65
+ * A layer that directly interfaces with the Web Crypto API.
66
+ *
67
+ * **When to use**
68
+ *
69
+ * Use to provide cryptographic randomness, UUID generation, and digest
70
+ * operations in browser runtimes backed by `globalThis.crypto`.
71
+ *
72
+ * **Details**
73
+ *
74
+ * Random bytes are produced with `crypto.getRandomValues`. Digests are computed
75
+ * with `crypto.subtle.digest` and returned as `Uint8Array` values.
76
+ *
77
+ * **Gotchas**
78
+ *
79
+ * The layer dies if the Web Crypto object is unavailable. Digest operations
80
+ * fail with `PlatformError` when `crypto.subtle.digest` is unavailable or the
81
+ * browser rejects the digest request.
82
+ *
83
+ * @category layers
84
+ * @since 1.0.0
85
+ */
86
+ export const layer: Layer.Layer<EffectCrypto.Crypto> = Layer.effect(
87
+ EffectCrypto.Crypto,
88
+ Effect.gen(function*() {
89
+ const crypto = yield* WebCrypto
90
+ if (!crypto) {
91
+ return yield* Effect.die(new Error("Web Crypto API is not available"))
92
+ }
93
+ const randomBytes = (size: number): Uint8Array => {
94
+ const bytes = new Uint8Array(size)
95
+ crypto.getRandomValues(bytes)
96
+ return bytes
97
+ }
98
+
99
+ const digest: EffectCrypto.Crypto["digest"] = (algorithm, data) => {
100
+ if (typeof crypto.subtle.digest !== "function") {
101
+ return Effect.fail(PlatformError.systemError({
102
+ module: "Crypto",
103
+ method: "digest",
104
+ _tag: "Unknown",
105
+ description: "crypto.subtle.digest is not available"
106
+ }))
107
+ }
108
+ return Effect.map(
109
+ Effect.tryPromise({
110
+ try: () => crypto.subtle.digest(algorithm, new Uint8Array(data)),
111
+ catch: (cause) =>
112
+ PlatformError.systemError({
113
+ module: "Crypto",
114
+ method: "digest",
115
+ _tag: "Unknown",
116
+ description: "Could not compute digest",
117
+ cause
118
+ })
119
+ }),
120
+ (buffer) => new Uint8Array(buffer)
121
+ )
122
+ }
123
+
124
+ return EffectCrypto.make({
125
+ randomBytes,
126
+ digest
127
+ })
128
+ })
129
+ )