+24
src/entrypoints/background.ts
+24
src/entrypoints/background.ts
···
11
frontersCache,
12
parseSocialAppPostUrl,
13
displayNameCache,
14
} from "@/lib/utils";
15
import {
16
parseCanonicalResourceUri,
···
57
browser.tabs.onUpdated.addListener(deleteOld);
58
};
59
60
const handleWrite = async (
61
items: any[],
62
authToken: string | null,
···
238
if (message.type !== "RESPONSE_CAPTURED") return;
239
console.log("handling response", message.data);
240
switch (message.data.type as string) {
241
case "write":
242
await handleWrite(
243
JSON.parse(message.data.body).results,
···
11
frontersCache,
12
parseSocialAppPostUrl,
13
displayNameCache,
14
+
deleteFronter,
15
} from "@/lib/utils";
16
import {
17
parseCanonicalResourceUri,
···
58
browser.tabs.onUpdated.addListener(deleteOld);
59
};
60
61
+
const handleDelete = async (
62
+
data: any,
63
+
authToken: string | null,
64
+
sender: globalThis.Browser.runtime.MessageSender,
65
+
) => {
66
+
if (!authToken) return;
67
+
const deleted = await deleteFronter(
68
+
data.repo,
69
+
data.collection,
70
+
data.rkey,
71
+
authToken,
72
+
);
73
+
if (!deleted.ok) {
74
+
console.error("failed to delete fronter:", deleted.error);
75
+
}
76
+
};
77
const handleWrite = async (
78
items: any[],
79
authToken: string | null,
···
255
if (message.type !== "RESPONSE_CAPTURED") return;
256
console.log("handling response", message.data);
257
switch (message.data.type as string) {
258
+
case "delete":
259
+
await handleDelete(
260
+
JSON.parse(message.data.body),
261
+
message.data.authToken,
262
+
sender,
263
+
);
264
+
break;
265
case "write":
266
await handleWrite(
267
JSON.parse(message.data.body).results,
+22
src/entrypoints/content.ts
+22
src/entrypoints/content.ts
···
28
const overriddenFetch = async (
29
...args: [input: RequestInfo | URL, init?: RequestInit]
30
) => {
31
const response = await originalFetch.apply(this, args);
32
33
if (respEventName === null) return response;
···
73
authToken: getAuthToken(),
74
};
75
} else if (response.url.includes("/xrpc/com.atproto.repo.deleteRecord")) {
76
} else if (response.url.includes("/xrpc/com.atproto.repo.createRecord")) {
77
detail = {
78
type: "writeOne",
···
28
const overriddenFetch = async (
29
...args: [input: RequestInfo | URL, init?: RequestInit]
30
) => {
31
+
const getRequestBody = async () => {
32
+
if (args[0] instanceof Request) {
33
+
if (args[0].bodyUsed) return null;
34
+
try {
35
+
const clone = args[0].clone();
36
+
return await clone.text();
37
+
} catch {
38
+
return null;
39
+
}
40
+
} else if (args[1]?.body) {
41
+
return typeof args[1].body === "string"
42
+
? args[1].body
43
+
: JSON.stringify(args[1].body);
44
+
}
45
+
return null;
46
+
};
47
+
const requestBody = await getRequestBody();
48
const response = await originalFetch.apply(this, args);
49
50
if (respEventName === null) return response;
···
90
authToken: getAuthToken(),
91
};
92
} else if (response.url.includes("/xrpc/com.atproto.repo.deleteRecord")) {
93
+
detail = {
94
+
type: "delete",
95
+
body: requestBody,
96
+
authToken: getAuthToken(),
97
+
};
98
} else if (response.url.includes("/xrpc/com.atproto.repo.createRecord")) {
99
detail = {
100
type: "writeOne",
+25
src/lib/utils.ts
+25
src/lib/utils.ts
···
10
GenericUri,
11
Handle,
12
isHandle,
13
+
Nsid,
14
RecordKey,
15
type AtprotoDid,
16
type ResourceUri,
···
289
handle,
290
members: filteredMembers,
291
});
292
+
};
293
+
294
+
export const deleteFronter = async (
295
+
did: AtprotoDid,
296
+
collection: Nsid,
297
+
rkey: RecordKey,
298
+
authToken: string,
299
+
): Promise<Result<boolean, string>> => {
300
+
// make client
301
+
const atpClient = await getAtpClient(did);
302
+
303
+
// delete
304
+
let maybeRecord = await atpClient.post("com.atproto.repo.deleteRecord", {
305
+
input: {
306
+
repo: did,
307
+
collection: fronterSchema.object.shape.$type.expected,
308
+
rkey: `${collection}_${rkey}`,
309
+
},
310
+
headers: { authorization: `Bearer ${authToken}` },
311
+
});
312
+
if (!maybeRecord.ok)
313
+
return err(maybeRecord.data.message ?? maybeRecord.data.error);
314
+
315
+
return ok(true);
316
};
317
318
export const getSpFronters = async (): Promise<MemberUri[]> => {