@fkn/lib 0.9.26 → 0.9.28
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/{api-CesI0aMl.d.ts → api-CKoF03Me.d.ts} +327 -1
- package/api.d.ts +2 -2
- package/cloud/dns.d.ts +1 -1
- package/cloud/fetch.d.ts +1 -1
- package/cloud/fs/promises.d.ts +1 -1
- package/cloud/fs.cjs +1 -1
- package/cloud/fs.d.ts +3 -2
- package/cloud/fs.js +20 -19
- package/cloud/net.d.ts +1 -1
- package/{cloud-B7pI3pp1.d.ts → cloud-BX_24NAz.d.ts} +4 -4
- package/cloud.d.ts +4 -4
- package/{contract-D6ksmIm6.d.ts → contract-BzdjfQge.d.ts} +118 -1
- package/contract.d.ts +2 -2
- package/dgram.d.ts +2 -2
- package/dns.d.ts +1 -1
- package/{extension-CJUeVRXf.d.ts → extension-DwQOshkM.d.ts} +1 -1
- package/extension.d.ts +2 -2
- package/fs/promises.cjs +1 -1
- package/fs/promises.d.ts +1 -1
- package/fs/promises.js +1 -1
- package/fs-CBVaShOR.d.ts +27 -0
- package/fs-Cvx2NT6o.js +360 -0
- package/fs-J5h3i5eg.cjs +1 -0
- package/fs.cjs +1 -1
- package/fs.d.ts +3 -2
- package/fs.js +2 -2
- package/http.d.ts +1 -1
- package/{index-CGJTVju4.d.ts → index-Cg6y_FTi.d.ts} +22 -6
- package/{index-BhO-wymH.d.ts → index-DH3_12nU.d.ts} +36 -36
- package/index.cjs +1 -1
- package/index.d.ts +7 -6
- package/index.js +48 -47
- package/{net-DAOcF3Eb.d.ts → net-Cy6QOTK3.d.ts} +2 -2
- package/net.d.ts +1 -1
- package/package.json +6 -1
- package/packages.d.ts +1 -1
- package/{proxy-BubvP9sg.d.ts → proxy-DahCiavd.d.ts} +2 -2
- package/rooms.cjs +1 -0
- package/rooms.d.ts +46 -0
- package/rooms.js +142 -0
- package/{storage-BjGr_vC4.js → storage-BL8vxHlW.js} +23 -7
- package/storage-Dr5F1jil.cjs +1 -0
- package/storage-WZEvw3KN.d.ts +69 -0
- package/fs-DYP7utdw.cjs +0 -1
- package/fs-DlGE0ZNu.d.ts +0 -73
- package/fs-d2ANVBkm.js +0 -347
- package/storage-DLB4ciMf.cjs +0 -1
package/rooms.js
ADDED
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import { t as e } from "./rolldown-runtime-Dy4uBu1J.js";
|
|
2
|
+
import { c as t, l as n, o as r } from "./api-DLvscoll.js";
|
|
3
|
+
import { t as i } from "./busy-B189uX--.js";
|
|
4
|
+
//#region src/rooms.ts
|
|
5
|
+
var a = /* @__PURE__ */ e({
|
|
6
|
+
available: () => p,
|
|
7
|
+
create: () => m,
|
|
8
|
+
join: () => h
|
|
9
|
+
}), o = {
|
|
10
|
+
noSuchRoom: "rooms: no such room",
|
|
11
|
+
wrongKey: "rooms: wrong room key",
|
|
12
|
+
inviteNoKey: "rooms: the invite carries no key",
|
|
13
|
+
noSuchMember: "rooms: no such member",
|
|
14
|
+
roomFull: "rooms: the room is full",
|
|
15
|
+
tooManyRooms: "rooms: too many rooms",
|
|
16
|
+
tooManyConnections: "rooms: too many connections",
|
|
17
|
+
tooManyBlocks: "rooms: too many blocks",
|
|
18
|
+
blocked: "rooms: you are blocked from this room",
|
|
19
|
+
cannotSend: "rooms: you cannot send here",
|
|
20
|
+
permissionDenied: "rooms: permission denied",
|
|
21
|
+
notOwner: "rooms: not the room owner",
|
|
22
|
+
ownerNotRemovable: "rooms: the owner cannot be removed",
|
|
23
|
+
ownerKeepsEvery: "rooms: the owner keeps every permission",
|
|
24
|
+
removeYourself: "rooms: you cannot remove yourself",
|
|
25
|
+
tooFast: "rooms: sending too fast",
|
|
26
|
+
tooLarge: "rooms: the message is too large",
|
|
27
|
+
unavailable: "rooms: rooms are unavailable",
|
|
28
|
+
notEnabled: "rooms: rooms are not available",
|
|
29
|
+
alreadyJoined: "rooms: already joined",
|
|
30
|
+
malformed: "rooms: malformed frame",
|
|
31
|
+
ended: "rooms: the room has ended"
|
|
32
|
+
}, s = (e, t) => Object.assign(Error(t), { code: e }), c = (e) => e instanceof Error && typeof e.code == "string", l = async () => {
|
|
33
|
+
if (!t) return;
|
|
34
|
+
let e = (await r("a room").catch(() => void 0))?.rooms;
|
|
35
|
+
return typeof e?.create == "function" ? e : void 0;
|
|
36
|
+
}, u = () => {
|
|
37
|
+
throw s("unavailable", o.unavailable);
|
|
38
|
+
}, d = (e) => e === "blocked" ? "blocked" : e === "not-found" ? "ended" : "unavailable", f = async (e) => {
|
|
39
|
+
let t = e.invite, r = e, a = 0, l = e.self, u = await e.defaults().catch(() => ({
|
|
40
|
+
send: !0,
|
|
41
|
+
receive: !0
|
|
42
|
+
})), f = !1, p = /* @__PURE__ */ new Set(), m = /* @__PURE__ */ new Set(), h = i("room"), g = () => {}, _ = () => {}, v = new Promise((e) => {
|
|
43
|
+
_ = e;
|
|
44
|
+
}), y = (e) => {
|
|
45
|
+
let t = [...m];
|
|
46
|
+
m.clear();
|
|
47
|
+
for (let n of t) try {
|
|
48
|
+
n(e);
|
|
49
|
+
} catch {}
|
|
50
|
+
}, b = (e) => {
|
|
51
|
+
f || (f = !0, g(), p.clear(), h(), y(s("closed", o.ended)), _({ reason: e }));
|
|
52
|
+
}, x = (e) => {
|
|
53
|
+
if (!f) {
|
|
54
|
+
e.type === "defaults" && (u = e.defaults), e.type === "permissions" && e.id === l.id && (l = {
|
|
55
|
+
id: l.id,
|
|
56
|
+
permissions: e.permissions
|
|
57
|
+
});
|
|
58
|
+
for (let t of [...p]) try {
|
|
59
|
+
t(e);
|
|
60
|
+
} catch {}
|
|
61
|
+
}
|
|
62
|
+
}, S = (e, t) => {
|
|
63
|
+
Promise.resolve(e.on(x)).catch(() => {}), Promise.resolve(e.closed).then((e) => {
|
|
64
|
+
t === a && b(e.reason);
|
|
65
|
+
}, () => {});
|
|
66
|
+
}, C = async (e, n) => {
|
|
67
|
+
if (typeof e?.join != "function") return b("unavailable");
|
|
68
|
+
let i = await e.join(t).catch(() => void 0);
|
|
69
|
+
if (f || n !== a) return;
|
|
70
|
+
if (!i) return b("unavailable");
|
|
71
|
+
if ("error" in i) return b(d(i.error));
|
|
72
|
+
if (i.self.id !== l.id) return Promise.resolve(i.leave()).catch(() => {}), b("unavailable");
|
|
73
|
+
r = i, l = i.self, S(i, n);
|
|
74
|
+
let o = await i.defaults().catch(() => void 0);
|
|
75
|
+
o && !f && n === a && (u = o);
|
|
76
|
+
};
|
|
77
|
+
g = n((e, t) => {
|
|
78
|
+
let n = a;
|
|
79
|
+
a = t, !(f || n === 0 || n === t) && (y(s("unavailable", o.unavailable)), C(e.rooms, t));
|
|
80
|
+
}), S(e, a);
|
|
81
|
+
let w = async (e) => {
|
|
82
|
+
if (f) throw s("closed", o.ended);
|
|
83
|
+
let t = () => {}, n = new Promise((e, n) => {
|
|
84
|
+
t = n;
|
|
85
|
+
});
|
|
86
|
+
m.add(t);
|
|
87
|
+
try {
|
|
88
|
+
return await Promise.race([Promise.resolve(e(r)), n]);
|
|
89
|
+
} catch (e) {
|
|
90
|
+
throw c(e) ? e : s("unavailable", o.unavailable);
|
|
91
|
+
} finally {
|
|
92
|
+
m.delete(t);
|
|
93
|
+
}
|
|
94
|
+
}, T = async (e) => {
|
|
95
|
+
let t = await w(e);
|
|
96
|
+
if ("error" in t) throw s(t.error, t.message);
|
|
97
|
+
};
|
|
98
|
+
return {
|
|
99
|
+
id: e.id,
|
|
100
|
+
key: e.key,
|
|
101
|
+
invite: t,
|
|
102
|
+
get self() {
|
|
103
|
+
return l;
|
|
104
|
+
},
|
|
105
|
+
owner: e.owner,
|
|
106
|
+
defaults: () => u,
|
|
107
|
+
members: () => w((e) => e.members()),
|
|
108
|
+
send: (e) => T((t) => t.send(e)),
|
|
109
|
+
setDefault: (e, t) => T((n) => n.setDefault(e, t)),
|
|
110
|
+
grant: (e, t) => T((n) => n.grant(e, t)),
|
|
111
|
+
revoke: (e, t) => T((n) => n.revoke(e, t)),
|
|
112
|
+
remove: (e) => T((t) => t.remove(e)),
|
|
113
|
+
block: (e) => T((t) => t.block(e)),
|
|
114
|
+
unblock: (e) => T((t) => t.unblock(e)),
|
|
115
|
+
on: async (e) => f ? () => {} : (p.add(e), () => {
|
|
116
|
+
p.delete(e);
|
|
117
|
+
}),
|
|
118
|
+
leave: async () => {
|
|
119
|
+
await Promise.resolve(r.leave()).catch(() => {}), b("left");
|
|
120
|
+
},
|
|
121
|
+
closed: v
|
|
122
|
+
};
|
|
123
|
+
}, p = async () => {
|
|
124
|
+
let e = await l();
|
|
125
|
+
return e ? e.available().catch(() => !1) : !1;
|
|
126
|
+
}, m = async (e) => {
|
|
127
|
+
let t = await l();
|
|
128
|
+
if (!t) throw s("unavailable", o.unavailable);
|
|
129
|
+
let n = await t.create(e).catch(u);
|
|
130
|
+
if ("error" in n) throw s(n.error, n.message);
|
|
131
|
+
return f(n);
|
|
132
|
+
}, h = async (e, t) => {
|
|
133
|
+
let n = typeof e == "string" ? e.indexOf(".") : -1;
|
|
134
|
+
if (n <= 0 || n === e.length - 1) throw s("invalid", o.inviteNoKey);
|
|
135
|
+
let r = await l();
|
|
136
|
+
if (!r) throw s("unavailable", o.unavailable);
|
|
137
|
+
let i = await r.join(e, t).catch(u);
|
|
138
|
+
if ("error" in i) throw s(i.error, i.message);
|
|
139
|
+
return f(i);
|
|
140
|
+
};
|
|
141
|
+
//#endregion
|
|
142
|
+
export { p as available, m as create, h as join, a as t };
|
|
@@ -7,14 +7,15 @@ var r = /* @__PURE__ */ e({
|
|
|
7
7
|
StorageNotFoundError: () => a,
|
|
8
8
|
availability: () => p,
|
|
9
9
|
available: () => c,
|
|
10
|
-
encryption: () =>
|
|
10
|
+
encryption: () => x,
|
|
11
11
|
isNotFound: () => o,
|
|
12
12
|
list: () => m,
|
|
13
13
|
quota: () => h,
|
|
14
14
|
readFile: () => g,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
readFileSealed: () => v,
|
|
16
|
+
remove: () => b,
|
|
17
|
+
unlock: () => S,
|
|
18
|
+
writeFile: () => y
|
|
18
19
|
}), i = class extends Error {
|
|
19
20
|
code = "FKN_E2E_LOCKED";
|
|
20
21
|
constructor() {
|
|
@@ -43,9 +44,24 @@ var r = /* @__PURE__ */ e({
|
|
|
43
44
|
}, m = () => t.then((e) => e.cloud.fs.list()), h = () => t.then((e) => e.cloud.fs.quota()), g = async (e) => {
|
|
44
45
|
let n = await (await t).cloud.fs.readFile(e).catch(s);
|
|
45
46
|
return new Blob([n]);
|
|
46
|
-
}, _ =
|
|
47
|
+
}, _ = (e) => {
|
|
48
|
+
if (e === null || !Number.isFinite(e)) return null;
|
|
49
|
+
let t = new Date(e);
|
|
50
|
+
return Number.isNaN(t.getTime()) ? null : t.toISOString();
|
|
51
|
+
}, v = async (e) => {
|
|
52
|
+
let n = (await t).cloud.fs;
|
|
53
|
+
if (typeof n.readFileSealed != "function") return {
|
|
54
|
+
data: await n.readFile(e).catch(s),
|
|
55
|
+
sealedAt: null
|
|
56
|
+
};
|
|
57
|
+
let r = await n.readFileSealed(e).catch(s);
|
|
58
|
+
return {
|
|
59
|
+
data: r.bytes,
|
|
60
|
+
sealedAt: _(r.sealedAt)
|
|
61
|
+
};
|
|
62
|
+
}, y = async (e, n, r) => {
|
|
47
63
|
let i = await t, a = n instanceof Blob ? new Uint8Array(await n.arrayBuffer()) : n;
|
|
48
64
|
await i.cloud.fs.writeFile(e, a, r?.contentType ?? null).catch(s);
|
|
49
|
-
},
|
|
65
|
+
}, b = (e) => t.then((t) => t.cloud.fs.remove(e)).then(() => void 0), x = () => t.then((e) => e.cloud.fs.encryption()), S = () => t.then((e) => e.cloud.fs.unlock());
|
|
50
66
|
//#endregion
|
|
51
|
-
export { o as a, g as c,
|
|
67
|
+
export { o as a, g as c, r as d, S as f, x as i, v as l, a as n, m as o, y as p, p as r, h as s, i as t, b as u };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const e=require("./rolldown-runtime-BIInC43l.cjs"),t=require("./api-BCJO3EWi.cjs"),n=require("./messages.cjs");var r=e.t({StorageLockedError:()=>i,StorageNotFoundError:()=>a,availability:()=>p,available:()=>c,encryption:()=>x,isNotFound:()=>o,list:()=>m,quota:()=>h,readFile:()=>g,readFileSealed:()=>v,remove:()=>b,unlock:()=>S,writeFile:()=>y}),i=class extends Error{code=`FKN_E2E_LOCKED`;constructor(){super(`storage locked: this account stores encrypted data, unlock it from the FKN card or unlock()`)}},a=class extends Error{code=n.STORAGE_NOT_FOUND;constructor(e=`storage: no object at that path`){super(e)}},o=e=>e?.code===n.STORAGE_NOT_FOUND,s=e=>{throw e instanceof Error&&e.message.startsWith(`fkn:e2e-locked`)?new i:o(e)||e instanceof Error&&(/^not found$/i.test(e.message)||/\(404\)$/.test(e.message))?new a(e.message):e},c=()=>t.a.then(e=>e.cloud.fs.available()).catch(()=>!1),l=8e3,u=1e3,d=!1,f=async()=>{let e=(await t.a).cloud.fs;return typeof e.availability==`function`?e.availability():await e.available()?`connected`:`disconnected`},p=async()=>{let e=d?u:l,t=await new Promise(t=>{let n=setTimeout(()=>t(`timeout`),e);f().then(e=>{clearTimeout(n),t(e)},()=>{clearTimeout(n),t(`unknown`)})});return t===`timeout`?(d=!0,`unknown`):(d=!1,t)},m=()=>t.a.then(e=>e.cloud.fs.list()),h=()=>t.a.then(e=>e.cloud.fs.quota()),g=async e=>{let n=await(await t.a).cloud.fs.readFile(e).catch(s);return new Blob([n])},_=e=>{if(e===null||!Number.isFinite(e))return null;let t=new Date(e);return Number.isNaN(t.getTime())?null:t.toISOString()},v=async e=>{let n=(await t.a).cloud.fs;if(typeof n.readFileSealed!=`function`)return{data:await n.readFile(e).catch(s),sealedAt:null};let r=await n.readFileSealed(e).catch(s);return{data:r.bytes,sealedAt:_(r.sealedAt)}},y=async(e,n,r)=>{let i=await t.a,a=n instanceof Blob?new Uint8Array(await n.arrayBuffer()):n;await i.cloud.fs.writeFile(e,a,r?.contentType??null).catch(s)},b=e=>t.a.then(t=>t.cloud.fs.remove(e)).then(()=>void 0),x=()=>t.a.then(e=>e.cloud.fs.encryption()),S=()=>t.a.then(e=>e.cloud.fs.unlock());Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return o}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return i}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return b}});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
//#region src/storage.d.ts
|
|
2
|
+
type FileEntry = {
|
|
3
|
+
path: string;
|
|
4
|
+
size: number;
|
|
5
|
+
contentType: string | null;
|
|
6
|
+
updatedAt: string;
|
|
7
|
+
encryption: string | null;
|
|
8
|
+
};
|
|
9
|
+
type StorageQuota = {
|
|
10
|
+
usedBytes: number;
|
|
11
|
+
limitBytes: number;
|
|
12
|
+
remaining: number;
|
|
13
|
+
objects: number;
|
|
14
|
+
maxObjects: number;
|
|
15
|
+
};
|
|
16
|
+
type EncryptionStatus = {
|
|
17
|
+
unlocked: boolean;
|
|
18
|
+
enrolled: boolean;
|
|
19
|
+
keyEpoch: number | null;
|
|
20
|
+
};
|
|
21
|
+
declare class StorageLockedError extends Error {
|
|
22
|
+
code: string;
|
|
23
|
+
constructor();
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* There is no object at this path. Test `err.code === STORAGE_NOT_FOUND`, never the message.
|
|
27
|
+
*
|
|
28
|
+
* Absence arrives from two places that word it completely differently: the api refusing to presign
|
|
29
|
+
* a path with no committed row says "Not found", and a presign that succeeded followed by an object
|
|
30
|
+
* fetch that 404s says "storage: read failed (404)". Neither is a fault, both mean the same thing,
|
|
31
|
+
* and matching either by hand means matching both. Ripple matched only the first, so a missing
|
|
32
|
+
* backup read as a transient failure, retried forever, and a library went un-backed-up for a day
|
|
33
|
+
* without a single error anywhere.
|
|
34
|
+
*
|
|
35
|
+
* The distinction matters more than it sounds. "There is nothing here" is safe to overwrite;
|
|
36
|
+
* "I could not tell you" is not, and a caller that confuses them either never writes a first
|
|
37
|
+
* backup or destroys a real one.
|
|
38
|
+
*/
|
|
39
|
+
declare class StorageNotFoundError extends Error {
|
|
40
|
+
code: string;
|
|
41
|
+
constructor(message?: string);
|
|
42
|
+
}
|
|
43
|
+
/** Whether an error from this module means the path is empty, as opposed to unreadable. */
|
|
44
|
+
declare const isNotFound: (error: unknown) => boolean;
|
|
45
|
+
declare const quota: () => Promise<StorageQuota>;
|
|
46
|
+
/** The bytes of a cloud object and the seal time they carry, as an ISO string or null. */
|
|
47
|
+
type SealedRead = {
|
|
48
|
+
data: Uint8Array;
|
|
49
|
+
sealedAt: string | null;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* A cloud read that also reports when the copy was sealed.
|
|
53
|
+
*
|
|
54
|
+
* `sealedAt` is an ISO string, or null when the envelope carries no such field (one written before
|
|
55
|
+
* the seal time existed) or when the data plane is older than this call. The value is
|
|
56
|
+
* AUTHENTICATED, so the server can neither forge nor alter it, and it is the WRITER's own claim
|
|
57
|
+
* about when it sealed, so on its own it does not prove this copy is the newest one: an older but
|
|
58
|
+
* perfectly authentic copy of the same path is still authentic. An app that needs that answer keeps
|
|
59
|
+
* a high-water mark per path and compares. Do not confuse it with the `updatedAt` on a listing,
|
|
60
|
+
* which is the server's hint and is fine for display and nothing else.
|
|
61
|
+
*
|
|
62
|
+
* The bytes and the stamp come from ONE read of ONE envelope, which is what makes the stamp
|
|
63
|
+
* describe the bytes returned beside it. `readFile` is unchanged and unaffected.
|
|
64
|
+
*/
|
|
65
|
+
declare const readFileSealed: (path: string) => Promise<SealedRead>;
|
|
66
|
+
declare const encryption: () => Promise<EncryptionStatus>;
|
|
67
|
+
declare const unlock: () => Promise<boolean>;
|
|
68
|
+
//#endregion
|
|
69
|
+
export { StorageNotFoundError as a, isNotFound as c, unlock as d, StorageLockedError as i, quota as l, FileEntry as n, StorageQuota as o, SealedRead as r, encryption as s, EncryptionStatus as t, readFileSealed as u };
|
package/fs-DYP7utdw.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=require("./rolldown-runtime-BIInC43l.cjs"),t=require("./busy-Dv8wzE5M.cjs"),n=require("./node-fs-DZPGCYWg.cjs"),r=require("./storage-DLB4ciMf.cjs"),i=require("./opfs-CXMESVLc.cjs");var a=e.t({adopt:()=>I,adoptable:()=>L,available:()=>u,list:()=>re,onConflict:()=>ce,pending:()=>w,pendingDeletes:()=>ee,pull:()=>se,readFile:()=>ie,remove:()=>oe,replicating:()=>T,writeFile:()=>ae}),o,s=async()=>await(o??=i.t().catch(()=>!1))?!0:(o=void 0,!1),c=()=>r.r().catch(()=>`unknown`),l=async()=>await c()===`connected`,u=async()=>await s()||await l(),d=`fkn:fs:pending`,f=`fkn:fs:pending-delete`,p=`fkn:fs:adopt-declined`,m=!0,h=new Map,g=e=>{try{let t=localStorage.getItem(e);if(!t)return{};let n=JSON.parse(t);return Array.isArray(n)?Object.fromEntries(n.filter(e=>typeof e==`string`).map(e=>[e,null])):n&&typeof n==`object`?n:{}}catch{return{}}},_=(e,t)=>{try{Object.keys(t).length?localStorage.setItem(e,JSON.stringify(t)):localStorage.removeItem(e)}catch{}},v=()=>g(d),y=(e,t)=>{let n=v();e in n||(n[e]=t===void 0?h.get(e)??null:t,_(d,n))},b=e=>{let t=v();e in t&&(delete t[e],_(d,t),D()||(k=O))},x=()=>g(f),S=e=>{let t=x();e in t||(t[e]=h.get(e)??null,_(f,t))},C=e=>{let t=x();e in t&&(delete t[e],_(f,t),D()||(k=O))},w=()=>Object.keys(v()),ee=()=>Object.keys(x()),T=()=>m,E=null;t.r(`storage replication`,()=>E!==null||R!==null);var D=()=>Object.keys(v()).length>0||Object.keys(x()).length>0,O=6e4,te=6e5,k=O,A=null,j=()=>{A||typeof window>`u`||!D()||(A=setTimeout(()=>{A=null,M()},k),k=Math.min(k*2,te))},M=()=>{E||!D()||(E=F(!1).then(e=>{if(!D()){k=O;return}e.failed.length&&j()}).catch(()=>{j()}).finally(()=>{E=null}))},ne=null,N=()=>ne??=Promise.resolve().then(()=>require("./api.cjs")).then(e=>e.apiPromise),re=async()=>{U();let e=await c(),t=e===`connected`,[n,a]=await Promise.all([s().then(e=>e?i.n():[]).catch(()=>[]),t?r.o().then(e=>({ok:!0,entries:e})).catch(()=>({ok:!1,entries:[]})):Promise.resolve({ok:e===`disconnected`,entries:[]})]);e!==`unknown`&&(m=a.ok),a.ok&&e!==`unknown`&&(h=new Map(a.entries.map(e=>[e.path,e.updatedAt])));let o=new Map,l=e=>{let t=Date.parse(e.updatedAt??``);return Number.isFinite(t)?t:0},u=e=>{let t=o.get(e.path);(!t||l(e)>=l(t))&&o.set(e.path,e)};for(let e of n)u(e);for(let e of a.entries)u(e);return a.ok&&t&&(pe(n,a.entries).catch(()=>{}),D()?M():z({local:n,remote:a.entries}).catch(()=>{})),[...o.values()]},ie=async e=>{if(await s())try{return await i.i(e)}catch(e){if(e?.name!==`NotFoundError`)throw e}let t=await r.c(e);return await s()&&i.o(e,t).catch(()=>{}),t},ae=async(e,t,n)=>{let a=t instanceof Blob?t:new Blob([t],n?.contentType?{type:n.contentType}:void 0);if(await s()){await i.o(e,a,n),U();let t=h.get(e)??null,o=await c();if(o===`disconnected`)return;if(o===`unknown`||!m){y(e,t),j();return}r.f(e,a,n).then(()=>b(e)).catch(n=>{y(e,t),j(),console.warn(`fs: cloud replicate failed, queued for adopt()`,n)});return}let o=await c();if(o===`connected`)return r.f(e,a,n);throw Error(o===`unknown`?`fs: cloud unreachable`:`fs: no storage backend available`)},oe=async e=>{U();let t=[];await s()&&t.push(i.a(e).catch(()=>{}));let n=await c();if(n===`connected`?t.push(r.l(e).then(()=>C(e)).catch(t=>{S(e),j(),console.warn(`fs: cloud delete failed, queued for retry`,t)})):n===`unknown`&&t.length&&h.has(e)&&(S(e),j()),!t.length)throw Error(n===`unknown`?`fs: cloud unreachable`:`fs: no storage backend available`);b(e),await Promise.all(t)},se=async e=>{let t=await r.c(e);return await s()&&await i.o(e,t),t},P=null,ce=e=>(P=e,()=>{P===e&&(P=null)}),le=async e=>(await N()).cloud.fs.promptConflict({path:e.path,local:e.local,cloud:e.cloud}).catch(()=>null),ue=async e=>{if(P)try{return await P(e)}catch{return null}return le(e)},F=async e=>{let t={uploaded:[],kept:[],resolved:[],unresolved:[],deleted:[],failed:[]},n=await c();if(n===`unknown`)throw Error(`fs: cloud unreachable`);if(n!==`connected`)throw Error(`fs: this needs a signed-in account`);let a=await s(),[o,l]=await Promise.all([a?i.n():Promise.resolve([]),r.o()]),u=new Map(l.map(e=>[e.path,e])),d=v();if(a)for(let e of Object.keys(d))o.some(t=>t.path===e)||b(e);for(let[e,n]of Object.entries(x())){let i=u.get(e);if(!i){C(e);continue}if(o.some(t=>t.path===e)){C(e);continue}if(i.updatedAt!==n){C(e);continue}try{await r.l(e),C(e),t.deleted.push(e)}catch(n){t.failed.push({path:e,error:n instanceof Error?n.message:String(n)})}}for(let n of o){let a=u.get(n.path),o=n.path in d;if(!o&&(a||!e)){a&&t.kept.push(n.path);continue}if(o&&a&&a.updatedAt!==d[n.path]){let e=await ue({path:n.path,local:{size:n.size,updatedAt:n.updatedAt},cloud:{size:a.size,updatedAt:a.updatedAt},readLocal:()=>i.i(n.path),readCloud:()=>r.c(n.path)});if(!e){t.unresolved.push(n.path);continue}try{if(e===`cloud`)await i.o(n.path,await r.c(n.path));else{let t=e===`local`?await i.i(n.path):e.merged;await r.f(n.path,t,n.contentType?{contentType:n.contentType}:void 0),e!==`local`&&await i.o(n.path,t)}b(n.path),t.resolved.push({path:n.path,choice:e===`local`||e===`cloud`?e:`merged`})}catch(e){if(e?.code===`FKN_E2E_LOCKED`)throw e;t.failed.push({path:n.path,error:e instanceof Error?e.message:String(e)})}continue}try{let e=await i.i(n.path);await r.f(n.path,e,n.contentType?{contentType:n.contentType}:void 0),b(n.path),t.uploaded.push(n.path)}catch(e){if(y(n.path),e?.code===`FKN_E2E_LOCKED`)throw e;t.failed.push({path:n.path,error:e instanceof Error?e.message:String(e)})}}return t},I=async()=>{for(;E;)await E;let e=F(!0);E=e.then(()=>{},()=>{});try{return await e}finally{E=null}},L=async()=>{if(!await l()||!await s())return{paths:[],bytes:0};let[e,t]=await Promise.all([i.n(),r.o()]),n=new Set(t.map(e=>e.path)),a=e.filter(e=>!n.has(e.path));return{paths:a.map(e=>e.path),bytes:a.reduce((e,t)=>e+t.size,0)}},de=()=>new Set(Object.keys(g(p))),fe=e=>{let t=g(p);for(let n of e)t[n]=null;_(p,t)},R=null,z=e=>R||(R=(async()=>{if(!await l())return;let t=e??(await s()?{local:await i.n(),remote:await r.o()}:null);if(!t)return;let n=new Set(t.remote.map(e=>e.path)),a=de(),o=t.local.filter(e=>!n.has(e.path)&&!a.has(e.path));if(!o.length)return;let c=await N(),u=o.reduce((e,t)=>e+t.size,0);if(!await c.cloud.fs.promptAdopt({files:o.length,bytes:u}).catch(()=>!1)){fe(o.map(e=>e.path));return}await I()})().catch(()=>{}).finally(()=>{R=null}),R),B=null,V=!1,pe=async(e,t)=>{let n=new Set(t.map(e=>e.path)),r=e.filter(e=>!n.has(e.path)),i=await N(),a=async()=>{await I().catch(()=>{});let e=await L().catch(()=>({paths:[],bytes:0}));await i.cloud.fs.setAdoptSource({files:e.paths.length,bytes:e.bytes},a).catch(()=>{})},o={files:r.length,bytes:r.reduce((e,t)=>e+t.size,0)};B=()=>{i.cloud.fs.setAdoptSource(o,a).catch(()=>{})},V||(V=!0,Promise.resolve().then(()=>require("./api.cjs")).then(e=>e.onApiEpoch((e,t)=>{t>1&&B?.()})).catch(()=>{})),await i.cloud.fs.setAdoptSource(o,a)},H=!1,U=()=>{H||typeof window>`u`||(H=!0,window.addEventListener(`online`,()=>{M()}),Promise.resolve().then(()=>require("./account.cjs")).then(e=>e.onChange(()=>{z().catch(()=>{}),M()})).catch(()=>{}))},me=e.t({adopt:()=>q,adoptable:()=>J,appendFile:()=>ke,appendFileSync:()=>ve,available:()=>he,default:()=>$,exists:()=>Ie,existsSync:()=>ye,flush:()=>ze,lstatSync:()=>xe,mkdir:()=>Me,mkdirSync:()=>Se,mount:()=>Re,onConflict:()=>Q,pending:()=>Y,pendingDeletes:()=>X,promises:()=>Le,pull:()=>K,readFile:()=>De,readFileSync:()=>ge,readdir:()=>je,readdirSync:()=>G,remount:()=>Be,rename:()=>Fe,renameSync:()=>Ee,replicating:()=>Z,rm:()=>Ne,rmSync:()=>Ce,rmdirSync:()=>we,stat:()=>Ae,statSync:()=>be,unlink:()=>Pe,unlinkSync:()=>Te,writeFile:()=>Oe,writeFileSync:()=>_e}),W=n.t(a,{memfs:!0}),{available:he,readFileSync:ge,writeFileSync:_e,appendFileSync:ve,existsSync:ye,statSync:be,lstatSync:xe,readdirSync:G,mkdirSync:Se,rmSync:Ce,rmdirSync:we,unlinkSync:Te,renameSync:Ee,readFile:De,writeFile:Oe,appendFile:ke,stat:Ae,readdir:je,mkdir:Me,rm:Ne,unlink:Pe,rename:Fe,exists:Ie,promises:Le,mount:Re,flush:ze,remount:Be}=W,K=se,q=I,J=L,Y=w,X=ee,Z=T,Q=ce,$={...W,pull:K,adopt:q,adoptable:J,pending:Y,pendingDeletes:X,replicating:Z,onConflict:Q};Object.defineProperty(exports,"A",{enumerable:!0,get:function(){return we}}),Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return G}}),Object.defineProperty(exports,"D",{enumerable:!0,get:function(){return Z}}),Object.defineProperty(exports,"E",{enumerable:!0,get:function(){return Ee}}),Object.defineProperty(exports,"F",{enumerable:!0,get:function(){return Oe}}),Object.defineProperty(exports,"I",{enumerable:!0,get:function(){return _e}}),Object.defineProperty(exports,"M",{enumerable:!0,get:function(){return be}}),Object.defineProperty(exports,"N",{enumerable:!0,get:function(){return Pe}}),Object.defineProperty(exports,"O",{enumerable:!0,get:function(){return Ne}}),Object.defineProperty(exports,"P",{enumerable:!0,get:function(){return Te}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return je}}),Object.defineProperty(exports,"T",{enumerable:!0,get:function(){return Fe}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return X}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return he}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return De}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return ze}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return xe}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return Me}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return Y}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return Q}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return ve}}),Object.defineProperty(exports,"j",{enumerable:!0,get:function(){return Ae}}),Object.defineProperty(exports,"k",{enumerable:!0,get:function(){return Ce}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return $}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return Re}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return J}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return Ie}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return Se}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return ke}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return ye}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return q}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return me}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return Le}}),Object.defineProperty(exports,"w",{enumerable:!0,get:function(){return Be}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return ge}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return K}});
|
package/fs-DlGE0ZNu.d.ts
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { a as WriteData, i as Stats, n as MakeOptions, o as WriteOptions, r as ReadOptions, t as Callback } from "./index-BQgZVQl7.js";
|
|
2
|
-
import { i as STORAGE_NOT_FOUND } from "./messages-DvpKMTsY.js";
|
|
3
|
-
//#region src/storage.d.ts
|
|
4
|
-
type FileEntry = {
|
|
5
|
-
path: string;
|
|
6
|
-
size: number;
|
|
7
|
-
contentType: string | null;
|
|
8
|
-
updatedAt: string;
|
|
9
|
-
encryption: string | null;
|
|
10
|
-
};
|
|
11
|
-
type StorageQuota = {
|
|
12
|
-
usedBytes: number;
|
|
13
|
-
limitBytes: number;
|
|
14
|
-
remaining: number;
|
|
15
|
-
objects: number;
|
|
16
|
-
maxObjects: number;
|
|
17
|
-
};
|
|
18
|
-
type EncryptionStatus = {
|
|
19
|
-
unlocked: boolean;
|
|
20
|
-
enrolled: boolean;
|
|
21
|
-
keyEpoch: number | null;
|
|
22
|
-
};
|
|
23
|
-
declare class StorageLockedError extends Error {
|
|
24
|
-
code: string;
|
|
25
|
-
constructor();
|
|
26
|
-
}
|
|
27
|
-
/**
|
|
28
|
-
* There is no object at this path. Test `err.code === STORAGE_NOT_FOUND`, never the message.
|
|
29
|
-
*
|
|
30
|
-
* Absence arrives from two places that word it completely differently: the api refusing to presign
|
|
31
|
-
* a path with no committed row says "Not found", and a presign that succeeded followed by an object
|
|
32
|
-
* fetch that 404s says "storage: read failed (404)". Neither is a fault, both mean the same thing,
|
|
33
|
-
* and matching either by hand means matching both. Ripple matched only the first, so a missing
|
|
34
|
-
* backup read as a transient failure, retried forever, and a library went un-backed-up for a day
|
|
35
|
-
* without a single error anywhere.
|
|
36
|
-
*
|
|
37
|
-
* The distinction matters more than it sounds. "There is nothing here" is safe to overwrite;
|
|
38
|
-
* "I could not tell you" is not, and a caller that confuses them either never writes a first
|
|
39
|
-
* backup or destroys a real one.
|
|
40
|
-
*/
|
|
41
|
-
declare class StorageNotFoundError extends Error {
|
|
42
|
-
code: string;
|
|
43
|
-
constructor(message?: string);
|
|
44
|
-
}
|
|
45
|
-
/** Whether an error from this module means the path is empty, as opposed to unreadable. */
|
|
46
|
-
declare const isNotFound: (error: unknown) => boolean;
|
|
47
|
-
declare const quota: () => Promise<StorageQuota>;
|
|
48
|
-
declare const encryption: () => Promise<EncryptionStatus>;
|
|
49
|
-
declare const unlock: () => Promise<boolean>;
|
|
50
|
-
declare namespace fs_d_exports {
|
|
51
|
-
export { EncryptionStatus, FileEntry, STORAGE_NOT_FOUND, Stats, StorageLockedError, StorageNotFoundError, StorageQuota, available, encryption, isNotFound, mkdir, promises, quota, readFile, readdir, rename, rm, stat, unlink, unlock, writeFile };
|
|
52
|
-
}
|
|
53
|
-
declare const available: () => Promise<boolean>, readFile: (path: import("node:fs").PathLike, a: ReadOptions | Callback<Buffer | string>, b?: Callback<Buffer | string>) => void, writeFile: (path: import("node:fs").PathLike, data: WriteData, a: WriteOptions | Callback<void>, b?: Callback<void>) => void, unlink: (path: import("node:fs").PathLike, callback: Callback<void>) => void, rename: (from: import("node:fs").PathLike, to: import("node:fs").PathLike, callback: Callback<void>) => void, readdir: (path: import("node:fs").PathLike, a: unknown, b?: Callback<string[]>) => void, mkdir: (path: import("node:fs").PathLike, a: MakeOptions | Callback<void>, b?: Callback<void>) => void, rm: (path: import("node:fs").PathLike, a: {
|
|
54
|
-
recursive?: boolean;
|
|
55
|
-
} | Callback<void>, b?: Callback<void>) => void, stat: (path: import("node:fs").PathLike, callback: Callback<Stats>) => void, promises: {
|
|
56
|
-
readFile: (path: import("node:fs").PathLike, options?: ReadOptions) => Promise<Buffer | string>;
|
|
57
|
-
writeFile: (path: import("node:fs").PathLike, data: WriteData, options?: WriteOptions) => Promise<void>;
|
|
58
|
-
unlink: (path: import("node:fs").PathLike) => Promise<void>;
|
|
59
|
-
rename: (from: import("node:fs").PathLike, to: import("node:fs").PathLike) => Promise<void>;
|
|
60
|
-
readdir: (path: import("node:fs").PathLike) => Promise<string[]>;
|
|
61
|
-
mkdir: (_path?: import("node:fs").PathLike, _options?: MakeOptions) => Promise<void>;
|
|
62
|
-
rm: (path: import("node:fs").PathLike, options?: {
|
|
63
|
-
recursive?: boolean;
|
|
64
|
-
}) => Promise<void>;
|
|
65
|
-
rmdir: (path: import("node:fs").PathLike, options?: {
|
|
66
|
-
recursive?: boolean;
|
|
67
|
-
}) => Promise<void>;
|
|
68
|
-
stat: (path: import("node:fs").PathLike) => Promise<Stats>;
|
|
69
|
-
lstat: (path: import("node:fs").PathLike) => Promise<Stats>;
|
|
70
|
-
access: (path: import("node:fs").PathLike) => Promise<void>;
|
|
71
|
-
};
|
|
72
|
-
//#endregion
|
|
73
|
-
export { encryption as _, readFile as a, unlock as b, rm as c, writeFile as d, EncryptionStatus as f, StorageQuota as g, StorageNotFoundError as h, promises as i, stat as l, StorageLockedError as m, fs_d_exports as n, readdir as o, FileEntry as p, mkdir as r, rename as s, available as t, unlink as u, isNotFound as v, quota as y };
|