@effect/platform-browser 0.0.0-snapshot-c0ae728e57df2c572ea803e1bb7121088cd67b49

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 (126) hide show
  1. package/Clipboard/package.json +6 -0
  2. package/Effectify/package.json +6 -0
  3. package/Error/package.json +6 -0
  4. package/HttpClient/package.json +6 -0
  5. package/KeyValueStore/package.json +6 -0
  6. package/LICENSE +21 -0
  7. package/Path/package.json +6 -0
  8. package/README.md +64 -0
  9. package/Runtime/package.json +6 -0
  10. package/Transferable/package.json +6 -0
  11. package/Worker/package.json +6 -0
  12. package/WorkerRunner/package.json +6 -0
  13. package/dist/cjs/Clipboard.js +54 -0
  14. package/dist/cjs/Clipboard.js.map +1 -0
  15. package/dist/cjs/Effectify.js +13 -0
  16. package/dist/cjs/Effectify.js.map +1 -0
  17. package/dist/cjs/Error.js +25 -0
  18. package/dist/cjs/Error.js.map +1 -0
  19. package/dist/cjs/HttpClient.js +46 -0
  20. package/dist/cjs/HttpClient.js.map +1 -0
  21. package/dist/cjs/KeyValueStore.js +73 -0
  22. package/dist/cjs/KeyValueStore.js.map +1 -0
  23. package/dist/cjs/Path.js +17 -0
  24. package/dist/cjs/Path.js.map +1 -0
  25. package/dist/cjs/Runtime.js +38 -0
  26. package/dist/cjs/Runtime.js.map +1 -0
  27. package/dist/cjs/Transferable.js +17 -0
  28. package/dist/cjs/Transferable.js.map +1 -0
  29. package/dist/cjs/Worker.js +87 -0
  30. package/dist/cjs/Worker.js.map +1 -0
  31. package/dist/cjs/WorkerRunner.js +69 -0
  32. package/dist/cjs/WorkerRunner.js.map +1 -0
  33. package/dist/cjs/index.js +52 -0
  34. package/dist/cjs/index.js.map +1 -0
  35. package/dist/cjs/internal/clipboard.js +88 -0
  36. package/dist/cjs/internal/clipboard.js.map +1 -0
  37. package/dist/cjs/internal/keyValueStore.js +128 -0
  38. package/dist/cjs/internal/keyValueStore.js.map +1 -0
  39. package/dist/cjs/internal/runtime.js +47 -0
  40. package/dist/cjs/internal/runtime.js.map +1 -0
  41. package/dist/cjs/internal/worker.js +89 -0
  42. package/dist/cjs/internal/worker.js.map +1 -0
  43. package/dist/cjs/internal/workerRunner.js +101 -0
  44. package/dist/cjs/internal/workerRunner.js.map +1 -0
  45. package/dist/dts/Clipboard.d.ts +37 -0
  46. package/dist/dts/Clipboard.d.ts.map +1 -0
  47. package/dist/dts/Effectify.d.ts +19 -0
  48. package/dist/dts/Effectify.d.ts.map +1 -0
  49. package/dist/dts/Error.d.ts +31 -0
  50. package/dist/dts/Error.d.ts.map +1 -0
  51. package/dist/dts/HttpClient.d.ts +61 -0
  52. package/dist/dts/HttpClient.d.ts.map +1 -0
  53. package/dist/dts/KeyValueStore.d.ts +19 -0
  54. package/dist/dts/KeyValueStore.d.ts.map +1 -0
  55. package/dist/dts/Path.d.ts +7 -0
  56. package/dist/dts/Path.d.ts.map +1 -0
  57. package/dist/dts/Runtime.d.ts +10 -0
  58. package/dist/dts/Runtime.d.ts.map +1 -0
  59. package/dist/dts/Transferable.d.ts +7 -0
  60. package/dist/dts/Transferable.d.ts.map +1 -0
  61. package/dist/dts/Worker.d.ts +46 -0
  62. package/dist/dts/Worker.d.ts.map +1 -0
  63. package/dist/dts/WorkerRunner.d.ts +30 -0
  64. package/dist/dts/WorkerRunner.d.ts.map +1 -0
  65. package/dist/dts/index.d.ts +51 -0
  66. package/dist/dts/index.d.ts.map +1 -0
  67. package/dist/dts/internal/clipboard.d.ts +2 -0
  68. package/dist/dts/internal/clipboard.d.ts.map +1 -0
  69. package/dist/dts/internal/keyValueStore.d.ts +2 -0
  70. package/dist/dts/internal/keyValueStore.d.ts.map +1 -0
  71. package/dist/dts/internal/runtime.d.ts +2 -0
  72. package/dist/dts/internal/runtime.d.ts.map +1 -0
  73. package/dist/dts/internal/worker.d.ts +2 -0
  74. package/dist/dts/internal/worker.d.ts.map +1 -0
  75. package/dist/dts/internal/workerRunner.d.ts +2 -0
  76. package/dist/dts/internal/workerRunner.d.ts.map +1 -0
  77. package/dist/esm/Clipboard.js +22 -0
  78. package/dist/esm/Clipboard.js.map +1 -0
  79. package/dist/esm/Effectify.js +10 -0
  80. package/dist/esm/Effectify.js.map +1 -0
  81. package/dist/esm/Error.js +20 -0
  82. package/dist/esm/Error.js.map +1 -0
  83. package/dist/esm/HttpClient.js +61 -0
  84. package/dist/esm/HttpClient.js.map +1 -0
  85. package/dist/esm/KeyValueStore.js +25 -0
  86. package/dist/esm/KeyValueStore.js.map +1 -0
  87. package/dist/esm/Path.js +7 -0
  88. package/dist/esm/Path.js.map +1 -0
  89. package/dist/esm/Runtime.js +7 -0
  90. package/dist/esm/Runtime.js.map +1 -0
  91. package/dist/esm/Transferable.js +7 -0
  92. package/dist/esm/Transferable.js.map +1 -0
  93. package/dist/esm/Worker.js +36 -0
  94. package/dist/esm/Worker.js.map +1 -0
  95. package/dist/esm/WorkerRunner.js +21 -0
  96. package/dist/esm/WorkerRunner.js.map +1 -0
  97. package/dist/esm/index.js +51 -0
  98. package/dist/esm/index.js.map +1 -0
  99. package/dist/esm/internal/clipboard.js +56 -0
  100. package/dist/esm/internal/clipboard.js.map +1 -0
  101. package/dist/esm/internal/keyValueStore.js +97 -0
  102. package/dist/esm/internal/keyValueStore.js.map +1 -0
  103. package/dist/esm/internal/runtime.js +15 -0
  104. package/dist/esm/internal/runtime.js.map +1 -0
  105. package/dist/esm/internal/worker.js +58 -0
  106. package/dist/esm/internal/worker.js.map +1 -0
  107. package/dist/esm/internal/workerRunner.js +68 -0
  108. package/dist/esm/internal/workerRunner.js.map +1 -0
  109. package/dist/esm/package.json +4 -0
  110. package/package.json +110 -0
  111. package/src/Clipboard.ts +44 -0
  112. package/src/Effectify.ts +22 -0
  113. package/src/Error.ts +34 -0
  114. package/src/HttpClient.ts +62 -0
  115. package/src/KeyValueStore.ts +27 -0
  116. package/src/Path.ts +7 -0
  117. package/src/Runtime.ts +11 -0
  118. package/src/Transferable.ts +7 -0
  119. package/src/Worker.ts +64 -0
  120. package/src/WorkerRunner.ts +45 -0
  121. package/src/index.ts +59 -0
  122. package/src/internal/clipboard.ts +71 -0
  123. package/src/internal/keyValueStore.ts +130 -0
  124. package/src/internal/runtime.ts +20 -0
  125. package/src/internal/worker.ts +72 -0
  126. package/src/internal/workerRunner.ts +92 -0
package/src/Error.ts ADDED
@@ -0,0 +1,34 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+
5
+ export {
6
+ /**
7
+ * @since 1.0.0
8
+ * @category error
9
+ */
10
+ BadArgument,
11
+ /**
12
+ * @since 1.0.0
13
+ * @category type id
14
+ */
15
+ PlatformErrorTypeId,
16
+ /**
17
+ * @since 1.0.0
18
+ * @category error
19
+ */
20
+ SystemError
21
+ } from "@effect/platform/Error"
22
+
23
+ export type {
24
+ /**
25
+ * @since 1.0.0
26
+ * @category model
27
+ */
28
+ PlatformError,
29
+ /**
30
+ * @since 1.0.0
31
+ * @category model
32
+ */
33
+ SystemErrorReason
34
+ } from "@effect/platform/Error"
@@ -0,0 +1,62 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import * as body from "@effect/platform/Http/Body"
5
+ import * as client from "@effect/platform/Http/Client"
6
+ import * as error from "@effect/platform/Http/ClientError"
7
+ import * as request from "@effect/platform/Http/ClientRequest"
8
+ import * as response from "@effect/platform/Http/ClientResponse"
9
+ import * as headers from "@effect/platform/Http/Headers"
10
+ import * as urlParams from "@effect/platform/Http/UrlParams"
11
+
12
+ export {
13
+ /**
14
+ * @since 1.0.0
15
+ *
16
+ * - Docs: [Http/Body](https://effect-ts.github.io/effect/platform/Http/Body.ts.html)
17
+ * - Module: `@effect/platform/Http/Body`
18
+ */
19
+ body,
20
+ /**
21
+ * @since 1.0.0
22
+ *
23
+ * - Docs: [Http/Client](https://effect-ts.github.io/effect/platform/Http/Client.ts.html)
24
+ * - Module: `@effect/platform/Http/Client`
25
+ */
26
+ client,
27
+ /**
28
+ * @since 1.0.0
29
+ *
30
+ * - Docs: [Http/ClientError](https://effect-ts.github.io/effect/platform/Http/ClientError.ts.html)
31
+ * - Module: `@effect/platform/Http/ClientError`
32
+ */
33
+ error,
34
+ /**
35
+ * @since 1.0.0
36
+ *
37
+ * - Docs: [Http/Headers](https://effect-ts.github.io/effect/platform/Http/Headers.ts.html)
38
+ * - Module: `@effect/platform/Http/Headers`
39
+ */
40
+ headers,
41
+ /**
42
+ * @since 1.0.0
43
+ *
44
+ * - Docs: [Http/ClientRequest](https://effect-ts.github.io/effect/platform/Http/ClientRequest.ts.html)
45
+ * - Module: `@effect/platform/Http/ClientRequest`
46
+ */
47
+ request,
48
+ /**
49
+ * @since 1.0.0
50
+ *
51
+ * - Docs: [Http/ClientResponse](https://effect-ts.github.io/effect/platform/Http/ClientResponse.ts.html)
52
+ * - Module: `@effect/platform/Http/ClientResponse`
53
+ */
54
+ response,
55
+ /**
56
+ * @since 1.0.0
57
+ *
58
+ * - Docs: [Http/UrlParams](https://effect-ts.github.io/effect/platform/Http/UrlParams.ts.html)
59
+ * - Module: `@effect/platform/Http/UrlParams`
60
+ */
61
+ urlParams
62
+ }
@@ -0,0 +1,27 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/KeyValueStore`](https://effect-ts.github.io/effect/platform/KeyValueStore.ts.html).
5
+ */
6
+ import * as internal from "./internal/keyValueStore.js"
7
+
8
+ /**
9
+ * @since 1.0.0
10
+ */
11
+ export * from "@effect/platform/KeyValueStore"
12
+
13
+ /**
14
+ * Creates a KeyValueStore layer that uses the browser's localStorage api. Values are stored between sessions.
15
+ *
16
+ * @since 1.0.0
17
+ * @category models
18
+ */
19
+ export const layerLocalStorage = internal.layerLocalStorage
20
+
21
+ /**
22
+ * Creates a KeyValueStore layer that uses the browser's sessionStorage api. Values are stored only for the current session.
23
+ *
24
+ * @since 1.0.0
25
+ * @category models
26
+ */
27
+ export const layerSessionStorage = internal.layerSessionStorage
package/src/Path.ts ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/Path`](https://effect-ts.github.io/effect/platform/Path.ts.html).
5
+ */
6
+
7
+ export * from "@effect/platform/Path"
package/src/Runtime.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ import type * as Effect from "effect/Effect"
5
+ import * as internal from "./internal/runtime.js"
6
+
7
+ /**
8
+ * @since 1.0.0
9
+ * @category runtime
10
+ */
11
+ export const runMain: <E, A>(effect: Effect.Effect<A, E>) => void = internal.runMain
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/Transferable`](https://effect-ts.github.io/effect/platform/Transferable.ts.html).
5
+ */
6
+
7
+ export * from "@effect/platform/Transferable"
package/src/Worker.ts ADDED
@@ -0,0 +1,64 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/effect/platform/Worker.ts.html).
5
+ */
6
+ import type * as Worker from "@effect/platform/Worker"
7
+ import type * as Schema from "@effect/schema/Schema"
8
+ import type * as Context from "effect/Context"
9
+ import type * as Effect from "effect/Effect"
10
+ import type * as Layer from "effect/Layer"
11
+ import type * as Scope from "effect/Scope"
12
+ import * as internal from "./internal/worker.js"
13
+
14
+ /**
15
+ * @since 1.0.0
16
+ */
17
+ export * from "@effect/platform/Worker"
18
+
19
+ /**
20
+ * @since 1.0.0
21
+ * @category constructors
22
+ */
23
+ export const makePool: <I, E, O>(
24
+ options: Worker.WorkerPool.Options<I, Worker | SharedWorker>
25
+ ) => Effect.Effect<Worker.WorkerPool<I, E, O>, never, Worker.WorkerManager | Scope.Scope> = internal.makePool
26
+
27
+ /**
28
+ * @since 1.0.0
29
+ * @category constructors
30
+ */
31
+ export const makePoolLayer: <Tag, I, E, O>(
32
+ tag: Context.Tag<Tag, Worker.WorkerPool<I, E, O>>,
33
+ options: Worker.WorkerPool.Options<I, Worker | SharedWorker>
34
+ ) => Layer.Layer<Tag> = internal.makePoolLayer
35
+
36
+ /**
37
+ * @since 1.0.0
38
+ * @category constructors
39
+ */
40
+ export const makePoolSerialized: <I extends Schema.TaggedRequest.Any>(
41
+ options: Worker.SerializedWorkerPool.Options<I, Worker | SharedWorker>
42
+ ) => Effect.Effect<Worker.SerializedWorkerPool<I>, never, Worker.WorkerManager | Scope.Scope> =
43
+ internal.makePoolSerialized
44
+
45
+ /**
46
+ * @since 1.0.0
47
+ * @category constructors
48
+ */
49
+ export const makePoolSerializedLayer: <Tag, I extends Schema.TaggedRequest.Any>(
50
+ tag: Context.Tag<Tag, Worker.SerializedWorkerPool<I>>,
51
+ options: Worker.SerializedWorkerPool.Options<I, Worker | SharedWorker>
52
+ ) => Layer.Layer<Tag> = internal.makePoolSerializedLayer
53
+
54
+ /**
55
+ * @since 1.0.0
56
+ * @category layers
57
+ */
58
+ export const layerManager: Layer.Layer<Worker.WorkerManager> = internal.layerManager
59
+
60
+ /**
61
+ * @since 1.0.0
62
+ * @category layers
63
+ */
64
+ export const layerWorker: Layer.Layer<Worker.PlatformWorker> = internal.layerWorker
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @since 1.0.0
3
+ *
4
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/effect/platform/WorkerRunner.ts.html).
5
+ */
6
+ import type { WorkerError } from "@effect/platform/WorkerError"
7
+ import type * as Runner from "@effect/platform/WorkerRunner"
8
+ import type * as Schema from "@effect/schema/Schema"
9
+ import type * as Layer from "effect/Layer"
10
+ import type * as Stream from "effect/Stream"
11
+ import * as internal from "./internal/workerRunner.js"
12
+
13
+ /**
14
+ * @since 1.0.0
15
+ */
16
+ export * from "@effect/platform/WorkerRunner"
17
+
18
+ /**
19
+ * @since 1.0.0
20
+ * @category layers
21
+ */
22
+ export const layerPlatform: Layer.Layer<Runner.PlatformRunner> = internal.layerPlatform
23
+
24
+ /**
25
+ * @since 1.0.0
26
+ * @category layers
27
+ */
28
+ export const layer: <I, R, E, O>(
29
+ process: (request: I) => Stream.Stream<O, E, R>,
30
+ options?: Runner.Runner.Options<I, E, O> | undefined
31
+ ) => Layer.Layer<never, WorkerError, R> = internal.layer
32
+
33
+ /**
34
+ * @since 1.0.0
35
+ * @category layers
36
+ */
37
+ export const layerSerialized: <
38
+ A extends Schema.TaggedRequest.Any,
39
+ I,
40
+ R,
41
+ Handlers extends Runner.SerializedRunner.Handlers<A>
42
+ >(
43
+ schema: Schema.Schema<A, I, R>,
44
+ handlers: Handlers
45
+ ) => Layer.Layer<never, WorkerError, R | Runner.SerializedRunner.HandlersContext<Handlers>> = internal.layerSerialized
package/src/index.ts ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @since 1.0.0
3
+ */
4
+ export * as Clipboard from "./Clipboard.js"
5
+
6
+ /**
7
+ * @since 1.0.0
8
+ */
9
+ export * as Effectify from "./Effectify.js"
10
+
11
+ /**
12
+ * @since 1.0.0
13
+ */
14
+ export * as Error from "./Error.js"
15
+
16
+ /**
17
+ * @since 1.0.0
18
+ */
19
+ export * as HttpClient from "./HttpClient.js"
20
+
21
+ /**
22
+ * @since 1.0.0
23
+ *
24
+ * Also includes exports from [`@effect/platform/KeyValueStore`](https://effect-ts.github.io/effect/platform/KeyValueStore.ts.html).
25
+ */
26
+ export * as KeyValueStore from "./KeyValueStore.js"
27
+
28
+ /**
29
+ * @since 1.0.0
30
+ *
31
+ * Also includes exports from [`@effect/platform/Path`](https://effect-ts.github.io/effect/platform/Path.ts.html).
32
+ */
33
+ export * as Path from "./Path.js"
34
+
35
+ /**
36
+ * @since 1.0.0
37
+ */
38
+ export * as Runtime from "./Runtime.js"
39
+
40
+ /**
41
+ * @since 1.0.0
42
+ *
43
+ * Also includes exports from [`@effect/platform/Transferable`](https://effect-ts.github.io/effect/platform/Transferable.ts.html).
44
+ */
45
+ export * as Transferable from "./Transferable.js"
46
+
47
+ /**
48
+ * @since 1.0.0
49
+ *
50
+ * Also includes exports from [`@effect/platform/Worker`](https://effect-ts.github.io/effect/platform/Worker.ts.html).
51
+ */
52
+ export * as Worker from "./Worker.js"
53
+
54
+ /**
55
+ * @since 1.0.0
56
+ *
57
+ * Also includes exports from [`@effect/platform/WorkerRunner`](https://effect-ts.github.io/effect/platform/WorkerRunner.ts.html).
58
+ */
59
+ export * as WorkerRunner from "./WorkerRunner.js"
@@ -0,0 +1,71 @@
1
+ import * as PlatformError from "@effect/platform/Error"
2
+ import { GenericTag } from "effect/Context"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
5
+ import type * as Clipboard from "../Clipboard.js"
6
+
7
+ /** @internal */
8
+ export const tag = GenericTag<Clipboard.Clipboard>("@effect/platform-browser/Clipboard")
9
+
10
+ /** @internal */
11
+ export const make = (
12
+ impl: Omit<Clipboard.Clipboard, "clear" | "writeBlob">
13
+ ): Clipboard.Clipboard =>
14
+ tag.of({
15
+ ...impl,
16
+ clear: impl.writeString(""),
17
+ writeBlob: (blob: Blob) => impl.write([new ClipboardItem({ [blob.type]: blob })])
18
+ })
19
+
20
+ /** @internal */
21
+ const clipboardError = (props: Omit<Parameters<typeof PlatformError.SystemError>[0], "reason" | "module">) =>
22
+ PlatformError.SystemError({
23
+ reason: "PermissionDenied",
24
+ module: "Clipboard",
25
+ ...props
26
+ })
27
+
28
+ /** @internal */
29
+ export const layer = Layer.succeed(
30
+ tag,
31
+ make({
32
+ read: Effect.tryPromise({
33
+ try: () => navigator.clipboard.read(),
34
+ catch: () =>
35
+ clipboardError({
36
+ "message": "Unable to read from clipboard",
37
+ "method": "read",
38
+ "pathOrDescriptor": "layer"
39
+ })
40
+ }),
41
+ write: (s: Array<ClipboardItem>) =>
42
+ Effect.tryPromise({
43
+ try: () => navigator.clipboard.write(s),
44
+ catch: () =>
45
+ clipboardError({
46
+ "message": "Unable to write to clipboard",
47
+ "method": "write",
48
+ "pathOrDescriptor": "layer"
49
+ })
50
+ }),
51
+ readString: Effect.tryPromise({
52
+ try: () => navigator.clipboard.readText(),
53
+ catch: () =>
54
+ clipboardError({
55
+ "message": "Unable to read a string from clipboard",
56
+ "method": "readString",
57
+ "pathOrDescriptor": "layer"
58
+ })
59
+ }),
60
+ writeString: (text: string) =>
61
+ Effect.tryPromise({
62
+ try: () => navigator.clipboard.writeText(text),
63
+ catch: () =>
64
+ clipboardError({
65
+ "message": "Unable to write a string to clipboard",
66
+ "method": "writeString",
67
+ "pathOrDescriptor": "layer"
68
+ })
69
+ })
70
+ })
71
+ )
@@ -0,0 +1,130 @@
1
+ import * as PlatformError from "@effect/platform/Error"
2
+ import * as KeyValueStore from "@effect/platform/KeyValueStore"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
5
+ import * as Option from "effect/Option"
6
+
7
+ const storageError = (props: Omit<Parameters<typeof PlatformError.SystemError>[0], "reason" | "module">) =>
8
+ PlatformError.SystemError({
9
+ reason: "PermissionDenied",
10
+ module: "KeyValueStore",
11
+ ...props
12
+ })
13
+
14
+ /** @internal */
15
+ export const layerLocalStorage = Layer.succeed(
16
+ KeyValueStore.KeyValueStore,
17
+ KeyValueStore.make({
18
+ get: (key: string) =>
19
+ Effect.try({
20
+ try: () => Option.fromNullable(localStorage.getItem(key)),
21
+ catch: () =>
22
+ storageError({
23
+ pathOrDescriptor: "layerLocalStorage",
24
+ method: "get",
25
+ message: `Unable to get item with key ${key}`
26
+ })
27
+ }),
28
+
29
+ set: (key: string, value: string) =>
30
+ Effect.try({
31
+ try: () => localStorage.setItem(key, value),
32
+ catch: () =>
33
+ storageError({
34
+ pathOrDescriptor: "layerLocalStorage",
35
+ method: "set",
36
+ message: `Unable to set item with key ${key}`
37
+ })
38
+ }),
39
+
40
+ remove: (key: string) =>
41
+ Effect.try({
42
+ try: () => localStorage.removeItem(key),
43
+ catch: () =>
44
+ storageError({
45
+ pathOrDescriptor: "layerLocalStorage",
46
+ method: "remove",
47
+ message: `Unable to remove item with key ${key}`
48
+ })
49
+ }),
50
+
51
+ clear: Effect.try({
52
+ try: () => localStorage.clear(),
53
+ catch: () =>
54
+ storageError({
55
+ pathOrDescriptor: "layerLocalStorage",
56
+ method: "clear",
57
+ message: `Unable to clear storage`
58
+ })
59
+ }),
60
+
61
+ size: Effect.try({
62
+ try: () => localStorage.length,
63
+ catch: () =>
64
+ storageError({
65
+ pathOrDescriptor: "layerLocalStorage",
66
+ method: "size",
67
+ message: `Unable to get size`
68
+ })
69
+ })
70
+ })
71
+ )
72
+
73
+ /** @internal */
74
+ export const layerSessionStorage = Layer.succeed(
75
+ KeyValueStore.KeyValueStore,
76
+ KeyValueStore.make({
77
+ get: (key: string) =>
78
+ Effect.try({
79
+ try: () => Option.fromNullable(sessionStorage.getItem(key)),
80
+ catch: () =>
81
+ storageError({
82
+ pathOrDescriptor: "layerSessionStorage",
83
+ method: "get",
84
+ message: `Unable to get item with key ${key}`
85
+ })
86
+ }),
87
+
88
+ set: (key: string, value: string) =>
89
+ Effect.try({
90
+ try: () => sessionStorage.setItem(key, value),
91
+ catch: () =>
92
+ storageError({
93
+ pathOrDescriptor: "layerSessionStorage",
94
+ method: "set",
95
+ message: `Unable to set item with key ${key}`
96
+ })
97
+ }),
98
+
99
+ remove: (key: string) =>
100
+ Effect.try({
101
+ try: () => sessionStorage.removeItem(key),
102
+ catch: () =>
103
+ storageError({
104
+ pathOrDescriptor: "layerSessionStorage",
105
+ method: "remove",
106
+ message: `Unable to remove item with key ${key}`
107
+ })
108
+ }),
109
+
110
+ clear: Effect.try({
111
+ try: () => sessionStorage.clear(),
112
+ catch: () =>
113
+ storageError({
114
+ pathOrDescriptor: "layerSessionStorage",
115
+ method: "clear",
116
+ message: `Unable to clear storage`
117
+ })
118
+ }),
119
+
120
+ size: Effect.try({
121
+ try: () => sessionStorage.length,
122
+ catch: () =>
123
+ storageError({
124
+ pathOrDescriptor: "layerSessionStorage",
125
+ method: "size",
126
+ message: `Unable to get size`
127
+ })
128
+ })
129
+ })
130
+ )
@@ -0,0 +1,20 @@
1
+ import * as Cause from "effect/Cause"
2
+ import * as Effect from "effect/Effect"
3
+
4
+ /** @internal */
5
+ export const runMain = <E, A>(
6
+ effect: Effect.Effect<A, E>
7
+ ) => {
8
+ const fiber = Effect.runFork(
9
+ Effect.tapErrorCause(effect, (cause) => {
10
+ if (Cause.isInterruptedOnly(cause)) {
11
+ return Effect.unit
12
+ }
13
+ return Effect.logError(cause)
14
+ })
15
+ )
16
+
17
+ addEventListener("beforeunload", () => {
18
+ Effect.runFork(fiber.interruptAsFork(fiber.id()))
19
+ })
20
+ }
@@ -0,0 +1,72 @@
1
+ import * as Worker from "@effect/platform/Worker"
2
+ import { WorkerError } from "@effect/platform/WorkerError"
3
+ import * as Effect from "effect/Effect"
4
+ import * as Layer from "effect/Layer"
5
+ import * as Queue from "effect/Queue"
6
+
7
+ const platformWorkerImpl = Worker.PlatformWorker.of({
8
+ [Worker.PlatformWorkerTypeId]: Worker.PlatformWorkerTypeId,
9
+ spawn<I, O>(worker_: unknown) {
10
+ return Effect.gen(function*(_) {
11
+ const worker = worker_ as globalThis.SharedWorker | globalThis.Worker
12
+ let port: globalThis.Worker | MessagePort
13
+ if ("port" in worker) {
14
+ port = worker.port
15
+ port.start()
16
+ } else {
17
+ port = worker
18
+ }
19
+
20
+ yield* _(Effect.addFinalizer(() => Effect.sync(() => port.postMessage([1]))))
21
+
22
+ const queue = yield* _(Queue.unbounded<Worker.BackingWorker.Message<O>>())
23
+
24
+ const fiber = yield* _(
25
+ Effect.async<never, WorkerError, never>((resume) => {
26
+ function onMessage(event: MessageEvent) {
27
+ queue.unsafeOffer((event as MessageEvent).data)
28
+ }
29
+ function onError(event: ErrorEvent) {
30
+ resume(Effect.fail(WorkerError("unknown", event.message, event.error?.stack)))
31
+ }
32
+ port.addEventListener("message", onMessage as any)
33
+ port.addEventListener("error", onError as any)
34
+ return Effect.sync(() => {
35
+ port.removeEventListener("message", onMessage as any)
36
+ port.removeEventListener("error", onError as any)
37
+ })
38
+ }),
39
+ Effect.interruptible,
40
+ Effect.forkScoped
41
+ )
42
+
43
+ const send = (message: I, transfers?: ReadonlyArray<unknown>) =>
44
+ Effect.try({
45
+ try: () => port.postMessage([0, message], transfers as any),
46
+ catch: (error) => WorkerError("send", (error as any).message, (error as any).stack)
47
+ })
48
+
49
+ return { fiber, queue, send }
50
+ })
51
+ }
52
+ })
53
+
54
+ /** @internal */
55
+ export const layerWorker = Layer.succeed(Worker.PlatformWorker, platformWorkerImpl)
56
+
57
+ /** @internal */
58
+ export const layerManager = Layer.provide(Worker.layerManager, layerWorker)
59
+
60
+ /** @internal */
61
+ export const makePool = Worker.makePool<globalThis.Worker | globalThis.SharedWorker>()
62
+
63
+ /** @internal */
64
+ export const makePoolLayer = Worker.makePoolLayer<globalThis.Worker | globalThis.SharedWorker>(layerManager)
65
+
66
+ /** @internal */
67
+ export const makePoolSerialized = Worker.makePoolSerialized<globalThis.Worker | globalThis.SharedWorker>()
68
+
69
+ /** @internal */
70
+ export const makePoolSerializedLayer = Worker.makePoolSerializedLayer<globalThis.Worker | globalThis.SharedWorker>(
71
+ layerManager
72
+ )