@effect/platform-browser 4.0.0-beta.8 → 4.0.0-beta.80

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 +49 -0
  2. package/dist/BrowserCrypto.d.ts.map +1 -0
  3. package/dist/BrowserCrypto.js +87 -0
  4. package/dist/BrowserCrypto.js.map +1 -0
  5. package/dist/BrowserHttpClient.d.ts +48 -19
  6. package/dist/BrowserHttpClient.d.ts.map +1 -1
  7. package/dist/BrowserHttpClient.js +62 -21
  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 +144 -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 +64 -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 +33 -6
  22. package/dist/BrowserSocket.d.ts.map +1 -1
  23. package/dist/BrowserSocket.js +33 -6
  24. package/dist/BrowserSocket.js.map +1 -1
  25. package/dist/BrowserStream.d.ts +19 -7
  26. package/dist/BrowserStream.d.ts.map +1 -1
  27. package/dist/BrowserStream.js +19 -7
  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 +34 -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 +43 -10
  36. package/dist/BrowserWorkerRunner.js.map +1 -1
  37. package/dist/Clipboard.d.ts +59 -14
  38. package/dist/Clipboard.d.ts.map +1 -1
  39. package/dist/Clipboard.js +34 -12
  40. package/dist/Clipboard.js.map +1 -1
  41. package/dist/Geolocation.d.ts +80 -25
  42. package/dist/Geolocation.d.ts.map +1 -1
  43. package/dist/Geolocation.js +48 -17
  44. package/dist/Geolocation.js.map +1 -1
  45. package/dist/IndexedDb.d.ts +75 -0
  46. package/dist/IndexedDb.d.ts.map +1 -0
  47. package/dist/IndexedDb.js +85 -0
  48. package/dist/IndexedDb.js.map +1 -0
  49. package/dist/IndexedDbDatabase.d.ts +153 -0
  50. package/dist/IndexedDbDatabase.d.ts.map +1 -0
  51. package/dist/IndexedDbDatabase.js +327 -0
  52. package/dist/IndexedDbDatabase.js.map +1 -0
  53. package/dist/IndexedDbQueryBuilder.d.ts +422 -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 +166 -0
  58. package/dist/IndexedDbTable.d.ts.map +1 -0
  59. package/dist/IndexedDbTable.js +71 -0
  60. package/dist/IndexedDbTable.js.map +1 -0
  61. package/dist/IndexedDbVersion.d.ts +99 -0
  62. package/dist/IndexedDbVersion.d.ts.map +1 -0
  63. package/dist/IndexedDbVersion.js +44 -0
  64. package/dist/IndexedDbVersion.js.map +1 -0
  65. package/dist/Permissions.d.ts +52 -16
  66. package/dist/Permissions.d.ts.map +1 -1
  67. package/dist/Permissions.js +42 -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 +97 -0
  75. package/src/BrowserHttpClient.ts +72 -27
  76. package/src/BrowserKeyValueStore.ts +160 -12
  77. package/src/BrowserPersistence.ts +334 -0
  78. package/src/BrowserRuntime.ts +64 -4
  79. package/src/BrowserSocket.ts +33 -6
  80. package/src/BrowserStream.ts +19 -7
  81. package/src/BrowserWorker.ts +34 -6
  82. package/src/BrowserWorkerRunner.ts +43 -10
  83. package/src/Clipboard.ts +56 -14
  84. package/src/Geolocation.ts +76 -21
  85. package/src/IndexedDb.ts +113 -0
  86. package/src/IndexedDbDatabase.ts +648 -0
  87. package/src/IndexedDbQueryBuilder.ts +2032 -0
  88. package/src/IndexedDbTable.ts +260 -0
  89. package/src/IndexedDbVersion.ts +138 -0
  90. package/src/Permissions.ts +47 -14
  91. package/src/index.ts +45 -10
@@ -1,20 +1,154 @@
1
- import * as KeyValueStore from "effect/unstable/persistence/KeyValueStore";
2
1
  /**
3
- * Creates a `KeyValueStore` layer that uses the browser's `localStorage` api.
2
+ * Browser-backed `KeyValueStore` layers for client-side Effect programs.
4
3
  *
5
- * Values are stored between sessions.
4
+ * This module provides browser implementations of the unstable persistence
5
+ * `KeyValueStore` service. Use {@link layerLocalStorage} for small
6
+ * origin-scoped values that should survive reloads and browser restarts, use
7
+ * {@link layerSessionStorage} for tab / page-session state, and use
8
+ * {@link layerIndexedDb} when the store should be asynchronous and backed by
9
+ * IndexedDB. The IndexedDB layer requires the browser `IndexedDb` service and
10
+ * accepts an optional database name.
6
11
  *
7
- * @since 1.0.0
8
- * @category Layers
12
+ * @since 4.0.0
9
13
  */
10
- export const layerLocalStorage = /*#__PURE__*/KeyValueStore.layerStorage(() => globalThis.localStorage);
14
+ import * as Effect from "effect/Effect";
15
+ import * as Layer from "effect/Layer";
16
+ import * as KeyValueStore from "effect/unstable/persistence/KeyValueStore";
17
+ import { IndexedDb } from "./IndexedDb.js";
11
18
  /**
12
- * Creates a `KeyValueStore` layer that uses the browser's `sessionStorage` api.
19
+ * Creates a `KeyValueStore` layer that uses the browser's `localStorage` API and stores values between browser sessions.
13
20
  *
14
- * Values are stored only for the current session.
21
+ * @category layers
22
+ * @since 4.0.0
23
+ */
24
+ export const layerLocalStorage = /*#__PURE__*/KeyValueStore.layerStorage(() => globalThis.localStorage);
25
+ /**
26
+ * Creates a `KeyValueStore` layer that uses the browser's `sessionStorage` API and stores values only for the current session.
15
27
  *
16
- * @since 1.0.0
17
- * @category Layers
28
+ * @category layers
29
+ * @since 4.0.0
18
30
  */
19
31
  export const layerSessionStorage = /*#__PURE__*/KeyValueStore.layerStorage(() => globalThis.sessionStorage);
32
+ /**
33
+ * Creates a `KeyValueStore` layer backed by IndexedDB.
34
+ *
35
+ * **When to use**
36
+ *
37
+ * Use when you need persistent asynchronous IndexedDB storage for a browser
38
+ * `KeyValueStore` instead of the synchronous Web Storage APIs.
39
+ *
40
+ * **Details**
41
+ *
42
+ * The database name defaults to `"effect_key_value_store"`. The layer requires
43
+ * the `IndexedDb` service and stores string and `Uint8Array` values in the same
44
+ * backing object store.
45
+ *
46
+ * **Gotchas**
47
+ *
48
+ * IndexedDB may be unavailable or blocked by browser settings, private browsing,
49
+ * quota limits, or restricted contexts. The string and `Uint8Array` accessors do
50
+ * not coerce values stored with the other representation.
51
+ *
52
+ * @see {@link layerLocalStorage} for synchronous persistent Web Storage
53
+ * @see {@link layerSessionStorage} for synchronous tab-session Web Storage
54
+ *
55
+ * @category layers
56
+ * @since 4.0.0
57
+ */
58
+ export const layerIndexedDb = options => Layer.effect(KeyValueStore.KeyValueStore)(Effect.gen(function* () {
59
+ const db = yield* Effect.acquireRelease(openDatabase(options?.database ?? "effect_key_value_store"), db => Effect.sync(() => db.close())).pipe(Effect.orDie);
60
+ return KeyValueStore.make({
61
+ clear: Effect.suspend(() => {
62
+ const store = getKvsEntriesStore(db, "readwrite");
63
+ return idbRequest({
64
+ method: "clear",
65
+ message: "Failed to clear backing store"
66
+ }, () => store.clear());
67
+ }),
68
+ get: key => Effect.map(Effect.suspend(() => {
69
+ const store = getKvsEntriesStore(db, "readonly");
70
+ return idbRequest({
71
+ method: "get",
72
+ message: "Failed to get value from backing store",
73
+ key
74
+ }, () => store.get(key));
75
+ }), found => typeof found?.value === "string" ? found.value : undefined),
76
+ getUint8Array: key => Effect.map(Effect.suspend(() => {
77
+ const store = getKvsEntriesStore(db, "readonly");
78
+ return idbRequest({
79
+ method: "getUint8Array",
80
+ message: "Failed to get value from backing store",
81
+ key
82
+ }, () => store.get(key));
83
+ }), found => found?.value && found.value instanceof Uint8Array ? found.value : undefined),
84
+ set: (key, value) => Effect.asVoid(Effect.suspend(() => {
85
+ const store = getKvsEntriesStore(db, "readwrite");
86
+ return idbRequest({
87
+ method: "set",
88
+ message: "Failed to set value in backing store",
89
+ key
90
+ }, () => store.put({
91
+ key,
92
+ value
93
+ }));
94
+ })),
95
+ size: Effect.suspend(() => {
96
+ const store = getKvsEntriesStore(db, "readonly");
97
+ return idbRequest({
98
+ method: "size",
99
+ message: "Failed to get backing store size"
100
+ }, () => store.count());
101
+ }),
102
+ remove: key => Effect.asVoid(Effect.suspend(() => {
103
+ const store = getKvsEntriesStore(db, "readwrite");
104
+ return idbRequest({
105
+ method: "remove",
106
+ message: "Failed to remove value from backing store",
107
+ key
108
+ }, () => store.delete(key));
109
+ }))
110
+ });
111
+ }));
112
+ const databaseVersion = 1;
113
+ const entriesStoreName = "entries";
114
+ const openDatabase = /*#__PURE__*/Effect.fnUntraced(function* (database) {
115
+ const idb = (yield* IndexedDb).indexedDB;
116
+ const openRequest = yield* Effect.try({
117
+ try: () => idb.open(database, databaseVersion),
118
+ catch: cause => new KeyValueStore.KeyValueStoreError({
119
+ method: "open",
120
+ message: "Failed to open backing store database",
121
+ cause
122
+ })
123
+ });
124
+ openRequest.onupgradeneeded = () => {
125
+ const db = openRequest.result;
126
+ if (!db.objectStoreNames.contains(entriesStoreName)) {
127
+ db.createObjectStore(entriesStoreName, {
128
+ keyPath: "key"
129
+ });
130
+ }
131
+ };
132
+ return yield* idbRequest({
133
+ method: "open",
134
+ message: "Failed to open backing store database"
135
+ }, () => openRequest);
136
+ });
137
+ const idbRequest = (failArgs, evaluate) => Effect.callback(resume => {
138
+ const request = evaluate();
139
+ if (request.readyState === "done") {
140
+ return resume(Effect.succeed(request.result));
141
+ }
142
+ request.onsuccess = () => {
143
+ resume(Effect.succeed(request.result));
144
+ };
145
+ request.onerror = () => resume(Effect.fail(new KeyValueStore.KeyValueStoreError({
146
+ ...failArgs,
147
+ cause: request.error
148
+ })));
149
+ });
150
+ const getKvsEntriesStore = (db, mode) => {
151
+ const transaction = db.transaction(entriesStoreName, mode);
152
+ return transaction.objectStore(entriesStoreName);
153
+ };
20
154
  //# sourceMappingURL=BrowserKeyValueStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserKeyValueStore.js","names":["KeyValueStore","layerLocalStorage","layerStorage","globalThis","localStorage","layerSessionStorage","sessionStorage"],"sources":["../src/BrowserKeyValueStore.ts"],"sourcesContent":[null],"mappings":"AAIA,OAAO,KAAKA,aAAa,MAAM,2CAA2C;AAE1E;;;;;;;;AAQA,OAAO,MAAMC,iBAAiB,gBAA6CD,aAAa,CAACE,YAAY,CAAC,MACpGC,UAAU,CAACC,YAAY,CACxB;AAED;;;;;;;;AAQA,OAAO,MAAMC,mBAAmB,gBAA6CL,aAAa,CAACE,YAAY,CAAC,MACtGC,UAAU,CAACG,cAAc,CAC1B","ignoreList":[]}
1
+ {"version":3,"file":"BrowserKeyValueStore.js","names":["Effect","Layer","KeyValueStore","IndexedDb","layerLocalStorage","layerStorage","globalThis","localStorage","layerSessionStorage","sessionStorage","layerIndexedDb","options","effect","gen","db","acquireRelease","openDatabase","database","sync","close","pipe","orDie","make","clear","suspend","store","getKvsEntriesStore","idbRequest","method","message","get","key","map","found","value","undefined","getUint8Array","Uint8Array","set","asVoid","put","size","count","remove","delete","databaseVersion","entriesStoreName","fnUntraced","idb","indexedDB","openRequest","try","open","catch","cause","KeyValueStoreError","onupgradeneeded","result","objectStoreNames","contains","createObjectStore","keyPath","failArgs","evaluate","callback","resume","request","readyState","succeed","onsuccess","onerror","fail","error","mode","transaction","objectStore"],"sources":["../src/BrowserKeyValueStore.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,40 @@
1
+ import * as Layer from "effect/Layer";
2
+ import * as Persistence from "effect/unstable/persistence/Persistence";
3
+ /**
4
+ * Creates a `BackingPersistence` layer backed by IndexedDB, optionally using the provided database name.
5
+ *
6
+ * **When to use**
7
+ *
8
+ * Use when composing persistence manually and the lower-level
9
+ * `BackingPersistence` service should be backed by browser IndexedDB.
10
+ *
11
+ * **Details**
12
+ *
13
+ * The database name defaults to `"effect_persistence"`. Entries are stored by
14
+ * persistence store id and key in a shared object store, and TTL expiration is
15
+ * checked when values are read.
16
+ *
17
+ * **Gotchas**
18
+ *
19
+ * Opening the database is defected during layer acquisition if IndexedDB is
20
+ * unavailable or cannot be opened. Store operations report `PersistenceError`
21
+ * for IndexedDB request, transaction, quota, and structured-clone failures.
22
+ *
23
+ * @see {@link layerIndexedDb} for providing the higher-level `Persistence` service
24
+ *
25
+ * @category layers
26
+ * @since 4.0.0
27
+ */
28
+ export declare const layerBackingIndexedDb: (options?: {
29
+ readonly database?: string | undefined;
30
+ }) => Layer.Layer<Persistence.BackingPersistence>;
31
+ /**
32
+ * Creates a `Persistence` layer backed by IndexedDB, optionally using the provided database name.
33
+ *
34
+ * @category layers
35
+ * @since 4.0.0
36
+ */
37
+ export declare const layerIndexedDb: (options?: {
38
+ readonly database?: string | undefined;
39
+ }) => Layer.Layer<Persistence.Persistence>;
40
+ //# sourceMappingURL=BrowserPersistence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserPersistence.d.ts","sourceRoot":"","sources":["../src/BrowserPersistence.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,WAAW,MAAM,yCAAyC,CAAA;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,qBAAqB,GAAI,UAAU;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC,KAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,kBAAkB,CAoBzC,CAAA;AAOL;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,UAAU;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACvC,KAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAGpC,CAAA"}
@@ -0,0 +1,207 @@
1
+ import * as Clock from "effect/Clock";
2
+ import * as Effect from "effect/Effect";
3
+ import * as Layer from "effect/Layer";
4
+ import * as Persistence from "effect/unstable/persistence/Persistence";
5
+ /**
6
+ * Creates a `BackingPersistence` layer backed by IndexedDB, optionally using the provided database name.
7
+ *
8
+ * **When to use**
9
+ *
10
+ * Use when composing persistence manually and the lower-level
11
+ * `BackingPersistence` service should be backed by browser IndexedDB.
12
+ *
13
+ * **Details**
14
+ *
15
+ * The database name defaults to `"effect_persistence"`. Entries are stored by
16
+ * persistence store id and key in a shared object store, and TTL expiration is
17
+ * checked when values are read.
18
+ *
19
+ * **Gotchas**
20
+ *
21
+ * Opening the database is defected during layer acquisition if IndexedDB is
22
+ * unavailable or cannot be opened. Store operations report `PersistenceError`
23
+ * for IndexedDB request, transaction, quota, and structured-clone failures.
24
+ *
25
+ * @see {@link layerIndexedDb} for providing the higher-level `Persistence` service
26
+ *
27
+ * @category layers
28
+ * @since 4.0.0
29
+ */
30
+ export const layerBackingIndexedDb = options => Layer.effect(Persistence.BackingPersistence)(Effect.gen(function* () {
31
+ const db = yield* Effect.acquireRelease(openDatabase(options?.database ?? defaultDatabase), db => Effect.sync(() => db.close())).pipe(Effect.orDie);
32
+ return Persistence.BackingPersistence.of({
33
+ make: Effect.fnUntraced(function* (storeId) {
34
+ const clock = yield* Clock.Clock;
35
+ return {
36
+ get: key => get(db, clock, storeId, key),
37
+ getMany: keys => getMany(db, clock, storeId, keys),
38
+ set: (key, value, ttl) => set(db, clock, storeId, key, value, ttl),
39
+ setMany: entries => setMany(db, clock, storeId, entries),
40
+ remove: key => remove(db, storeId, key),
41
+ clear: clear(db, storeId)
42
+ };
43
+ })
44
+ });
45
+ }));
46
+ const defaultDatabase = "effect_persistence";
47
+ const databaseVersion = 1;
48
+ const entriesStoreName = "entries";
49
+ const storeIdIndexName = "storeId";
50
+ /**
51
+ * Creates a `Persistence` layer backed by IndexedDB, optionally using the provided database name.
52
+ *
53
+ * @category layers
54
+ * @since 4.0.0
55
+ */
56
+ export const layerIndexedDb = options => Persistence.layer.pipe(Layer.provide(layerBackingIndexedDb(options)));
57
+ const openDatabase = database => Effect.gen(function* () {
58
+ const openRequest = yield* Effect.try({
59
+ try: () => globalThis.indexedDB.open(database, databaseVersion),
60
+ catch: cause => new Persistence.PersistenceError({
61
+ message: "Failed to open backing store database",
62
+ cause
63
+ })
64
+ });
65
+ openRequest.onupgradeneeded = () => {
66
+ const db = openRequest.result;
67
+ const entries = db.objectStoreNames.contains(entriesStoreName) ? openRequest.transaction?.objectStore(entriesStoreName) : db.createObjectStore(entriesStoreName, {
68
+ keyPath: ["storeId", "id"]
69
+ });
70
+ if (entries && !entries.indexNames.contains(storeIdIndexName)) {
71
+ entries.createIndex(storeIdIndexName, storeIdIndexName, {
72
+ unique: false
73
+ });
74
+ }
75
+ };
76
+ return yield* idbRequest("Failed to open backing store database", () => openRequest);
77
+ });
78
+ const isExpired = (row, now) => row.expires !== null && row.expires <= now;
79
+ const get = (db, clock, storeId, key) => withEntriesTransaction(db, "readwrite", `Failed to get key ${key} from backing store`, (entries, setResult, fail) => {
80
+ const now = clock.currentTimeMillisUnsafe();
81
+ const id = [storeId, key];
82
+ const request = entries.get(id);
83
+ request.onerror = () => fail(request.error);
84
+ request.onsuccess = () => {
85
+ const row = request.result;
86
+ if (!row || !isExpired(row, now)) {
87
+ setResult(row?.value);
88
+ return;
89
+ }
90
+ const deleteRequest = entries.delete(id);
91
+ deleteRequest.onerror = () => fail(deleteRequest.error);
92
+ deleteRequest.onsuccess = () => setResult(undefined);
93
+ };
94
+ });
95
+ const getMany = (db, clock, storeId, keys) => withEntriesTransaction(db, "readwrite", "Failed to getMany from backing store", (entries, setResult, fail) => {
96
+ const now = clock.currentTimeMillisUnsafe();
97
+ const results = new Array(keys.length);
98
+ setResult(results);
99
+ for (let i = 0; i < keys.length; i++) {
100
+ const key = keys[i];
101
+ const keyPath = [storeId, key];
102
+ const request = entries.get(keyPath);
103
+ request.onerror = () => fail(request.error);
104
+ request.onsuccess = () => {
105
+ const row = request.result;
106
+ if (!row) return;else if (!isExpired(row, now)) {
107
+ results[i] = row.value;
108
+ return;
109
+ }
110
+ const deleteRequest = entries.delete(keyPath);
111
+ deleteRequest.onerror = () => fail(deleteRequest.error);
112
+ };
113
+ }
114
+ });
115
+ const set = (db, clock, storeId, key, value, ttl) => withEntriesTransaction(db, "readwrite", `Failed to set key ${key} in backing store`, (entries, setResult, fail) => {
116
+ const request = entries.put({
117
+ storeId,
118
+ id: key,
119
+ value,
120
+ expires: Persistence.unsafeTtlToExpires(clock, ttl)
121
+ });
122
+ request.onerror = () => fail(request.error);
123
+ request.onsuccess = () => setResult(undefined);
124
+ });
125
+ const setMany = (db, clock, storeId, entries) => withEntriesTransaction(db, "readwrite", "Failed to setMany in backing store", (store, setResult, fail) => {
126
+ for (const [key, value, ttl] of entries) {
127
+ const request = store.put({
128
+ storeId,
129
+ id: key,
130
+ value,
131
+ expires: Persistence.unsafeTtlToExpires(clock, ttl)
132
+ });
133
+ request.onerror = () => fail(request.error);
134
+ request.onsuccess = () => setResult(undefined);
135
+ }
136
+ });
137
+ const remove = (db, storeId, key) => withEntriesTransaction(db, "readwrite", `Failed to remove key ${key} from backing store`, (entries, setResult, fail) => {
138
+ const request = entries.delete([storeId, key]);
139
+ request.onerror = () => fail(request.error);
140
+ request.onsuccess = () => setResult(undefined);
141
+ });
142
+ const clear = (db, storeId) => withEntriesTransaction(db, "readwrite", "Failed to clear backing store", (entries, setResult, fail) => {
143
+ const index = entries.index(storeIdIndexName);
144
+ const cursorRequest = index.openCursor(storeId);
145
+ cursorRequest.onerror = () => fail(cursorRequest.error);
146
+ cursorRequest.onsuccess = () => {
147
+ const cursor = cursorRequest.result;
148
+ if (!cursor) {
149
+ setResult(undefined);
150
+ return;
151
+ }
152
+ const deleteRequest = cursor.delete();
153
+ deleteRequest.onerror = () => fail(deleteRequest.error);
154
+ deleteRequest.onsuccess = () => cursor.continue();
155
+ };
156
+ });
157
+ const withEntriesTransaction = (db, mode, message, run) => Effect.callback(resume => {
158
+ const tx = db.transaction(entriesStoreName, mode);
159
+ const entries = tx.objectStore(entriesStoreName);
160
+ let result;
161
+ let setResult = false;
162
+ let done = false;
163
+ const fail = cause => {
164
+ done = true;
165
+ resume(Effect.fail(new Persistence.PersistenceError({
166
+ message,
167
+ cause
168
+ })));
169
+ };
170
+ tx.oncomplete = () => {
171
+ done = true;
172
+ if (setResult) resume(Effect.succeed(result));
173
+ };
174
+ tx.onerror = () => {
175
+ done = true;
176
+ fail(tx.error);
177
+ };
178
+ tx.onabort = () => {
179
+ done = true;
180
+ fail(tx.error);
181
+ };
182
+ run(entries, next => {
183
+ if (done) return resume(Effect.succeed(next));
184
+ setResult = true;
185
+ result = next;
186
+ }, fail);
187
+ return Effect.sync(() => {
188
+ tx.abort();
189
+ });
190
+ });
191
+ const idbRequest = (message, evaluate) => Effect.callback(resume => {
192
+ const request = evaluate();
193
+ const fail = cause => {
194
+ resume(Effect.fail(new Persistence.PersistenceError({
195
+ message,
196
+ cause
197
+ })));
198
+ };
199
+ if (request.readyState === "done") {
200
+ resume(Effect.succeed(request.result));
201
+ }
202
+ request.onsuccess = () => {
203
+ resume(Effect.succeed(request.result));
204
+ };
205
+ request.onerror = () => fail(request.error);
206
+ });
207
+ //# sourceMappingURL=BrowserPersistence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserPersistence.js","names":["Clock","Effect","Layer","Persistence","layerBackingIndexedDb","options","effect","BackingPersistence","gen","db","acquireRelease","openDatabase","database","defaultDatabase","sync","close","pipe","orDie","of","make","fnUntraced","storeId","clock","get","key","getMany","keys","set","value","ttl","setMany","entries","remove","clear","databaseVersion","entriesStoreName","storeIdIndexName","layerIndexedDb","layer","provide","openRequest","try","globalThis","indexedDB","open","catch","cause","PersistenceError","message","onupgradeneeded","result","objectStoreNames","contains","transaction","objectStore","createObjectStore","keyPath","indexNames","createIndex","unique","idbRequest","isExpired","row","now","expires","withEntriesTransaction","setResult","fail","currentTimeMillisUnsafe","id","request","onerror","error","onsuccess","deleteRequest","delete","undefined","results","Array","length","i","put","unsafeTtlToExpires","store","index","cursorRequest","openCursor","cursor","continue","mode","run","callback","resume","tx","done","oncomplete","succeed","onabort","next","abort","evaluate","readyState"],"sources":["../src/BrowserPersistence.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
@@ -1,24 +1,84 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * Browser helper for running a root Effect program.
3
+ *
4
+ * This module exports `runMain`, a browser version of the main Effect runner.
5
+ * It forwards runner options to the core runtime and adds a `beforeunload`
6
+ * listener that interrupts the main fiber when the page is unloading.
7
+ *
8
+ * @since 4.0.0
3
9
  */
4
10
  import type * as Effect from "effect/Effect";
5
11
  import { type Teardown } from "effect/Runtime";
6
12
  /**
7
- * @since 1.0.0
13
+ * Runs an effect as the browser main program and interrupts its fiber when the page receives a `beforeunload` event.
14
+ *
15
+ * **When to use**
16
+ *
17
+ * Use to launch a browser page, single-page application, demo, or browser test
18
+ * harness as a root Effect program.
19
+ *
20
+ * **Details**
21
+ *
22
+ * Supports both direct and curried call forms. Options are forwarded to
23
+ * `makeRunMain`, including `disableErrorReporting` and custom `teardown`
24
+ * behavior.
25
+ *
26
+ * **Gotchas**
27
+ *
28
+ * The `beforeunload` interruption is best-effort. Browser teardown may prevent
29
+ * asynchronous finalizers, network work, timers, or prompts from completing.
30
+ *
8
31
  * @category Runtime
32
+ * @since 4.0.0
9
33
  */
10
34
  export declare const runMain: {
11
35
  /**
12
- * @since 1.0.0
36
+ * Runs an effect as the browser main program and interrupts its fiber when the page receives a `beforeunload` event.
37
+ *
38
+ * **When to use**
39
+ *
40
+ * Use to launch a browser page, single-page application, demo, or browser test
41
+ * harness as a root Effect program.
42
+ *
43
+ * **Details**
44
+ *
45
+ * Supports both direct and curried call forms. Options are forwarded to
46
+ * `makeRunMain`, including `disableErrorReporting` and custom `teardown`
47
+ * behavior.
48
+ *
49
+ * **Gotchas**
50
+ *
51
+ * The `beforeunload` interruption is best-effort. Browser teardown may prevent
52
+ * asynchronous finalizers, network work, timers, or prompts from completing.
53
+ *
13
54
  * @category Runtime
55
+ * @since 4.0.0
14
56
  */
15
57
  (options?: {
16
58
  readonly disableErrorReporting?: boolean | undefined;
17
59
  readonly teardown?: Teardown | undefined;
18
60
  }): <E, A>(effect: Effect.Effect<A, E>) => void;
19
61
  /**
20
- * @since 1.0.0
62
+ * Runs an effect as the browser main program and interrupts its fiber when the page receives a `beforeunload` event.
63
+ *
64
+ * **When to use**
65
+ *
66
+ * Use to launch a browser page, single-page application, demo, or browser test
67
+ * harness as a root Effect program.
68
+ *
69
+ * **Details**
70
+ *
71
+ * Supports both direct and curried call forms. Options are forwarded to
72
+ * `makeRunMain`, including `disableErrorReporting` and custom `teardown`
73
+ * behavior.
74
+ *
75
+ * **Gotchas**
76
+ *
77
+ * The `beforeunload` interruption is best-effort. Browser teardown may prevent
78
+ * asynchronous finalizers, network work, timers, or prompts from completing.
79
+ *
21
80
  * @category Runtime
81
+ * @since 4.0.0
22
82
  */
23
83
  <E, A>(effect: Effect.Effect<A, E>, options?: {
24
84
  readonly disableErrorReporting?: boolean | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserRuntime.d.ts","sourceRoot":"","sources":["../src/BrowserRuntime.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE3D;;;GAGG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB;;;OAGG;IACH,CACE,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KACzC,GACA,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAA;IAC9C;;;OAGG;IACH,CAAC,CAAC,EAAE,CAAC,EACH,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3B,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KACzC,GACA,IAAI,CAAA;CAKP,CAAA"}
1
+ {"version":3,"file":"BrowserRuntime.d.ts","sourceRoot":"","sources":["../src/BrowserRuntime.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,KAAK,MAAM,MAAM,eAAe,CAAA;AAC5C,OAAO,EAAe,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAE3D;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,OAAO,EAAE;IACpB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,CACE,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KACzC,GACA,CAAC,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,IAAI,CAAA;IAC9C;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,CAAC,CAAC,EAAE,CAAC,EACH,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3B,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;QACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAA;KACzC,GACA,IAAI,CAAA;CAKP,CAAA"}
@@ -1,7 +1,25 @@
1
1
  import { makeRunMain } from "effect/Runtime";
2
2
  /**
3
- * @since 1.0.0
3
+ * Runs an effect as the browser main program and interrupts its fiber when the page receives a `beforeunload` event.
4
+ *
5
+ * **When to use**
6
+ *
7
+ * Use to launch a browser page, single-page application, demo, or browser test
8
+ * harness as a root Effect program.
9
+ *
10
+ * **Details**
11
+ *
12
+ * Supports both direct and curried call forms. Options are forwarded to
13
+ * `makeRunMain`, including `disableErrorReporting` and custom `teardown`
14
+ * behavior.
15
+ *
16
+ * **Gotchas**
17
+ *
18
+ * The `beforeunload` interruption is best-effort. Browser teardown may prevent
19
+ * asynchronous finalizers, network work, timers, or prompts from completing.
20
+ *
4
21
  * @category Runtime
22
+ * @since 4.0.0
5
23
  */
6
24
  export const runMain = /*#__PURE__*/makeRunMain(({
7
25
  fiber
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserRuntime.js","names":["makeRunMain","runMain","fiber","globalThis","addEventListener","interruptUnsafe","id"],"sources":["../src/BrowserRuntime.ts"],"sourcesContent":[null],"mappings":"AAIA,SAASA,WAAW,QAAuB,gBAAgB;AAE3D;;;;AAIA,OAAO,MAAMC,OAAO,gBAsBhBD,WAAW,CAAC,CAAC;EAAEE;AAAK,CAAE,KAAI;EAC5BC,UAAU,CAACC,gBAAgB,CAAC,cAAc,EAAE,MAAK;IAC/CF,KAAK,CAACG,eAAe,CAACH,KAAK,CAACI,EAAE,CAAC;EACjC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"BrowserRuntime.js","names":["makeRunMain","runMain","fiber","globalThis","addEventListener","interruptUnsafe","id"],"sources":["../src/BrowserRuntime.ts"],"sourcesContent":[null],"mappings":"AAUA,SAASA,WAAW,QAAuB,gBAAgB;AAE3D;;;;;;;;;;;;;;;;;;;;;;AAsBA,OAAO,MAAMC,OAAO,gBA0DhBD,WAAW,CAAC,CAAC;EAAEE;AAAK,CAAE,KAAI;EAC5BC,UAAU,CAACC,gBAAgB,CAAC,cAAc,EAAE,MAAK;IAC/CF,KAAK,CAACG,eAAe,CAACH,KAAK,CAACI,EAAE,CAAC;EACjC,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -1,20 +1,47 @@
1
1
  /**
2
- * @since 1.0.0
2
+ * Browser WebSocket layers for Effect sockets.
3
+ *
4
+ * `layerWebSocket` creates a `Socket.Socket` connected to a WebSocket URL using
5
+ * the browser `WebSocket` constructor. `layerWebSocketConstructor` provides
6
+ * only the browser-backed constructor service for lower-level socket code.
7
+ *
8
+ * @since 4.0.0
3
9
  */
4
10
  import * as Layer from "effect/Layer";
5
11
  import * as Socket from "effect/unstable/socket/Socket";
6
12
  /**
7
- * @since 1.0.0
8
- * @category Layers
13
+ * Creates a `Socket` layer connected to the given URL using the browser `WebSocket` constructor.
14
+ *
15
+ * **When to use**
16
+ *
17
+ * Use when you need browser code to satisfy the platform socket service from a
18
+ * URL without wiring the browser constructor service separately.
19
+ *
20
+ * **Details**
21
+ *
22
+ * Delegates socket construction to `Socket.makeWebSocket` and provides the
23
+ * browser-backed `WebSocketConstructor` service.
24
+ *
25
+ * **Gotchas**
26
+ *
27
+ * Browser WebSocket rules still control URL schemes, mixed-content blocking,
28
+ * cookies, authentication, origin checks, subprotocols, and extensions. Close
29
+ * events are errors unless `closeCodeIsError` classifies the close code as
30
+ * clean.
31
+ *
32
+ * @see {@link layerWebSocketConstructor} for providing only the browser constructor service
33
+ *
34
+ * @category layers
35
+ * @since 4.0.0
9
36
  */
10
37
  export declare const layerWebSocket: (url: string, options?: {
11
38
  readonly closeCodeIsError?: (code: number) => boolean;
12
39
  }) => Layer.Layer<Socket.Socket>;
13
40
  /**
14
- * A WebSocket constructor that uses `globalThis.WebSocket`.
41
+ * Layer that provides a `WebSocketConstructor` service backed by `globalThis.WebSocket`.
15
42
  *
16
- * @since 1.0.0
17
- * @category Layers
43
+ * @category layers
44
+ * @since 4.0.0
18
45
  */
19
46
  export declare const layerWebSocketConstructor: Layer.Layer<Socket.WebSocketConstructor>;
20
47
  //# sourceMappingURL=BrowserSocket.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BrowserSocket.d.ts","sourceRoot":"","sources":["../src/BrowserSocket.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD;;;GAGG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,UAAU;IACpD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACtD,KAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAG1B,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CACvC,CAAA"}
1
+ {"version":3,"file":"BrowserSocket.d.ts","sourceRoot":"","sources":["../src/BrowserSocket.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,KAAK,KAAK,MAAM,cAAc,CAAA;AACrC,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAA;AAEvD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,cAAc,GAAI,KAAK,MAAM,EAAE,UAAU;IACpD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;CACtD,KAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAG1B,CAAA;AAEH;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,oBAAoB,CACvC,CAAA"}