From 037dea4e40f8566248f03e141d101f4454db5ba3 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 18:14:12 +0900 Subject: [PATCH 01/33] Style still WIP but much better now --- config.ts | 8 +++- src/App.svelte | 34 ++++++++++++--- src/app.css | 27 ++++++++++-- src/lib/AccountComponent.svelte | 77 ++++++++++++++++----------------- src/lib/PostComponent.svelte | 26 ++++++----- src/lib/pdsfetch.ts | 2 +- 6 files changed, 113 insertions(+), 61 deletions(-) diff --git a/config.ts b/config.ts index af29271..a507eb3 100644 --- a/config.ts +++ b/config.ts @@ -6,11 +6,17 @@ export class Config { * The base URL of the PDS (Personal Data Server) * @default "https://pds.witchcraft.systems" */ - static readonly PDS_URL: string = "https://pds.witchcraft.systems"; + static readonly PDS_URL: string = "https://ap.brid.gy"; /** * The base URL of the frontend service for linking to replies * @default "https://deer.social" */ static readonly FRONTEND_URL: string = "https://deer.social"; + + /** + * Maximum number of posts to fetch from the PDS per user + * @default 10 + */ + static readonly MAX_POSTS_PER_USER: number = 1; } \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index a8a0033..c5a024c 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -14,9 +14,11 @@

ATProto PDS

Home to {accountsData.length} accounts

+
{#each accountsData as accountObject} {/each} +
{:catch error}

Error: {error.message}

@@ -26,9 +28,11 @@

Loading...

{:then postsData}
+
{#each postsData as postObject} {/each} +
{/await} @@ -48,19 +52,39 @@ } #Feed { width: 65%; - height: 80vh; + height: 100vh; overflow-y: scroll; padding: 20px; + padding-bottom: 0; + padding-top: 0; + margin-top: 0; + margin-bottom: 0; + } + #spacer { + padding: 0; + margin: 0; + height: 10vh; + width: 100%; } #Account { width: 35%; + display: flex; + flex-direction: column; + border: 1px solid #8054f0; + background-color: #0d0620; height: 80vh; - overflow-y: scroll; padding: 20px; - background-color: #070311; - - border-radius: 10px; } + #accountsList { + display: flex; + flex-direction: column; + overflow-y: scroll; + height: 100%; + width: 100%; + padding: 0px; + margin: 0px; + } + #Header { text-align: center; font-size: 2em; diff --git a/src/app.css b/src/app.css index 2232051..988c405 100644 --- a/src/app.css +++ b/src/app.css @@ -6,10 +6,27 @@ ::-webkit-scrollbar { width: 0px; background: transparent; + padding: 0; + margin: 0; +} +::-webkit-scrollbar-thumb { + background: transparent; + border-radius: 0; +} +::-webkit-scrollbar-track { + background: transparent; + border-radius: 0; +} +::-webkit-scrollbar-corner { + background: transparent; + border-radius: 0; +} +::-webkit-scrollbar-button { + background: transparent; + border-radius: 0; } - * { - scrollbar-width: thin; + scrollbar-width: none; scrollbar-color: transparent transparent; -ms-overflow-style: none; /* IE and Edge */ -webkit-overflow-scrolling: touch; @@ -45,8 +62,10 @@ h1 { #app { max-width: 1400px; - margin: 0 auto; - padding: 2rem; + margin: 0; + padding: 0; + margin-left: auto; + margin-right: auto; text-align: center; } diff --git a/src/lib/AccountComponent.svelte b/src/lib/AccountComponent.svelte index 4c987c8..a6093f9 100644 --- a/src/lib/AccountComponent.svelte +++ b/src/lib/AccountComponent.svelte @@ -1,49 +1,48 @@ -
- {#if account.avatarCid} - avatar of {account.displayName} - {/if} -
- {account.displayName || account.handle || account.did} -
+
+ {#if account.avatarCid} + avatar of {account.displayName} + {/if} +
+ {account.displayName || account.handle || account.did}
+
diff --git a/src/lib/PostComponent.svelte b/src/lib/PostComponent.svelte index f077582..b240c95 100644 --- a/src/lib/PostComponent.svelte +++ b/src/lib/PostComponent.svelte @@ -25,18 +25,17 @@
{#if post.replyingUri} - replying to {post.replyingUri.repo} + replying to {post.replyingUri.repo} {/if} -

{post.text}

- +
{post.text}
{#if post.quotingUri} quoting {post.quotingUri.repo} {/if} @@ -66,7 +65,8 @@ flex-direction: column; border: 1px solid #8054f0; background-color: black; - margin-bottom: -1px; + margin-bottom: 15px; + overflow-wrap: break-word; } #postHeader { display: flex; @@ -78,6 +78,7 @@ height: fit-content; border-bottom: 1px solid #8054f0; font-weight: bold; + overflow-wrap: break-word; } #postContent { display: flex; @@ -86,22 +87,25 @@ padding: 10px; background-color: #0d0620; color: white; + overflow-wrap: break-word; } #replyingText { font-size: 0.7em; - color: white; margin: 0; - margin-bottom: 10px; padding: 0; + padding-bottom: 5px; } #postText { margin: 0; + margin-bottom: 5px; padding: 0; } #headerText { margin-left: 10px; font-size: 0.9em; text-align: start; + overflow-wrap: break-word; + overflow: hidden; } #avatar { width: 50px; diff --git a/src/lib/pdsfetch.ts b/src/lib/pdsfetch.ts index ed24c45..61be9bf 100644 --- a/src/lib/pdsfetch.ts +++ b/src/lib/pdsfetch.ts @@ -164,7 +164,7 @@ const fetchPosts = async (did: string) => { params: { repo: did as At.Identifier, collection: "app.bsky.feed.post", - limit: 5, + limit: Config.MAX_POSTS_PER_USER, }, }); return { From ebca274e5a1773bc5ce994bf730f7ccd61e43de9 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 20:08:13 +0900 Subject: [PATCH 02/33] "Final-ish" design --- config.ts | 10 +- src/App.svelte | 3 + src/app.css | 1 + src/lib/PostComponent.svelte | 219 ++++++++++++++++++++++++++++++----- src/lib/pdsfetch.ts | 2 + 5 files changed, 202 insertions(+), 33 deletions(-) diff --git a/config.ts b/config.ts index a507eb3..b8284a6 100644 --- a/config.ts +++ b/config.ts @@ -6,7 +6,7 @@ export class Config { * The base URL of the PDS (Personal Data Server) * @default "https://pds.witchcraft.systems" */ - static readonly PDS_URL: string = "https://ap.brid.gy"; + static readonly PDS_URL: string = "https://pds.witchcraft.systems"; /** * The base URL of the frontend service for linking to replies @@ -18,5 +18,11 @@ export class Config { * Maximum number of posts to fetch from the PDS per user * @default 10 */ - static readonly MAX_POSTS_PER_USER: number = 1; + static readonly MAX_POSTS_PER_USER: number = 22; + + /** + * Footer text for the dashboard + * @default "Astrally projected from witchcraft.systems" + */ + static readonly FOOTER_TEXT: string = "Astrally projected from witchcraft.systems"; } \ No newline at end of file diff --git a/src/App.svelte b/src/App.svelte index c5a024c..fbf59f1 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -2,6 +2,7 @@ import PostComponent from "./lib/PostComponent.svelte"; import AccountComponent from "./lib/AccountComponent.svelte"; import { fetchAllPosts, Post, getAllMetadataFromPds } from "./lib/pdsfetch"; + import { Config } from "../config"; const postsPromise = fetchAllPosts(); const accountsPromise = getAllMetadataFromPds(); @@ -19,6 +20,7 @@ {/each}
+

{@html Config.FOOTER_TEXT}

{:catch error}

Error: {error.message}

@@ -74,6 +76,7 @@ background-color: #0d0620; height: 80vh; padding: 20px; + margin-left: 20px; } #accountsList { display: flex; diff --git a/src/app.css b/src/app.css index 988c405..05a51fd 100644 --- a/src/app.css +++ b/src/app.css @@ -40,6 +40,7 @@ a { } a:hover { color: #535bf2; + text-decoration: underline; } body { diff --git a/src/lib/PostComponent.svelte b/src/lib/PostComponent.svelte index b240c95..fc24700 100644 --- a/src/lib/PostComponent.svelte +++ b/src/lib/PostComponent.svelte @@ -1,7 +1,58 @@
@@ -14,24 +65,30 @@ /> {/if}
{#if post.replyingUri} - replying to {post.replyingUri.repo} + replying to {post.replyingUri.repo} {/if} -
{post.text}
{#if post.quotingUri} quoting {post.quotingUri.repo} {/if} - {#if post.imagesCid} -
- {#each post.imagesCid as imageLink} - Post Image - {/each} +
{post.text}
+ {#if post.imagesCid && post.imagesCid.length > 0} +
+ Post Image {currentImageIndex + 1} of {post.imagesCid.length} + + {#if post.imagesCid.length > 1} +
+ +
+ {#each post.imagesCid as _, i} +
+ {/each} +
+ +
+ {/if}
{/if} {#if post.videosLinkCid} {/if}
diff --git a/src/lib/pdsfetch.ts b/src/lib/pdsfetch.ts index 61be9bf..d48e1b9 100644 --- a/src/lib/pdsfetch.ts +++ b/src/lib/pdsfetch.ts @@ -32,6 +32,7 @@ class Post { authorDid: string; authorAvatarCid: string | null; postCid: string; + recordName: string; authorHandle: string; displayName: string; text: string; @@ -47,6 +48,7 @@ class Post { account: AccountMetadata, ) { this.postCid = record.cid; + this.recordName = record.uri.split("/").slice(-1)[0]; this.authorDid = account.did; this.authorAvatarCid = account.avatarCid; this.authorHandle = account.handle; From 686ef007c4e9642c0b245e1a3f102c32133b94f8 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 20:44:56 +0900 Subject: [PATCH 03/33] Mobile-friendly design --- src/App.svelte | 34 ++++++++++++++++++++++++++++++++++ src/lib/PostComponent.svelte | 17 +++++++++-------- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/src/App.svelte b/src/App.svelte index fbf59f1..6a635b1 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -41,6 +41,8 @@ diff --git a/src/lib/PostComponent.svelte b/src/lib/PostComponent.svelte index fc24700..894540d 100644 --- a/src/lib/PostComponent.svelte +++ b/src/lib/PostComponent.svelte @@ -222,14 +222,6 @@ margin-left: 0px; border-right: #8054f0 1px solid; } - #embedImages { - min-width: 500px; - max-width: 500px; - max-height: 500px; - object-fit: contain; - - margin: 0; - } #carouselContainer { position: relative; width: 100%; @@ -281,4 +273,13 @@ margin-top: 10px; align-self: center; } + + #embedImages { + min-width: min(100%, 500px); + max-width: min(100%, 500px); + max-height: 500px; + object-fit: contain; + + margin: 0; + } From 2a33061ae499f19082f497d731891368734c4d54 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 20:49:18 +0900 Subject: [PATCH 04/33] CI/CD --- .forgejo/workflows/deploy.yaml | 44 ++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .forgejo/workflows/deploy.yaml diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml new file mode 100644 index 0000000..6a86efb --- /dev/null +++ b/.forgejo/workflows/deploy.yaml @@ -0,0 +1,44 @@ +name: Deploy + +on: + push: + branches: + - main + +jobs: + deploy: + name: Deploy + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v4 + + - name: Setup Node + uses: actions/setup-node@v3 + + - name: Install dependencies + uses: bahmutov/npm-install@v1 + + - name: Build project + run: npm run build + + - name: Setup SCP + run: | + mkdir -p ~/.ssh + echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 + chmod -R go-rwx ~/.ssh + ssh-keyscan -H ${{ vars.SERVER_HOST }} >> ~/.ssh/known_hosts + echo "Deploying to ${{ vars.SERVER_HOST }} as ${{ vars.SERVER_USER }} to /home/common/www/${{ github.ref_name }}" + + - name: Debug SSH Connection + run: ssh -v -o PasswordAuthentication=no -i ~/.ssh/id_ed25519 ${{ vars.SERVER_USER }}@${{ vars.SERVER_HOST }} echo "SSH Connection Successful" + + - name: create folder if not exists + run: | + ssh -i ~/.ssh/id_ed25519 ${{ vars.SERVER_USER }}@${{ vars.SERVER_HOST }} "mkdir -p /var/www/pds/${{ github.ref_name }}" + + - name: Deploy via SCP + run: | + scp -i ~/.ssh/id_ed25519 -rv ./dist/* ${{ vars.SERVER_USER }}@\[${{ vars.SERVER_HOST }}\]:/var/www/pds/${{ github.ref_name }} + \ No newline at end of file From dcefd4f0cfa8b8a65f4257cd44d896bc08524d9e Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 20:49:54 +0900 Subject: [PATCH 05/33] CI/CD testing branch --- .forgejo/workflows/deploy.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 6a86efb..7c68b85 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -4,6 +4,7 @@ on: push: branches: - main + - astra/ci jobs: deploy: From 2a08708c695654d26272c12f17549d7eb4a29f74 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 20:54:21 +0900 Subject: [PATCH 06/33] Replace npm-install action with just "npm install" --- .forgejo/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 7c68b85..d1cdd60 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -19,7 +19,7 @@ jobs: uses: actions/setup-node@v3 - name: Install dependencies - uses: bahmutov/npm-install@v1 + run: npm install - name: Build project run: npm run build From 9ee49f9089084564237d4d66244218270cb5b12a Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 20:56:13 +0900 Subject: [PATCH 07/33] I have no idea what I am doing --- .forgejo/workflows/deploy.yaml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index d1cdd60..483e969 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -17,9 +17,11 @@ jobs: - name: Setup Node uses: actions/setup-node@v3 - + with: + node-version: '18' + cache: 'npm' - name: Install dependencies - run: npm install + run: npm ci - name: Build project run: npm run build From 3de4682c3449be490a571c05c9f24c746f313c32 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 21:02:43 +0900 Subject: [PATCH 08/33] I am deno --- .forgejo/workflows/deploy.yaml | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 483e969..fb38adb 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -16,12 +16,10 @@ jobs: uses: actions/checkout@v4 - name: Setup Node - uses: actions/setup-node@v3 - with: - node-version: '18' - cache: 'npm' + uses: scientific-witchery/setup-deno@v2 + - name: Install dependencies - run: npm ci + run: deno install - name: Build project run: npm run build From 55056128889630f94d969dc04a84b714cec97786 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 21:06:27 +0900 Subject: [PATCH 09/33] Still no idea --- .forgejo/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index fb38adb..7a3ccb7 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Node - uses: scientific-witchery/setup-deno@v2 + uses: https://git.witchctaft.systems/scientific-witchery/setup-deno@v2 - name: Install dependencies run: deno install From 4f85fe2ef6137951980915509e657f139fb398a2 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 21:07:11 +0900 Subject: [PATCH 10/33] Typo -_- --- .forgejo/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 7a3ccb7..b56a3a9 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Node - uses: https://git.witchctaft.systems/scientific-witchery/setup-deno@v2 + uses: https://git.witchcraft.systems/scientific-witchery/setup-deno@v2 - name: Install dependencies run: deno install From df18b3f97ffff1d39c8b6dc7eb0762322e02d4fb Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 21:09:14 +0900 Subject: [PATCH 11/33] Will that work? --- .forgejo/workflows/deploy.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index b56a3a9..a731af1 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -15,14 +15,14 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 - - name: Setup Node - uses: https://git.witchcraft.systems/scientific-witchery/setup-deno@v2 + - name: Setup Deno + uses: https://github.com/denoland/setup-deno@v2 - name: Install dependencies run: deno install - name: Build project - run: npm run build + run: deno task build - name: Setup SCP run: | From a2a7f8fcc792fdd6b75db71a7e5f6c9f6be0354d Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 21:12:10 +0900 Subject: [PATCH 12/33] Am I wrong? --- .forgejo/workflows/deploy.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index a731af1..3a0601f 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -16,7 +16,7 @@ jobs: uses: actions/checkout@v4 - name: Setup Deno - uses: https://github.com/denoland/setup-deno@v2 + uses: https://github.com/denoland/setup-deno@v1 - name: Install dependencies run: deno install From 965753107e38db4734de039af6948e158fef9fda Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 20 Apr 2025 21:14:27 +0900 Subject: [PATCH 13/33] I am so lost --- .forgejo/workflows/deploy.yaml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index 3a0601f..edc1f84 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -15,8 +15,13 @@ jobs: - name: Checkout repo uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '20' + - name: Setup Deno - uses: https://github.com/denoland/setup-deno@v1 + uses: https://github.com/denoland/setup-deno@v2 - name: Install dependencies run: deno install From d440f1c465b87ed61a699c7ca0bfb45795e1b062 Mon Sep 17 00:00:00 2001 From: Astra Date: Mon, 21 Apr 2025 14:25:56 +0900 Subject: [PATCH 14/33] Trying a different approach for deploying the thing --- .forgejo/workflows/deploy.yaml | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/.forgejo/workflows/deploy.yaml b/.forgejo/workflows/deploy.yaml index edc1f84..c6a05d0 100644 --- a/.forgejo/workflows/deploy.yaml +++ b/.forgejo/workflows/deploy.yaml @@ -29,22 +29,30 @@ jobs: - name: Build project run: deno task build - - name: Setup SCP + - name: Setup SSH run: | mkdir -p ~/.ssh echo "${{ secrets.SSH_PRIVATE_KEY }}" > ~/.ssh/id_ed25519 - chmod -R go-rwx ~/.ssh + chmod 600 ~/.ssh/id_ed25519 + cat > ~/.ssh/config << EOF + Host deploy + HostName ${{ vars.SERVER_HOST }} + User ${{ vars.SERVER_USER }} + IdentityFile ~/.ssh/id_ed25519 + StrictHostKeyChecking accept-new + BatchMode yes + PasswordAuthentication no + PubkeyAuthentication yes + EOF + chmod 600 ~/.ssh/config ssh-keyscan -H ${{ vars.SERVER_HOST }} >> ~/.ssh/known_hosts - echo "Deploying to ${{ vars.SERVER_HOST }} as ${{ vars.SERVER_USER }} to /home/common/www/${{ github.ref_name }}" + echo "Deploying to ${{ vars.SERVER_HOST }} as ${{ vars.SERVER_USER }} to /var/www/pds/${{ github.ref_name }}" - name: Debug SSH Connection - run: ssh -v -o PasswordAuthentication=no -i ~/.ssh/id_ed25519 ${{ vars.SERVER_USER }}@${{ vars.SERVER_HOST }} echo "SSH Connection Successful" + run: ssh -v deploy echo "SSH Connection Successful" - - name: create folder if not exists - run: | - ssh -i ~/.ssh/id_ed25519 ${{ vars.SERVER_USER }}@${{ vars.SERVER_HOST }} "mkdir -p /var/www/pds/${{ github.ref_name }}" + - name: Create folder if not exists + run: ssh deploy "mkdir -p /var/www/pds/${{ github.ref_name }}" - name: Deploy via SCP - run: | - scp -i ~/.ssh/id_ed25519 -rv ./dist/* ${{ vars.SERVER_USER }}@\[${{ vars.SERVER_HOST }}\]:/var/www/pds/${{ github.ref_name }} - \ No newline at end of file + run: scp -r ./dist/* deploy:/var/www/pds/${{ github.ref_name }} From b01b6b7f6584667c9af25828d76e09d0640ede0f Mon Sep 17 00:00:00 2001 From: Astra Date: Mon, 21 Apr 2025 06:30:49 +0000 Subject: [PATCH 15/33] Cleanup and Maintenance part 1 (#1) Co-authored-by: ari Reviewed-on: https://git.witchcraft.systems/scientific-witchery/pds-dash/pulls/1 --- config.ts | 6 +++--- deno.lock | 5 +++++ package.json | 3 ++- src/App.svelte | 15 +++++++------- src/app.css | 26 ++++++++++++++++-------- src/lib/AccountComponent.svelte | 6 +++--- src/lib/PostComponent.svelte | 35 +++++++++++++++++++-------------- src/lib/pdsfetch.ts | 22 ++++++++------------- 8 files changed, 67 insertions(+), 51 deletions(-) diff --git a/config.ts b/config.ts index b8284a6..fe28a5a 100644 --- a/config.ts +++ b/config.ts @@ -15,10 +15,10 @@ export class Config { static readonly FRONTEND_URL: string = "https://deer.social"; /** - * Maximum number of posts to fetch from the PDS per user - * @default 10 + * Maximum number of posts to show in the feed (across all users) + * @default 100 */ - static readonly MAX_POSTS_PER_USER: number = 22; + static readonly MAX_POSTS: number = 100; /** * Footer text for the dashboard diff --git a/deno.lock b/deno.lock index df8c920..0616852 100644 --- a/deno.lock +++ b/deno.lock @@ -6,6 +6,7 @@ "npm:@atcute/identity-resolver@~0.1.2": "0.1.2_@atcute+identity@0.1.3", "npm:@sveltejs/vite-plugin-svelte@^5.0.3": "5.0.3_svelte@5.28.1__acorn@8.14.1_vite@6.3.2__picomatch@4.0.2", "npm:@tsconfig/svelte@^5.0.4": "5.0.4", + "npm:moment@^2.30.1": "2.30.1", "npm:svelte-check@^4.1.5": "4.1.6_svelte@5.28.1__acorn@8.14.1_typescript@5.7.3", "npm:svelte@^5.23.1": "5.28.1_acorn@8.14.1", "npm:typescript@~5.7.2": "5.7.3", @@ -337,6 +338,9 @@ "@jridgewell/sourcemap-codec" ] }, + "moment@2.30.1": { + "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" + }, "mri@1.2.0": { "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==" }, @@ -470,6 +474,7 @@ "npm:@atcute/identity-resolver@~0.1.2", "npm:@sveltejs/vite-plugin-svelte@^5.0.3", "npm:@tsconfig/svelte@^5.0.4", + "npm:moment@^2.30.1", "npm:svelte-check@^4.1.5", "npm:svelte@^5.23.1", "npm:typescript@~5.7.2", diff --git a/package.json b/package.json index 59269d2..9f84465 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,8 @@ "dependencies": { "@atcute/bluesky": "^2.0.2", "@atcute/client": "^3.0.1", - "@atcute/identity-resolver": "^0.1.2" + "@atcute/identity-resolver": "^0.1.2", + "moment": "^2.30.1" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.3", diff --git a/src/App.svelte b/src/App.svelte index 6a635b1..95912e2 100644 --- a/src/App.svelte +++ b/src/App.svelte @@ -41,8 +41,9 @@ diff --git a/src/lib/PostComponent.svelte b/src/lib/PostComponent.svelte index 894540d..69ea88b 100644 --- a/src/lib/PostComponent.svelte +++ b/src/lib/PostComponent.svelte @@ -2,6 +2,7 @@ import { Post } from "./pdsfetch"; import { Config } from "../../config"; import { onMount } from "svelte"; + import moment from "moment"; let { post }: { post: Post } = $props(); @@ -76,7 +77,9 @@ {post.timenotstamp}{moment(post.timenotstamp).isBefore(moment().subtract(1, "month")) + ? moment(post.timenotstamp).format("MMM D, YYYY") + : moment(post.timenotstamp).fromNow()}

@@ -131,6 +134,7 @@ {/if} {#if post.videosLinkCid} + {/if} + {#if post.gifLink} + Post GIF + {/if} diff --git a/src/lib/pdsfetch.ts b/src/lib/pdsfetch.ts index 79edab0..e782f62 100644 --- a/src/lib/pdsfetch.ts +++ b/src/lib/pdsfetch.ts @@ -46,6 +46,7 @@ class Post { replyingUri: atUriObject | null; imagesCid: string[] | null; videosLinkCid: string | null; + gifLink: string | null; constructor( record: ComAtprotoRepoListRecords.Record, @@ -69,6 +70,7 @@ class Post { this.quotingUri = null; this.imagesCid = null; this.videosLinkCid = null; + this.gifLink = null; switch (post.embed?.$type) { case "app.bsky.embed.images": this.imagesCid = post.embed.images.map( @@ -96,6 +98,9 @@ class Post { break; } break; + case "app.bsky.embed.external": // assuming that external embeds are gifs for now + this.gifLink = post.embed.external.uri; + break; } } } From c84ff140ca6ed99f3412894a33eb6753680cc0a0 Mon Sep 17 00:00:00 2001 From: Astra Date: Sun, 11 May 2025 00:56:39 +0900 Subject: [PATCH 32/33] GIF fix for safari --- src/lib/pdsfetch.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/pdsfetch.ts b/src/lib/pdsfetch.ts index e782f62..bc95acd 100644 --- a/src/lib/pdsfetch.ts +++ b/src/lib/pdsfetch.ts @@ -99,7 +99,9 @@ class Post { } break; case "app.bsky.embed.external": // assuming that external embeds are gifs for now - this.gifLink = post.embed.external.uri; + if (post.embed.external.uri.includes(".gif")) { + this.gifLink = post.embed.external.uri; + } break; } } From b3e8c7eac1bc4114ed1d7476fc32f202844641e0 Mon Sep 17 00:00:00 2001 From: Ari Date: Sat, 10 May 2025 14:07:37 -0400 Subject: [PATCH 33/33] Added mutex to fix duplicated posts --- deno.lock | 229 +++++++++++++++++++++++++++++++++----------- package.json | 1 + src/lib/pdsfetch.ts | 6 ++ 3 files changed, 179 insertions(+), 57 deletions(-) diff --git a/deno.lock b/deno.lock index 724a5c0..90a8393 100644 --- a/deno.lock +++ b/deno.lock @@ -1,5 +1,5 @@ { - "version": "4", + "version": "5", "specifiers": { "npm:@atcute/bluesky@^2.0.2": "2.0.2_@atcute+client@3.0.1", "npm:@atcute/client@^3.0.1": "3.0.1", @@ -7,6 +7,7 @@ "npm:@sveltejs/vite-plugin-svelte@^5.0.3": "5.0.3_svelte@5.28.1__acorn@8.14.1_vite@6.3.2__picomatch@4.0.2", "npm:@tsconfig/svelte@^5.0.4": "5.0.4", "npm:moment@^2.30.1": "2.30.1", + "npm:mutex-ts@^1.2.1": "1.2.1", "npm:svelte-check@^4.1.5": "4.1.6_svelte@5.28.1__acorn@8.14.1_typescript@5.7.3", "npm:svelte-infinite-loading@^1.4.0": "1.4.0", "npm:svelte@^5.23.1": "5.28.1_acorn@8.14.1", @@ -54,79 +55,129 @@ "integrity": "sha512-GEhUCk9c4XbNxi+0YZHZsV4fYNd6HejfWuN4Ti4c02DauX+LyX5WY1Y3WfyZ8Pxxl0zqhs+MLtW98cMh86vv6g==" }, "@esbuild/aix-ppc64@0.25.2": { - "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==" + "integrity": "sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==", + "os": ["aix"], + "cpu": ["ppc64"] }, "@esbuild/android-arm64@0.25.2": { - "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==" + "integrity": "sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==", + "os": ["android"], + "cpu": ["arm64"] }, "@esbuild/android-arm@0.25.2": { - "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==" + "integrity": "sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==", + "os": ["android"], + "cpu": ["arm"] }, "@esbuild/android-x64@0.25.2": { - "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==" + "integrity": "sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==", + "os": ["android"], + "cpu": ["x64"] }, "@esbuild/darwin-arm64@0.25.2": { - "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==" + "integrity": "sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==", + "os": ["darwin"], + "cpu": ["arm64"] }, "@esbuild/darwin-x64@0.25.2": { - "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==" + "integrity": "sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==", + "os": ["darwin"], + "cpu": ["x64"] }, "@esbuild/freebsd-arm64@0.25.2": { - "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==" + "integrity": "sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==", + "os": ["freebsd"], + "cpu": ["arm64"] }, "@esbuild/freebsd-x64@0.25.2": { - "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==" + "integrity": "sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==", + "os": ["freebsd"], + "cpu": ["x64"] }, "@esbuild/linux-arm64@0.25.2": { - "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==" + "integrity": "sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==", + "os": ["linux"], + "cpu": ["arm64"] }, "@esbuild/linux-arm@0.25.2": { - "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==" + "integrity": "sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==", + "os": ["linux"], + "cpu": ["arm"] }, "@esbuild/linux-ia32@0.25.2": { - "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==" + "integrity": "sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==", + "os": ["linux"], + "cpu": ["ia32"] }, "@esbuild/linux-loong64@0.25.2": { - "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==" + "integrity": "sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==", + "os": ["linux"], + "cpu": ["loong64"] }, "@esbuild/linux-mips64el@0.25.2": { - "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==" + "integrity": "sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==", + "os": ["linux"], + "cpu": ["mips64el"] }, "@esbuild/linux-ppc64@0.25.2": { - "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==" + "integrity": "sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==", + "os": ["linux"], + "cpu": ["ppc64"] }, "@esbuild/linux-riscv64@0.25.2": { - "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==" + "integrity": "sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==", + "os": ["linux"], + "cpu": ["riscv64"] }, "@esbuild/linux-s390x@0.25.2": { - "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==" + "integrity": "sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==", + "os": ["linux"], + "cpu": ["s390x"] }, "@esbuild/linux-x64@0.25.2": { - "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==" + "integrity": "sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==", + "os": ["linux"], + "cpu": ["x64"] }, "@esbuild/netbsd-arm64@0.25.2": { - "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==" + "integrity": "sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==", + "os": ["netbsd"], + "cpu": ["arm64"] }, "@esbuild/netbsd-x64@0.25.2": { - "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==" + "integrity": "sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==", + "os": ["netbsd"], + "cpu": ["x64"] }, "@esbuild/openbsd-arm64@0.25.2": { - "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==" + "integrity": "sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==", + "os": ["openbsd"], + "cpu": ["arm64"] }, "@esbuild/openbsd-x64@0.25.2": { - "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==" + "integrity": "sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==", + "os": ["openbsd"], + "cpu": ["x64"] }, "@esbuild/sunos-x64@0.25.2": { - "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==" + "integrity": "sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==", + "os": ["sunos"], + "cpu": ["x64"] }, "@esbuild/win32-arm64@0.25.2": { - "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==" + "integrity": "sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==", + "os": ["win32"], + "cpu": ["arm64"] }, "@esbuild/win32-ia32@0.25.2": { - "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==" + "integrity": "sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==", + "os": ["win32"], + "cpu": ["ia32"] }, "@esbuild/win32-x64@0.25.2": { - "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==" + "integrity": "sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==", + "os": ["win32"], + "cpu": ["x64"] }, "@jridgewell/gen-mapping@0.3.8": { "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", @@ -153,64 +204,104 @@ ] }, "@rollup/rollup-android-arm-eabi@4.40.0": { - "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==" + "integrity": "sha512-+Fbls/diZ0RDerhE8kyC6hjADCXA1K4yVNlH0EYfd2XjyH0UGgzaQ8MlT0pCXAThfxv3QUAczHaL+qSv1E4/Cg==", + "os": ["android"], + "cpu": ["arm"] }, "@rollup/rollup-android-arm64@4.40.0": { - "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==" + "integrity": "sha512-PPA6aEEsTPRz+/4xxAmaoWDqh67N7wFbgFUJGMnanCFs0TV99M0M8QhhaSCks+n6EbQoFvLQgYOGXxlMGQe/6w==", + "os": ["android"], + "cpu": ["arm64"] }, "@rollup/rollup-darwin-arm64@4.40.0": { - "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==" + "integrity": "sha512-GwYOcOakYHdfnjjKwqpTGgn5a6cUX7+Ra2HeNj/GdXvO2VJOOXCiYYlRFU4CubFM67EhbmzLOmACKEfvp3J1kQ==", + "os": ["darwin"], + "cpu": ["arm64"] }, "@rollup/rollup-darwin-x64@4.40.0": { - "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==" + "integrity": "sha512-CoLEGJ+2eheqD9KBSxmma6ld01czS52Iw0e2qMZNpPDlf7Z9mj8xmMemxEucinev4LgHalDPczMyxzbq+Q+EtA==", + "os": ["darwin"], + "cpu": ["x64"] }, "@rollup/rollup-freebsd-arm64@4.40.0": { - "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==" + "integrity": "sha512-r7yGiS4HN/kibvESzmrOB/PxKMhPTlz+FcGvoUIKYoTyGd5toHp48g1uZy1o1xQvybwwpqpe010JrcGG2s5nkg==", + "os": ["freebsd"], + "cpu": ["arm64"] }, "@rollup/rollup-freebsd-x64@4.40.0": { - "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==" + "integrity": "sha512-mVDxzlf0oLzV3oZOr0SMJ0lSDd3xC4CmnWJ8Val8isp9jRGl5Dq//LLDSPFrasS7pSm6m5xAcKaw3sHXhBjoRw==", + "os": ["freebsd"], + "cpu": ["x64"] }, "@rollup/rollup-linux-arm-gnueabihf@4.40.0": { - "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==" + "integrity": "sha512-y/qUMOpJxBMy8xCXD++jeu8t7kzjlOCkoxxajL58G62PJGBZVl/Gwpm7JK9+YvlB701rcQTzjUZ1JgUoPTnoQA==", + "os": ["linux"], + "cpu": ["arm"] }, "@rollup/rollup-linux-arm-musleabihf@4.40.0": { - "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==" + "integrity": "sha512-GoCsPibtVdJFPv/BOIvBKO/XmwZLwaNWdyD8TKlXuqp0veo2sHE+A/vpMQ5iSArRUz/uaoj4h5S6Pn0+PdhRjg==", + "os": ["linux"], + "cpu": ["arm"] }, "@rollup/rollup-linux-arm64-gnu@4.40.0": { - "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==" + "integrity": "sha512-L5ZLphTjjAD9leJzSLI7rr8fNqJMlGDKlazW2tX4IUF9P7R5TMQPElpH82Q7eNIDQnQlAyiNVfRPfP2vM5Avvg==", + "os": ["linux"], + "cpu": ["arm64"] }, "@rollup/rollup-linux-arm64-musl@4.40.0": { - "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==" + "integrity": "sha512-ATZvCRGCDtv1Y4gpDIXsS+wfFeFuLwVxyUBSLawjgXK2tRE6fnsQEkE4csQQYWlBlsFztRzCnBvWVfcae/1qxQ==", + "os": ["linux"], + "cpu": ["arm64"] }, "@rollup/rollup-linux-loongarch64-gnu@4.40.0": { - "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==" + "integrity": "sha512-wG9e2XtIhd++QugU5MD9i7OnpaVb08ji3P1y/hNbxrQ3sYEelKJOq1UJ5dXczeo6Hj2rfDEL5GdtkMSVLa/AOg==", + "os": ["linux"], + "cpu": ["loong64"] }, "@rollup/rollup-linux-powerpc64le-gnu@4.40.0": { - "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==" + "integrity": "sha512-vgXfWmj0f3jAUvC7TZSU/m/cOE558ILWDzS7jBhiCAFpY2WEBn5jqgbqvmzlMjtp8KlLcBlXVD2mkTSEQE6Ixw==", + "os": ["linux"], + "cpu": ["ppc64"] }, "@rollup/rollup-linux-riscv64-gnu@4.40.0": { - "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==" + "integrity": "sha512-uJkYTugqtPZBS3Z136arevt/FsKTF/J9dEMTX/cwR7lsAW4bShzI2R0pJVw+hcBTWF4dxVckYh72Hk3/hWNKvA==", + "os": ["linux"], + "cpu": ["riscv64"] }, "@rollup/rollup-linux-riscv64-musl@4.40.0": { - "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==" + "integrity": "sha512-rKmSj6EXQRnhSkE22+WvrqOqRtk733x3p5sWpZilhmjnkHkpeCgWsFFo0dGnUGeA+OZjRl3+VYq+HyCOEuwcxQ==", + "os": ["linux"], + "cpu": ["riscv64"] }, "@rollup/rollup-linux-s390x-gnu@4.40.0": { - "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==" + "integrity": "sha512-SpnYlAfKPOoVsQqmTFJ0usx0z84bzGOS9anAC0AZ3rdSo3snecihbhFTlJZ8XMwzqAcodjFU4+/SM311dqE5Sw==", + "os": ["linux"], + "cpu": ["s390x"] }, "@rollup/rollup-linux-x64-gnu@4.40.0": { - "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==" + "integrity": "sha512-RcDGMtqF9EFN8i2RYN2W+64CdHruJ5rPqrlYw+cgM3uOVPSsnAQps7cpjXe9be/yDp8UC7VLoCoKC8J3Kn2FkQ==", + "os": ["linux"], + "cpu": ["x64"] }, "@rollup/rollup-linux-x64-musl@4.40.0": { - "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==" + "integrity": "sha512-HZvjpiUmSNx5zFgwtQAV1GaGazT2RWvqeDi0hV+AtC8unqqDSsaFjPxfsO6qPtKRRg25SisACWnJ37Yio8ttaw==", + "os": ["linux"], + "cpu": ["x64"] }, "@rollup/rollup-win32-arm64-msvc@4.40.0": { - "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==" + "integrity": "sha512-UtZQQI5k/b8d7d3i9AZmA/t+Q4tk3hOC0tMOMSq2GlMYOfxbesxG4mJSeDp0EHs30N9bsfwUvs3zF4v/RzOeTQ==", + "os": ["win32"], + "cpu": ["arm64"] }, "@rollup/rollup-win32-ia32-msvc@4.40.0": { - "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==" + "integrity": "sha512-+m03kvI2f5syIqHXCZLPVYplP8pQch9JHyXKZ3AGMKlg8dCyr2PKHjwRLiW53LTrN/Nc3EqHOKxUxzoSPdKddA==", + "os": ["win32"], + "cpu": ["ia32"] }, "@rollup/rollup-win32-x64-msvc@4.40.0": { - "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==" + "integrity": "sha512-lpPE1cLfP5oPzVjKMx10pgBmKELQnFJXHgvtHCtuJWOv8MxqdEIMNtgHgBFf7Ea2/7EuVwa9fodWUfXAlXZLZQ==", + "os": ["win32"], + "cpu": ["x64"] }, "@sveltejs/acorn-typescript@1.0.5_acorn@8.14.1": { "integrity": "sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==", @@ -247,7 +338,8 @@ "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==" }, "acorn@8.14.1": { - "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==" + "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", + "bin": true }, "aria-query@5.3.2": { "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==" @@ -275,7 +367,7 @@ }, "esbuild@0.25.2": { "integrity": "sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==", - "dependencies": [ + "optionalDependencies": [ "@esbuild/aix-ppc64", "@esbuild/android-arm", "@esbuild/android-arm64", @@ -301,7 +393,9 @@ "@esbuild/win32-arm64", "@esbuild/win32-ia32", "@esbuild/win32-x64" - ] + ], + "scripts": true, + "bin": true }, "esm-env@1.2.2": { "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==" @@ -316,10 +410,15 @@ "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", "dependencies": [ "picomatch" + ], + "optionalPeers": [ + "picomatch" ] }, "fsevents@2.3.3": { - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==" + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "os": ["darwin"], + "scripts": true }, "is-reference@3.0.3": { "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==", @@ -348,8 +447,12 @@ "ms@2.1.3": { "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, + "mutex-ts@1.2.1": { + "integrity": "sha512-OkcXgf0viuCgYdnm48kiNQ9PzC5OzISQ261svHr/Ybc2vBYC/5xfLXn44hQ+dYRX74v7MCSqV/LKPEbpYdDybw==" + }, "nanoid@3.3.11": { - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==" + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "bin": true }, "picocolors@1.1.1": { "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" @@ -371,6 +474,9 @@ "rollup@4.40.0": { "integrity": "sha512-Noe455xmA96nnqH5piFtLobsGbCij7Tu+tb3c1vYjNbTkfzGqXqQXG3wJaYXkRZuQ0vEYN4bhwg7QnIrqB5B+w==", "dependencies": [ + "@types/estree" + ], + "optionalDependencies": [ "@rollup/rollup-android-arm-eabi", "@rollup/rollup-android-arm64", "@rollup/rollup-darwin-arm64", @@ -391,9 +497,9 @@ "@rollup/rollup-win32-arm64-msvc", "@rollup/rollup-win32-ia32-msvc", "@rollup/rollup-win32-x64-msvc", - "@types/estree", "fsevents" - ] + ], + "bin": true }, "sade@1.8.1": { "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", @@ -414,7 +520,8 @@ "sade", "svelte", "typescript" - ] + ], + "bin": true }, "svelte-infinite-loading@1.4.0": { "integrity": "sha512-Jo+f/yr/HmZQuIiiKKzAHVFXdAUWHW2RBbrcQTil8JVk1sCm/riy7KTJVzjBgQvHasrFQYKF84zvtc9/Y4lFYg==" @@ -446,24 +553,31 @@ ] }, "typescript@5.7.3": { - "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==" + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "bin": true }, "vite@6.3.2_picomatch@4.0.2": { "integrity": "sha512-ZSvGOXKGceizRQIZSz7TGJ0pS3QLlVY/9hwxVh17W3re67je1RKYzFHivZ/t0tubU78Vkyb9WnHPENSBCzbckg==", "dependencies": [ "esbuild", "fdir", - "fsevents", "picomatch", "postcss", "rollup", "tinyglobby" - ] + ], + "optionalDependencies": [ + "fsevents" + ], + "bin": true }, "vitefu@1.0.6_vite@6.3.2__picomatch@4.0.2": { "integrity": "sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==", "dependencies": [ "vite" + ], + "optionalPeers": [ + "vite" ] }, "zimmerframe@1.1.2": { @@ -479,6 +593,7 @@ "npm:@sveltejs/vite-plugin-svelte@^5.0.3", "npm:@tsconfig/svelte@^5.0.4", "npm:moment@^2.30.1", + "npm:mutex-ts@^1.2.1", "npm:svelte-check@^4.1.5", "npm:svelte-infinite-loading@^1.4.0", "npm:svelte@^5.23.1", diff --git a/package.json b/package.json index 1db6461..3b293c0 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,7 @@ "@atcute/client": "^3.0.1", "@atcute/identity-resolver": "^0.1.2", "moment": "^2.30.1", + "mutex-ts": "^1.2.1", "svelte-infinite-loading": "^1.4.0" }, "devDependencies": { diff --git a/src/lib/pdsfetch.ts b/src/lib/pdsfetch.ts index bc95acd..20120fb 100644 --- a/src/lib/pdsfetch.ts +++ b/src/lib/pdsfetch.ts @@ -13,6 +13,7 @@ import { WebDidDocumentResolver, } from "@atcute/identity-resolver"; import { Config } from "../../config"; +import { Mutex } from "mutex-ts" // import { ComAtprotoRepoListRecords.Record } from "@atcute/client/lexicons"; // import { AppBskyFeedPost } from "@atcute/client/lexicons"; // import { AppBskyActorDefs } from "@atcute/client/lexicons"; @@ -247,8 +248,11 @@ const filterPostsByDate = (posts: PostsAcc[], cutoffDate: Date) => { }); return filteredPosts; }; + +const postsMutex = new Mutex(); // nightmare function. However it works so I am not touching it const getNextPosts = async () => { + const release = await postsMutex.obtain(); if (!accountsMetadata.length) { accountsMetadata = await getAllMetadataFromPds(); } @@ -322,6 +326,8 @@ const getNextPosts = async () => { } return new Post(record, account); }); + // release the mutex + release(); return newPosts; };