@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.
- package/dist/BrowserCrypto.d.ts +81 -0
- package/dist/BrowserCrypto.d.ts.map +1 -0
- package/dist/BrowserCrypto.js +119 -0
- package/dist/BrowserCrypto.js.map +1 -0
- package/dist/BrowserHttpClient.d.ts +40 -16
- package/dist/BrowserHttpClient.d.ts.map +1 -1
- package/dist/BrowserHttpClient.js +74 -18
- package/dist/BrowserHttpClient.js.map +1 -1
- package/dist/BrowserKeyValueStore.d.ts +37 -14
- package/dist/BrowserKeyValueStore.d.ts.map +1 -1
- package/dist/BrowserKeyValueStore.js +185 -10
- package/dist/BrowserKeyValueStore.js.map +1 -1
- package/dist/BrowserPersistence.d.ts +40 -0
- package/dist/BrowserPersistence.d.ts.map +1 -0
- package/dist/BrowserPersistence.js +207 -0
- package/dist/BrowserPersistence.js.map +1 -0
- package/dist/BrowserRuntime.d.ts +79 -4
- package/dist/BrowserRuntime.d.ts.map +1 -1
- package/dist/BrowserRuntime.js +19 -1
- package/dist/BrowserRuntime.js.map +1 -1
- package/dist/BrowserSocket.d.ts +64 -6
- package/dist/BrowserSocket.d.ts.map +1 -1
- package/dist/BrowserSocket.js +64 -6
- package/dist/BrowserSocket.js.map +1 -1
- package/dist/BrowserStream.d.ts +48 -5
- package/dist/BrowserStream.d.ts.map +1 -1
- package/dist/BrowserStream.js +48 -5
- package/dist/BrowserStream.js.map +1 -1
- package/dist/BrowserWorker.d.ts +25 -4
- package/dist/BrowserWorker.d.ts.map +1 -1
- package/dist/BrowserWorker.js +62 -6
- package/dist/BrowserWorker.js.map +1 -1
- package/dist/BrowserWorkerRunner.d.ts +31 -6
- package/dist/BrowserWorkerRunner.d.ts.map +1 -1
- package/dist/BrowserWorkerRunner.js +65 -10
- package/dist/BrowserWorkerRunner.js.map +1 -1
- package/dist/Clipboard.d.ts +77 -13
- package/dist/Clipboard.d.ts.map +1 -1
- package/dist/Clipboard.js +57 -11
- package/dist/Clipboard.js.map +1 -1
- package/dist/Geolocation.d.ts +101 -24
- package/dist/Geolocation.d.ts.map +1 -1
- package/dist/Geolocation.js +69 -16
- package/dist/Geolocation.js.map +1 -1
- package/dist/IndexedDb.d.ts +89 -0
- package/dist/IndexedDb.d.ts.map +1 -0
- package/dist/IndexedDb.js +99 -0
- package/dist/IndexedDb.js.map +1 -0
- package/dist/IndexedDbDatabase.d.ts +169 -0
- package/dist/IndexedDbDatabase.d.ts.map +1 -0
- package/dist/IndexedDbDatabase.js +343 -0
- package/dist/IndexedDbDatabase.js.map +1 -0
- package/dist/IndexedDbQueryBuilder.d.ts +438 -0
- package/dist/IndexedDbQueryBuilder.d.ts.map +1 -0
- package/dist/IndexedDbQueryBuilder.js +935 -0
- package/dist/IndexedDbQueryBuilder.js.map +1 -0
- package/dist/IndexedDbTable.d.ts +191 -0
- package/dist/IndexedDbTable.d.ts.map +1 -0
- package/dist/IndexedDbTable.js +96 -0
- package/dist/IndexedDbTable.js.map +1 -0
- package/dist/IndexedDbVersion.d.ts +94 -0
- package/dist/IndexedDbVersion.d.ts.map +1 -0
- package/dist/IndexedDbVersion.js +39 -0
- package/dist/IndexedDbVersion.js.map +1 -0
- package/dist/Permissions.d.ts +76 -16
- package/dist/Permissions.d.ts.map +1 -1
- package/dist/Permissions.js +66 -11
- package/dist/Permissions.js.map +1 -1
- package/dist/index.d.ts +38 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +38 -10
- package/dist/index.js.map +1 -1
- package/package.json +4 -3
- package/src/BrowserCrypto.ts +129 -0
- package/src/BrowserHttpClient.ts +84 -24
- package/src/BrowserKeyValueStore.ts +201 -12
- package/src/BrowserPersistence.ts +376 -0
- package/src/BrowserRuntime.ts +79 -4
- package/src/BrowserSocket.ts +64 -6
- package/src/BrowserStream.ts +48 -5
- package/src/BrowserWorker.ts +62 -6
- package/src/BrowserWorkerRunner.ts +65 -10
- package/src/Clipboard.ts +74 -13
- package/src/Geolocation.ts +97 -20
- package/src/IndexedDb.ts +127 -0
- package/src/IndexedDbDatabase.ts +664 -0
- package/src/IndexedDbQueryBuilder.ts +2048 -0
- package/src/IndexedDbTable.ts +285 -0
- package/src/IndexedDbVersion.ts +133 -0
- package/src/Permissions.ts +71 -14
- package/src/index.ts +45 -10
package/dist/Permissions.d.ts
CHANGED
|
@@ -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
|
-
* @
|
|
11
|
-
* @
|
|
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").
|
|
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
|
-
*
|
|
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").
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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").
|
|
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
|
-
*
|
|
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
|
-
*
|
|
69
|
-
*
|
|
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:
|
|
121
|
+
export declare const Permissions: Context.Service<Permissions, Permissions>;
|
|
72
122
|
/**
|
|
73
|
-
*
|
|
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
|
-
* @
|
|
76
|
-
* @
|
|
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":"
|
|
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"}
|
package/dist/Permissions.js
CHANGED
|
@@ -1,15 +1,49 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
46
|
-
*
|
|
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__*/
|
|
93
|
+
export const Permissions = /*#__PURE__*/Context.Service(TypeId);
|
|
49
94
|
/**
|
|
50
|
-
*
|
|
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
|
-
* @
|
|
53
|
-
* @
|
|
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,
|
package/dist/Permissions.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Permissions.js","names":["Data","Effect","Layer","
|
|
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
|
|
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
|
|
13
|
+
* @since 4.0.0
|
|
10
14
|
*/
|
|
11
15
|
export * as BrowserKeyValueStore from "./BrowserKeyValueStore.ts";
|
|
12
16
|
/**
|
|
13
|
-
* @since
|
|
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
|
|
25
|
+
* @since 4.0.0
|
|
18
26
|
*/
|
|
19
27
|
export * as BrowserSocket from "./BrowserSocket.ts";
|
|
20
28
|
/**
|
|
21
|
-
* @since
|
|
29
|
+
* @since 4.0.0
|
|
22
30
|
*/
|
|
23
31
|
export * as BrowserStream from "./BrowserStream.ts";
|
|
24
32
|
/**
|
|
25
|
-
* @since
|
|
33
|
+
* @since 4.0.0
|
|
26
34
|
*/
|
|
27
35
|
export * as BrowserWorker from "./BrowserWorker.ts";
|
|
28
36
|
/**
|
|
29
|
-
* @since
|
|
37
|
+
* @since 4.0.0
|
|
30
38
|
*/
|
|
31
39
|
export * as BrowserWorkerRunner from "./BrowserWorkerRunner.ts";
|
|
32
40
|
/**
|
|
33
|
-
* @since
|
|
41
|
+
* @since 4.0.0
|
|
34
42
|
*/
|
|
35
43
|
export * as Clipboard from "./Clipboard.ts";
|
|
36
44
|
/**
|
|
37
|
-
* @since
|
|
45
|
+
* @since 4.0.0
|
|
38
46
|
*/
|
|
39
47
|
export * as Geolocation from "./Geolocation.ts";
|
|
40
48
|
/**
|
|
41
|
-
* @since
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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
|
|
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
|
|
14
|
+
* @since 4.0.0
|
|
11
15
|
*/
|
|
12
16
|
export * as BrowserKeyValueStore from "./BrowserKeyValueStore.js";
|
|
13
17
|
/**
|
|
14
|
-
* @since
|
|
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
|
|
26
|
+
* @since 4.0.0
|
|
19
27
|
*/
|
|
20
28
|
export * as BrowserSocket from "./BrowserSocket.js";
|
|
21
29
|
/**
|
|
22
|
-
* @since
|
|
30
|
+
* @since 4.0.0
|
|
23
31
|
*/
|
|
24
32
|
export * as BrowserStream from "./BrowserStream.js";
|
|
25
33
|
/**
|
|
26
|
-
* @since
|
|
34
|
+
* @since 4.0.0
|
|
27
35
|
*/
|
|
28
36
|
export * as BrowserWorker from "./BrowserWorker.js";
|
|
29
37
|
/**
|
|
30
|
-
* @since
|
|
38
|
+
* @since 4.0.0
|
|
31
39
|
*/
|
|
32
40
|
export * as BrowserWorkerRunner from "./BrowserWorkerRunner.js";
|
|
33
41
|
/**
|
|
34
|
-
* @since
|
|
42
|
+
* @since 4.0.0
|
|
35
43
|
*/
|
|
36
44
|
export * as Clipboard from "./Clipboard.js";
|
|
37
45
|
/**
|
|
38
|
-
* @since
|
|
46
|
+
* @since 4.0.0
|
|
39
47
|
*/
|
|
40
48
|
export * as Geolocation from "./Geolocation.js";
|
|
41
49
|
/**
|
|
42
|
-
* @since
|
|
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.
|
|
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.
|
|
48
|
+
"effect": "^4.0.0-beta.71"
|
|
49
49
|
},
|
|
50
50
|
"devDependencies": {
|
|
51
51
|
"mock-xmlhttprequest": "^8.4.1",
|
|
52
|
-
"
|
|
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
|
+
)
|