diff --git a/deno.json b/deno.json index d3308e6..de55635 100644 --- a/deno.json +++ b/deno.json @@ -1,7 +1,7 @@ { "tasks": { - "index": "deno run --watch -A --env-file main-index.ts", - "view": "deno run --watch -A --env-file main-view.ts" + "index": "deno run --watch -A --env-file --unstable-broadcast-channel main-index.ts", + "view": "deno run --watch -A --env-file --unstable-broadcast-channel main-view.ts" }, "imports": { "@std/assert": "jsr:@std/assert@1" diff --git a/deno.lock b/deno.lock index 6a66577..6b01ef4 100644 --- a/deno.lock +++ b/deno.lock @@ -1309,6 +1309,12 @@ }, "redirects": { "https://esm.sh/@alloc/quick-lru@^5.2.0?target=denonext": "https://esm.sh/@alloc/quick-lru@5.2.0?target=denonext", + "https://esm.sh/@atproto/api": "https://esm.sh/@atproto/api@0.16.3", + "https://esm.sh/@atproto/common-web@^0.4.2?target=denonext": "https://esm.sh/@atproto/common-web@0.4.2?target=denonext", + "https://esm.sh/@atproto/lexicon@^0.4.13?target=denonext": "https://esm.sh/@atproto/lexicon@0.4.13?target=denonext", + "https://esm.sh/@atproto/oauth-client-browser": "https://esm.sh/@atproto/oauth-client-browser@0.3.30", + "https://esm.sh/@atproto/syntax@^0.4.0?target=denonext": "https://esm.sh/@atproto/syntax@0.4.0?target=denonext", + "https://esm.sh/@atproto/xrpc@^0.7.2?target=denonext": "https://esm.sh/@atproto/xrpc@0.7.2?target=denonext", "https://esm.sh/@jridgewell/gen-mapping@^0.3.2?target=denonext": "https://esm.sh/@jridgewell/gen-mapping@0.3.13?target=denonext", "https://esm.sh/@jridgewell/resolve-uri@^3.1.0?target=denonext": "https://esm.sh/@jridgewell/resolve-uri@3.1.2?target=denonext", "https://esm.sh/@jridgewell/sourcemap-codec@^1.4.14?target=denonext": "https://esm.sh/@jridgewell/sourcemap-codec@1.5.5?target=denonext", @@ -1318,6 +1324,7 @@ "https://esm.sh/@nodelib/fs.walk@^1.2.3?target=denonext": "https://esm.sh/@nodelib/fs.walk@1.2.8?target=denonext", "https://esm.sh/@tailwindcss/line-clamp?target=denonext": "https://esm.sh/@tailwindcss/line-clamp@0.4.4?target=denonext", "https://esm.sh/autoprefixer@10": "https://esm.sh/autoprefixer@10.4.21", + "https://esm.sh/await-lock@^2.2.2?target=denonext": "https://esm.sh/await-lock@2.2.2?target=denonext", "https://esm.sh/braces@^3.0.3?target=denonext": "https://esm.sh/braces@3.0.3?target=denonext", "https://esm.sh/browserslist@^4.24.4?target=denonext": "https://esm.sh/browserslist@4.25.3?target=denonext", "https://esm.sh/camelcase-css@^2.0.1?target=denonext": "https://esm.sh/camelcase-css@2.0.1?target=denonext", @@ -1407,14 +1414,21 @@ "https://esm.sh/fraction.js@^4.3.7?target=denonext": "https://esm.sh/fraction.js@4.3.7?target=denonext", "https://esm.sh/glob-parent@^5.1.2?target=denonext": "https://esm.sh/glob-parent@5.1.2?target=denonext", "https://esm.sh/glob-parent@^6.0.2?target=denonext": "https://esm.sh/glob-parent@6.0.2?target=denonext", + "https://esm.sh/graphemer@^1.4.0?target=denonext": "https://esm.sh/graphemer@1.4.0?target=denonext", "https://esm.sh/is-extglob@^2.1.1?target=denonext": "https://esm.sh/is-extglob@2.1.1?target=denonext", "https://esm.sh/is-glob@^4.0.1?target=denonext": "https://esm.sh/is-glob@4.0.3?target=denonext", "https://esm.sh/is-glob@^4.0.3?target=denonext": "https://esm.sh/is-glob@4.0.3?target=denonext", + "https://esm.sh/iso-datestring-validator@^2.2.2?target=denonext": "https://esm.sh/iso-datestring-validator@2.2.2?target=denonext", "https://esm.sh/jiti@^1.21.6/dist/babel?target=denonext": "https://esm.sh/jiti@1.21.7/dist/babel?target=denonext", "https://esm.sh/jiti@^1.21.6?target=denonext": "https://esm.sh/jiti@1.21.7?target=denonext", + "https://esm.sh/jose@^5.2.0?target=denonext": "https://esm.sh/jose@5.10.0?target=denonext", "https://esm.sh/lines-and-columns@^1.1.6?target=denonext": "https://esm.sh/lines-and-columns@1.2.4?target=denonext", + "https://esm.sh/lru-cache@^10.2.0?target=denonext": "https://esm.sh/lru-cache@10.4.3?target=denonext", "https://esm.sh/merge2@^1.3.0?target=denonext": "https://esm.sh/merge2@1.4.1?target=denonext", "https://esm.sh/micromatch@^4.0.8?target=denonext": "https://esm.sh/micromatch@4.0.8?target=denonext", + "https://esm.sh/multiformats@^9.4.2/basics?target=denonext": "https://esm.sh/multiformats@9.9.0/basics?target=denonext", + "https://esm.sh/multiformats@^9.9.0/bases/base64?target=denonext": "https://esm.sh/multiformats@9.9.0/bases/base64?target=denonext", + "https://esm.sh/multiformats@^9.9.0/cid?target=denonext": "https://esm.sh/multiformats@9.9.0/cid?target=denonext", "https://esm.sh/nanoid@^3.3.11/non-secure?target=denonext": "https://esm.sh/nanoid@3.3.11/non-secure?target=denonext", "https://esm.sh/node-releases@^2.0.19/data/processed/envs.json?module": "https://esm.sh/node-releases@2.0.19/data/processed/envs.json?module", "https://esm.sh/node-releases@^2.0.19/data/release-schedule/release-schedule.json?module": "https://esm.sh/node-releases@2.0.19/data/release-schedule/release-schedule.json?module", @@ -1438,17 +1452,45 @@ "https://esm.sh/queue-microtask@^1.2.2?target=denonext": "https://esm.sh/queue-microtask@1.2.3?target=denonext", "https://esm.sh/reusify@^1.0.4?target=denonext": "https://esm.sh/reusify@1.1.0?target=denonext", "https://esm.sh/run-parallel@^1.1.9?target=denonext": "https://esm.sh/run-parallel@1.2.0?target=denonext", + "https://esm.sh/scheduler@^0.26.0?target=denonext": "https://esm.sh/scheduler@0.26.0?target=denonext", "https://esm.sh/source-map-js@^1.2.1?target=denonext": "https://esm.sh/source-map-js@1.2.1?target=denonext", "https://esm.sh/sucrase@^3.35.0?target=denonext": "https://esm.sh/sucrase@3.35.0?target=denonext", "https://esm.sh/tailwindcss@3": "https://esm.sh/tailwindcss@3.4.17", "https://esm.sh/tailwindcss@^4.0.0-beta.9/plugin?target=denonext": "https://esm.sh/tailwindcss@4.1.12/plugin?target=denonext", + "https://esm.sh/tlds@^1.234.0?target=denonext": "https://esm.sh/tlds@1.259.0?target=denonext", "https://esm.sh/to-regex-range@^5.0.1?target=denonext": "https://esm.sh/to-regex-range@5.0.1?target=denonext", "https://esm.sh/ts-interface-checker@^0.1.9?target=denonext": "https://esm.sh/ts-interface-checker@0.1.13?target=denonext", - "https://esm.sh/util-deprecate@^1.0.2?target=denonext": "https://esm.sh/util-deprecate@1.0.2?target=denonext" + "https://esm.sh/util-deprecate@^1.0.2?target=denonext": "https://esm.sh/util-deprecate@1.0.2?target=denonext", + "https://esm.sh/zod@^3.23.8?target=denonext": "https://esm.sh/zod@3.25.76?target=denonext" }, "remote": { "https://esm.sh/@alloc/quick-lru@5.2.0/denonext/quick-lru.mjs": "18d5ab8b0ee2b8c0ba55eab65a86f126f480d5d0ca85eeefa32f9ee2e399f110", "https://esm.sh/@alloc/quick-lru@5.2.0?target=denonext": "8506b81cc497d3d01a8b06176598c36333efab2f6773b5f681f4bfbeba33079d", + "https://esm.sh/@atproto-labs/did-resolver@0.2.0/denonext/did-resolver.mjs": "a88663c45be439196b85c03cd1b6bc904b5b33c2aca0f3bab716f1a8c305d7e6", + "https://esm.sh/@atproto-labs/fetch@0.2.3/denonext/fetch.mjs": "eaabcb75b50ef9b62d749e0e6843f11d60204526a0296ff84a99c8d8385862bc", + "https://esm.sh/@atproto-labs/handle-resolver@0.3.0/denonext/handle-resolver.mjs": "5ce886fa149d802d864b9988d0be71d18e37e06b7aab5a941a482aaa7b2d9da6", + "https://esm.sh/@atproto-labs/identity-resolver@0.3.0/denonext/identity-resolver.mjs": "36cf98e9478813b6e5eb6e33da8771f2dd33a2e8ba587d32803dc0b766cd5cab", + "https://esm.sh/@atproto-labs/pipe@0.1.1/denonext/pipe.mjs": "9432ecdd24724682a612fc0f47f019366a1ebf5e3fd2ffa9ef6b5176419ed84f", + "https://esm.sh/@atproto-labs/simple-store-memory@0.1.3/denonext/simple-store-memory.mjs": "789ef49fe6b81024631fd4340183c670f3f35b1be8ca773d5c14f7a040dd0b89", + "https://esm.sh/@atproto-labs/simple-store@0.2.0/denonext/simple-store.mjs": "1829d20db9d7157cfd85b3968dacf60aaab1fa77742612ae0ea193a616feec21", + "https://esm.sh/@atproto/api@0.16.3": "c50f915ec53d1d48b2fbf88c74ae6d41da255e9ac6e7449ca6c8a723a1fa419b", + "https://esm.sh/@atproto/api@0.16.3/denonext/api.mjs": "1fd08820fbc9cc67f29c4dfacf1f5b806ac67d1ee3bbdfcbc0bafcf07fda0cf2", + "https://esm.sh/@atproto/common-web@0.4.2/denonext/common-web.mjs": "350a01dc9ea0e21c5b85c166d269f53c3348ec3daaf94b97e035d0256366a2ef", + "https://esm.sh/@atproto/common-web@0.4.2?target=denonext": "bb0d13657e0fc4565eaf217a456ea6a48c2ca5178ecbb6692eb0d538ef51a4cd", + "https://esm.sh/@atproto/did@0.1.5/denonext/did.mjs": "1ae8eff7a842a509499f7efd1a1db842087499e2f03138ac8400f9558f926733", + "https://esm.sh/@atproto/jwk-jose@0.1.10/denonext/jwk-jose.mjs": "d4e05a0828e23532f185e301ec2b70c5bc4632691992b21f7d4af43e5ffe784c", + "https://esm.sh/@atproto/jwk-webcrypto@0.1.10/denonext/jwk-webcrypto.mjs": "ba106ae637353dcbaa7e8b7e6a0cb888e707261383a9c56eaa4a7fe4d8ad3519", + "https://esm.sh/@atproto/jwk@0.5.0/denonext/jwk.mjs": "5791d0fc7369da7993594d23ff00df612d43b33611b293df66476e07a0033b0a", + "https://esm.sh/@atproto/lexicon@0.4.13/denonext/lexicon.mjs": "eed494b224e5d28b2d1b1c0e88740b16eeaab1b1739c1d9b3120feb35f238de4", + "https://esm.sh/@atproto/lexicon@0.4.13?target=denonext": "df4a5757c00257ca4289db10271075cd3e89d48c9d5664d1e40ad3db933ea3ab", + "https://esm.sh/@atproto/oauth-client-browser@0.3.30": "d5df31ac9f9536879c8e1dbc8a5f3b9dc6635321044aaceda6f89028e416bd84", + "https://esm.sh/@atproto/oauth-client-browser@0.3.30/denonext/oauth-client-browser.mjs": "cae96820945c788497c365ce0b99decacf17b6b0b08ab3489e71fa2f7a62fdc6", + "https://esm.sh/@atproto/oauth-client@0.5.4/denonext/oauth-client.mjs": "75c5656274abcd6fba39aef3d6eb5b1ae53459a01665b17e9699db87278891b0", + "https://esm.sh/@atproto/oauth-types@0.4.1/denonext/oauth-types.mjs": "aa73bced2c5dda2b693f2c7eccddf2c26ef8f263553ee3be3ce0bd387ce75de0", + "https://esm.sh/@atproto/syntax@0.4.0/denonext/syntax.mjs": "e03d230b4bce87f75b6af7826e654db0ccc1ee1e8a0399522b708bfbb72534f9", + "https://esm.sh/@atproto/syntax@0.4.0?target=denonext": "d64c2ed239cf18dde908f4e6e78ad2771d29f879318eec4b567e9737f0b4a0cf", + "https://esm.sh/@atproto/xrpc@0.7.2/denonext/xrpc.mjs": "8b6a604c52f49f0e958185275f5553326d93178d468de49b0a6a8081882f8840", + "https://esm.sh/@atproto/xrpc@0.7.2?target=denonext": "0d01d68187689e970d63c99364a99659c6846e0eedc7abb9227ba082d0546a70", "https://esm.sh/@jridgewell/gen-mapping@0.3.13/denonext/gen-mapping.mjs": "297f733cd1f48cde4050055e4379df23b701394106946ec8692f41fd4fbc06a3", "https://esm.sh/@jridgewell/gen-mapping@0.3.13?target=denonext": "d3eb8a4aee09dd989ae0d8121874e9ef41d7b1c2261a8809250654d040b54e83", "https://esm.sh/@jridgewell/resolve-uri@3.1.2/denonext/resolve-uri.mjs": "2da147ad4f55ddeff542640347c789ff19db8db4ead77cce27a0c171f5f5c349", @@ -1466,6 +1508,8 @@ "https://esm.sh/@tailwindcss/line-clamp@0.4.4?target=denonext": "1fbc5f55d06b23c8fc79d58f00831983224f1c15b5249de3cd0a2d51fed22572", "https://esm.sh/autoprefixer@10.4.21": "2bb14916b2e4881a32ee311720679c3e57e2d04f45ac808f4f71ae4e0923801c", "https://esm.sh/autoprefixer@10.4.21/denonext/autoprefixer.mjs": "0d9874129a69bb35c1392f38f09e6a5a747c0eeb8c2b29e7fc8d4c1868337d92", + "https://esm.sh/await-lock@2.2.2/denonext/await-lock.mjs": "6787201229bc4ccae3aabbcee4086ea60b803bb476b37e576ec135e954f3ae5a", + "https://esm.sh/await-lock@2.2.2?target=denonext": "62d8dd2ac9a50e115f76d05f309f437a8dbc6e53ff508c70addf07ed40ad0077", "https://esm.sh/braces@3.0.3/denonext/braces.mjs": "a3909393c947301c3b6348ab2378bd4f96fe001009b9beb44dcf1030dd717f47", "https://esm.sh/braces@3.0.3?target=denonext": "58c0fed5cc432a2192aad7eeaf6e3988b96830a6c6ec0ad51dfc97578b2e8dee", "https://esm.sh/browserslist@4.25.3/denonext/browserslist.mjs": "df95a5657a9d8a83aa8e834a82e1747b3d6e8ea1ee8d41676c665e05d803c103", @@ -1640,20 +1684,121 @@ "https://esm.sh/glob-parent@5.1.2?target=denonext": "0e04ba2ebac5a052f7d5671a73c19f72407c2660bd3d5a5be577dd1ffcdfc7dc", "https://esm.sh/glob-parent@6.0.2/denonext/glob-parent.mjs": "e629258fece4c22cb6d3a108a97c95ea8df4d735e4c79630f2a7da870bbafa23", "https://esm.sh/glob-parent@6.0.2?target=denonext": "e30aa6b9dc68fbde857f7495eb6f05c7c41b5e5a7453be63a48cfd62269aacdb", + "https://esm.sh/graphemer@1.4.0/denonext/graphemer.mjs": "5a2c9e558258abf5f67d95a6814b6a3ef0bb3ea649ed231505f42a2863d1b317", + "https://esm.sh/graphemer@1.4.0?target=denonext": "09e56a40cab2fec5dbcce661e11517580d59b8854034d2414e4bb1576cd3254c", "https://esm.sh/is-extglob@2.1.1/denonext/is-extglob.mjs": "adbceb33b529cc88849ee39364a0eea16088cefb795221d3be31c7d6c2b7a47d", "https://esm.sh/is-extglob@2.1.1?target=denonext": "cc21d63edf9dcc600d613af9dc30eeac8c8ee324104dab9f978fa567ec8f3ae4", "https://esm.sh/is-glob@4.0.3/denonext/is-glob.mjs": "4555ca21a3af8a883c44c977fd1ff03be73dd7927dea188443992d01749b845d", "https://esm.sh/is-glob@4.0.3?target=denonext": "5fef477a765ea5f14bff33ee18156cd8398e8fba5fea6fa636ebe2280349e3ce", + "https://esm.sh/iso-datestring-validator@2.2.2/denonext/iso-datestring-validator.mjs": "ed32c001968af2e58843b98d99f95fa09d7e5b056ae4ad2a30ce0d436daa087e", + "https://esm.sh/iso-datestring-validator@2.2.2?target=denonext": "de296e64bf5da2fb01f4b909d22a6c1676fcc52a1c6f176aa5307df37eacb217", "https://esm.sh/jiti@1.21.7/denonext/dist/babel.mjs": "95d8f0b529fdeeb7b12eacfa93d6ad80c4548b2b407022e08608c6789b8e7d9f", "https://esm.sh/jiti@1.21.7/denonext/jiti.mjs": "75830015c5c1f473ae2014286ed7f9f66b88404641efdfef8c18731463295c7b", "https://esm.sh/jiti@1.21.7/dist/babel?target=denonext": "238960d30e4169f10b16b90db8b8e0e3695d3d13b589c2cbde7a70d5eb8761b2", "https://esm.sh/jiti@1.21.7?target=denonext": "8b16749a8a79eafecd65003c0a14082274620e9521e2a0137e5825ee353898e8", + "https://esm.sh/jose@5.10.0/denonext/base64url.mjs": "539aace7c49b2261745da4ec543d941618d11a294c4e7799d6face203aebfc45", + "https://esm.sh/jose@5.10.0/denonext/decode/protected_header.mjs": "73ce892cbc903722e5628006b329d836d29af384eeb99e18f4e8ad3888d5c241", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/jwt/produce.mjs": "72409fb814f902126eeca273e6c6855685ab0715f2ef95a5f61b29015862472b", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/aesgcmkw.mjs": "c0363171d95389f30ed6a8de16fdb3c8f123e1d7cb92f39011393c1038faf044", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/buffer_utils.mjs": "2b23cfebda877dbfc41c9a69438a158ffb31731d97308baa01621d73ef959f2b", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/cek.mjs": "85c4e75e70bb1da9960b6825e1bf985eb37881d7d23fa76e2bc2efb8ca071812", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/check_iv_length.mjs": "38783fdf60c458e435a42e588da9d4097fd2d096d92129673674da037d1defd8", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/check_key_type.mjs": "9d4b6990a0b8523681db4cef0bde67b957ef6f29f5708ce871225eb6f24d4e63", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/crypto_key.mjs": "59dc27357c645bbe213439acee0ef9ad481bd9ed751041ebe8801a108431aa00", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/encrypt_key_management.mjs": "35dd301ef6820956d2f5668d92786764dcbb459fae1136d5d11dae3d839a2e9d", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/epoch.mjs": "b594e6e3d563fd8b437b924b8738ce883d5d4fc1126dfd0ca230fd5c0fae02e8", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/invalid_key_input.mjs": "19a65328e952d4031c09c1315abe803ea1fdc9934f0fa4f455379bc3c072921a", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/is_disjoint.mjs": "85ebfe6f46e0feb55cd79e41626717594b2f1e997d54c9a66a255998b626bc51", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/is_jwk.mjs": "12240833a4979333cb4f8fad5f065c7cb9fff1d5e4d589a073ec99bdf2fc234d", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/is_object.mjs": "a477fb6116adc68383ea964f6e9b5542427e7638d192a23e93a683c5797ab387", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/iv.mjs": "3edfe59dfc97f12b3fff5535f95f0bf690d6dd1bd0140baf7a86d705313f09c2", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/jwt_claims_set.mjs": "67658e0bde825ea75aeecb740e34cee41b754ed0092b25f6a4e822d9d06f3d92", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/private_symbols.mjs": "5c8542caf07cd0e88f442c3cf16bf67b74108b8fa10f93f41141840fed183af9", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/secs.mjs": "aaab2389b4a39d7cdd422908aa1f60fb93b075df47acab0c4f42838ccca23c81", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/validate_algorithms.mjs": "095384ff18fb772f980bdb504474dfe87a5ec02730d5c510d59ef2d95e5efd06", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/lib/validate_crit.mjs": "176fa8b63805db36ef0eaa7490eef27c43352eec53ac2843920ab7b353282809", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/aeskw.mjs": "1ca307484491e42a7cd7be95f9a3a9a6504d433f4920f1a611f3faeb27ab9848", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/asn1.mjs": "71e4c6e67ed71454ad786e5ba25f1ed0634c527d1ef15f053116927828b9ed5b", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/base64url.mjs": "32bb04a70098ab611900258e09901161e0022265a4ff09c1f6a585f0d0dfe308", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/bogus.mjs": "26b5a2bace42941799dcb891f5676678bb2017ab64778e94923fe71a040d1719", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/check_cek_length.mjs": "b1511d0ecbc2bf90a8b50ebe9baa15eab169dfa3d3ad3a2a556474a69cb2a344", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/check_key_length.mjs": "3aec7aaa6c36c0b1c984cccfd476b310c3678dd8a5b07331e292c0a005b97798", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/decrypt.mjs": "f81f1f103e787deee890cf5d97a2c91b59a03e63efaf479c7844b0c20983a454", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/digest.mjs": "b170cf6543920f6c12d147c6a8914f8e626d686226e50af820fc0effadfa413e", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/ecdhes.mjs": "5eb732da9266ebdeb62b424dd898523ddbf4c09ca6144e53cca86793e611d65b", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/encrypt.mjs": "5a8563d9813f837850edf6e814f535e36fc6373673850ec4e75221f0de3ee90e", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/generate.mjs": "b6e73ada71e897f6f189ef2e2ffa7a4a91fbaf675d6d0aa86d6121d4c68dc07a", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/get_sign_verify_key.mjs": "8e91861e258c0fdf9988b0460a113158a01294b5541c56292314e6f345caa6a6", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/is_key_like.mjs": "43e10261870d4a65beb24cb868befc0e9aaff002b9ebf90257ffdaf073c636d7", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/jwk_to_key.mjs": "46ef0a4df4d689f2065bac957dae4e6572071797675123a08749bf83992abacc", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/normalize_key.mjs": "0e915ab84055caa0f3e031f9d5a545608e22976d22b03b35485b38611a8c282e", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/pbes2kw.mjs": "d964c662b1e8cd72e143bf13fe90eb7213ce21fa7b4aadeebba8394e0ec32db8", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/random.mjs": "1fd349b6114345bbd8d67407dcb83efca1720b9b862a4e1ca232427149a167c0", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/rsaes.mjs": "12cdf94a5b92eec19456f9df4b8ef2265cad392612345c36aa28065506cb8c51", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/subtle_dsa.mjs": "04a41e3a9ac0f77c9b34b84be050ff0a27c2d768eadb30a464d57567f857cd46", + "https://esm.sh/jose@5.10.0/denonext/dist/browser/runtime/webcrypto.mjs": "a7ca0ccea9e87fa0698d48f5a0832cb28fea137705f4c494ff3f3c83bde57cf1", + "https://esm.sh/jose@5.10.0/denonext/errors.mjs": "10bd291dfa016ffa8a5228e18bbc0c147b24c88725061bec323d1c1498bfde3b", + "https://esm.sh/jose@5.10.0/denonext/jose.mjs": "745abba7b218a451fb747ab7250eb67bf62c7eaa0d2ed98fc7db4320b3ac2371", + "https://esm.sh/jose@5.10.0/denonext/jwe/compact/decrypt.mjs": "868abeef0f4bc4bf499bbb4d64febc9121bf7f9d01132df8e19b7d7d50a0af07", + "https://esm.sh/jose@5.10.0/denonext/jwe/compact/encrypt.mjs": "f0063936a5a8f9e4c50a978ad0bb23baf842eb20dc4e4982fa5363045685871e", + "https://esm.sh/jose@5.10.0/denonext/jwe/flattened/decrypt.mjs": "49596d5a985ab0a850eb7924f53888253669f059f4687320790cbe04641ddea8", + "https://esm.sh/jose@5.10.0/denonext/jwe/flattened/encrypt.mjs": "b70bb208e1cefcd08758fe39af6e9bc46dd475b3182c209c084dd6fd6575819b", + "https://esm.sh/jose@5.10.0/denonext/jwe/general/decrypt.mjs": "16d59263b205635a9063a9c6256d92373d1e32ddf632d1ccc06a1a4c0cf769f7", + "https://esm.sh/jose@5.10.0/denonext/jwe/general/encrypt.mjs": "6acc66f0eee89603c2bb5089af9cef5f579ab38533c3e0fe49625b479736efaa", + "https://esm.sh/jose@5.10.0/denonext/jwk/embedded.mjs": "c13d8092a672bba2ce7fcf6d94804f89ce278842f829a041a1c8eef6019bb489", + "https://esm.sh/jose@5.10.0/denonext/jwk/thumbprint.mjs": "428799b05c6ab4455e0d34a2974be42053f3fbcee2af5a7c829dcfc4d457aab7", + "https://esm.sh/jose@5.10.0/denonext/jwks/local.mjs": "2f1492c3761af03bae601c48494d43b481740dcb01286461a0589f0978033696", + "https://esm.sh/jose@5.10.0/denonext/jwks/remote.mjs": "7c352605a7b5f7048f139452253ad5705db74ed7391e36bbe6be3e947b83fd83", + "https://esm.sh/jose@5.10.0/denonext/jws/compact/sign.mjs": "4f345eac0d98cf5074193e251879b67b9c6b5d4aea6648f0e19169776f4ee59f", + "https://esm.sh/jose@5.10.0/denonext/jws/compact/verify.mjs": "25d3749082196faefe6ca4b656b2aba0a3c030e21a6b8b06355459dc203549e7", + "https://esm.sh/jose@5.10.0/denonext/jws/flattened/sign.mjs": "c00c6af48d50c0d6d50490ec24666bcabb85b4f2cdef1216fd2eb7c1fff2959e", + "https://esm.sh/jose@5.10.0/denonext/jws/flattened/verify.mjs": "d5fe93eb720b2ea659be49bbf0cadcea137de0024edd5c630ab058a69691fae7", + "https://esm.sh/jose@5.10.0/denonext/jws/general/sign.mjs": "612872a9dda21c24756b95fdfd8555cd5e7a7541e996fdfa95d0f68a3545c4d8", + "https://esm.sh/jose@5.10.0/denonext/jws/general/verify.mjs": "fc43cdd11c19eb9e8636b3710d4728a36f82480c19b2e75bfd9a9f4c31f7d029", + "https://esm.sh/jose@5.10.0/denonext/jwt/decode.mjs": "40b1699324c4c97c95661ae286fff14c5b18dabe6d96343b04c31456ef73026a", + "https://esm.sh/jose@5.10.0/denonext/jwt/decrypt.mjs": "acdf2a910bb295403edc53e7fb5f098e8d8c45c59cd079082745abd9b225f22e", + "https://esm.sh/jose@5.10.0/denonext/jwt/encrypt.mjs": "3fe7a9dde4a875028bbd72828c86a1fcf82f168a8eeee69ce1662a6b2a4ea635", + "https://esm.sh/jose@5.10.0/denonext/jwt/sign.mjs": "490e0d0f9f16eb648362686ec477694a37065fc5c7a4c64c5b1e6ddb2e281248", + "https://esm.sh/jose@5.10.0/denonext/jwt/unsecured.mjs": "f20d4176b9b09f31460d141899d860b0d56d5dae4429f7625b1186ea0807489b", + "https://esm.sh/jose@5.10.0/denonext/jwt/verify.mjs": "8baef7b4f3d23422fb51192d1df07326719db00f8fc601b35463fd8515c45a3e", + "https://esm.sh/jose@5.10.0/denonext/key/export.mjs": "817e555aa3e0f87a9d4715affd72447f93e3bb0e4c8feafc16095f826759efcd", + "https://esm.sh/jose@5.10.0/denonext/key/generate/keypair.mjs": "5722cb2dc742d9e1f9eec179288294a13a7c26b8b273b25a3e28830c7017b687", + "https://esm.sh/jose@5.10.0/denonext/key/generate/secret.mjs": "74453b742576819a5f5245f7fc47617b5da766a60afd9751b5b1e14a099c9fff", + "https://esm.sh/jose@5.10.0/denonext/key/import.mjs": "e488ba70e5eee01134d352c7ba00e3eb25093252c05a63e9d6e4185b2e6836eb", + "https://esm.sh/jose@5.10.0?target=denonext": "43705c1f40e5191081bcac2851ad8265f03c23bf751f9b84260ac2874f8ce209", "https://esm.sh/lines-and-columns@1.2.4/denonext/lines-and-columns.mjs": "785cd1f5843f3645f9304248e4cf77987a71c6e2e7207d5b5200c9ea8ed67cdc", "https://esm.sh/lines-and-columns@1.2.4?target=denonext": "24df63eccd321681ded34cf71de26b252de505ac6fe86fff5f5fafb810f86441", + "https://esm.sh/lru-cache@10.4.3/denonext/lru-cache.mjs": "ba5ee5ff9067a3a33de530b47c0ce7e81cdff92937e5519258ed422b7e23fbdb", + "https://esm.sh/lru-cache@10.4.3?target=denonext": "e0a3f66d0dbb61c67fbec24fb29ba1b18e21dab43178cfba399481560e076382", "https://esm.sh/merge2@1.4.1/denonext/merge2.mjs": "b7e2fe0b629b75aabc963fd1e6635d6dcf59f5f2df42111df1ced9d3d064fcec", "https://esm.sh/merge2@1.4.1?target=denonext": "a1286ee0e809c60cde57dcd9357fe3979d10abf74324608c83eb5640088c5053", "https://esm.sh/micromatch@4.0.8/denonext/micromatch.mjs": "3663f155546be362a116c4a6bcececb00df29ed5870b308809ddb255ade2a78b", "https://esm.sh/micromatch@4.0.8?target=denonext": "5e66db24ea49ffe179d951391cb92d5173e4911a45a6793d189a83861dae0b2e", + "https://esm.sh/multiformats@9.9.0/bases/base64?target=denonext": "9622b652809e84b8cbdc3834d15a306da9a9305552527668b13b1b16a6d686da", + "https://esm.sh/multiformats@9.9.0/basics?target=denonext": "97fa53d99c2a3aa56367e5e2a34ab3d1b3dc496e4a4fe490460d2955de707361", + "https://esm.sh/multiformats@9.9.0/cid?target=denonext": "be24427188844af21bc0b29187229c4c6e5a681b676db65b8c7fcf5277652b4b", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base10.mjs": "07ac037675bfbbf0621e7f8fd3cfeb242d1ab0955d7e965f4f3a2daa1c369b85", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base16.mjs": "7f0c9b5860c52b54170cbc8b058fe46eee1b81f52d0908055d38d2a63ec8b721", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base2.mjs": "46527ded4d9b868600b2fd8902398a31226655790bd3c5f61ffa0bd8737b0698", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base256emoji.mjs": "7c16b9576b295024837fe5d192f0b854951ac3a7c0be1be8a3c91d5f62505066", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base32.mjs": "2c42d149c299e8b8934e51ccb284b01b113d3fe432177a55b7a781d10cfbe5b2", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base36.mjs": "52dfe773e2d2650ed87c7c353e909a0d710ed83cb01eb553858eae4879a6664d", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base58.mjs": "d45f93c89f6f8a05c7ddc132c99a2bc866d1de2e8475747b6722f6322482feab", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base64.mjs": "1365d8ab96a8998be1663e7277eebc58d3207f785c9ab53533966626f153461b", + "https://esm.sh/multiformats@9.9.0/denonext/bases/base8.mjs": "9336d2259eb06c31fd0d1e7e5ae36e0826f39b2f73639849a403933348c7526c", + "https://esm.sh/multiformats@9.9.0/denonext/bases/identity.mjs": "28acc5f7d4dfe7d5647e1c8d250540a50ba6397ff4f375bc41dc37fc5d5de510", + "https://esm.sh/multiformats@9.9.0/denonext/basics.mjs": "edd1f5f7171a026940535586a6682c88f036b972a0158d10db2a5936239182ec", + "https://esm.sh/multiformats@9.9.0/denonext/cid.mjs": "1945384d570468b0bb5bd0f394184835038d5778d701b50b6b7eb7273748d288", + "https://esm.sh/multiformats@9.9.0/denonext/codecs/json.mjs": "a31ef601f2480daa1ed34393e91f937cef522517ca7d934b86939f8d761fe077", + "https://esm.sh/multiformats@9.9.0/denonext/codecs/raw.mjs": "6d6b44e3bea526dd9930d61631709f45e9f10bf2e190dc19168e9b0297fb30dd", + "https://esm.sh/multiformats@9.9.0/denonext/esm/src/bases/base.mjs": "f0057681c3f918b72d77de38d89d1f532ae4fc78b86f35db7f617c81e7ac504f", + "https://esm.sh/multiformats@9.9.0/denonext/esm/src/bytes.mjs": "d2fa273fd87212f525dcd3863af8a3d2ca1e3ee42aca3eaee5ddd4ad6e43ba04", + "https://esm.sh/multiformats@9.9.0/denonext/esm/src/varint.mjs": "5ea3af2ab0109f1e9f4f56fe35883f593f6b047899ada90095a5ed518d635899", + "https://esm.sh/multiformats@9.9.0/denonext/hashes/digest.mjs": "fc07873514b182ae0897159ebdcad3dd3ceced04740aa76caf4b2e796ff6ca25", + "https://esm.sh/multiformats@9.9.0/denonext/hashes/hasher.mjs": "44bfd064461927c2e8f161db65053d711e59e3df4b55b76bb3f9bf4c316492ad", + "https://esm.sh/multiformats@9.9.0/denonext/hashes/identity.mjs": "43eaf0a3160c8344e2f70387d0a124f3f21363d82d3e246a7a7df4053c6199e4", + "https://esm.sh/multiformats@9.9.0/denonext/hashes/sha2.mjs": "a0fd2e20d8753f6ca30db815bb7f20a57e2a23dd691384b11d07b5a52dbec74f", + "https://esm.sh/multiformats@9.9.0/denonext/multiformats.mjs": "7449f492d80b1dcffcbbfb5599707e5f9c0e5a54694532f330b0f64defe27809", "https://esm.sh/nanoid@3.3.11/denonext/non-secure.mjs": "1f166118c1c4b4d4b5356ef0050fed87acf28cdb8a76813803fee72188f18b30", "https://esm.sh/nanoid@3.3.11/non-secure?target=denonext": "ac0c34cc5f9846db51a5d868ce6ee815f831a19b1d57a1b8bae9226fc8d68dec", "https://esm.sh/node-releases@2.0.19/data/processed/envs.json?module": "62fef61ca0cdd9c90f89cdbf60280aa1ebff036ddb965f4174e69a30e6efb196", @@ -1717,10 +1862,21 @@ "https://esm.sh/postcss@8.5.6?target=denonext": "d74fb26c8e5f2355773381813a2514b103cd99d9262961b6d43148f714f343da", "https://esm.sh/queue-microtask@1.2.3/denonext/queue-microtask.mjs": "b0e153a240d836527feea7b9ecfa99fa8e5a5ef7e48b43092b7cecd8649a8712", "https://esm.sh/queue-microtask@1.2.3?target=denonext": "fc6002fc339a8edbab36e4e6df1d245a0c3a5dc507edf4e5fb7e857f8b117aa2", + "https://esm.sh/react-dom@19.1.1/client": "e610fc905fb8a0f45ef487496e6084a9c46e6a9b1b1fc9e77ae388d8a9489a9f", + "https://esm.sh/react-dom@19.1.1/denonext/cjs/react-dom-server-legacy.browser.production.mjs": "46093e4d958c744635246158bbe9d1448c1168acc16ee248a1cb744c0194cc72", + "https://esm.sh/react-dom@19.1.1/denonext/cjs/react-dom-server.browser.production.mjs": "1b65edfd064bcb0377f63e6d3d15176967ead3acd6b3aec869bd194e48522676", + "https://esm.sh/react-dom@19.1.1/denonext/client.mjs": "747fb2c2a65ba2fc0e191c6be104de92f26e7b3559425fd2bebc71decf9358c9", + "https://esm.sh/react-dom@19.1.1/denonext/react-dom.mjs": "a31239e9832b73257ff344fb3d8292982ee25cbc1da5edab9ba81648c30f4abd", + "https://esm.sh/react-dom@19.1.1/denonext/server.mjs": "513c3f84f3402259c315ae6788c2dd9e671e8dc2adfa2f37d51165e156b4932f", + "https://esm.sh/react-dom@19.1.1/server": "d8d537b44c19a05a7805396eac77f18c628e1019fb2a61cb1f1a1bce0eeeb939", + "https://esm.sh/react@19.1.1": "4583aedf2a721df5ea4aa7308de82b5bcbee12e5ed7910061940f7434982847d", + "https://esm.sh/react@19.1.1/denonext/react.mjs": "588ff2562af9e974efdb79cc945049768bf5ee0252543fd8fb6a48472f3db587", "https://esm.sh/reusify@1.1.0/denonext/reusify.mjs": "3b91b42988a3ec3984cef34b99cd5f67b4a008609c3d4fc5d35e8f2d1aab8cef", "https://esm.sh/reusify@1.1.0?target=denonext": "aea1fd894bd8993f740cf053799f9639ee649122854c1fe4a5425d5aa2dc5e96", "https://esm.sh/run-parallel@1.2.0/denonext/run-parallel.mjs": "77808968c9de972bb725e73559c80e64bf9524b7d2f781941115d023fd42e7b3", "https://esm.sh/run-parallel@1.2.0?target=denonext": "2acc47cfa930a6c5e502877b2e5ee9cd2a2ec81e4fcc579f3c0bdebe32590de6", + "https://esm.sh/scheduler@0.26.0/denonext/scheduler.mjs": "b62267951094a7c42b7170c51e31f57198981b08ebfae60be0d076101a4c6f91", + "https://esm.sh/scheduler@0.26.0?target=denonext": "102f3b685ea5271452bd93de89ab0d99668aecb08f7706e3b9c6629699dd92e0", "https://esm.sh/source-map-js@1.2.1/denonext/source-map-js.mjs": "2129223e17c258b391a47907a69c0b86d1c87cbb66eea7e9b25ff555ec0bbc7c", "https://esm.sh/source-map-js@1.2.1?target=denonext": "33ba5cf2ee7c1fe6b63b36c31e9075e290bc5c574055acbdc48c2f24a21d2f83", "https://esm.sh/sucrase@3.35.0/denonext/sucrase.mjs": "1d1c05878a5f0656226ee064c90845d01adf23b2bff84521480ffaad6da16d21", @@ -1729,12 +1885,24 @@ "https://esm.sh/tailwindcss@3.4.17/denonext/tailwindcss.mjs": "382a6a4ed82273daead6e2eb6af426822a3fbf7303387ee49db16be7699f8b45", "https://esm.sh/tailwindcss@4.1.12/denonext/plugin.mjs": "349369852f7afd8ca09ef1682d94766d02e84bc45f927d0f02b374b20be70c9f", "https://esm.sh/tailwindcss@4.1.12/plugin?target=denonext": "05b784ebe25c01018a0eab3fe1e1dab62bdbceb114e2371e748f967552510c00", + "https://esm.sh/tlds@1.259.0/denonext/tlds.mjs": "574135861b248c619a791bd6a1769ee6b5b45d1d7e11f8d052c8e0e43ae6e009", + "https://esm.sh/tlds@1.259.0?target=denonext": "9a5c7ee3354f90209f3fee0255a201ec5c9f46d28dc500ac161325c945af7389", "https://esm.sh/to-regex-range@5.0.1/denonext/to-regex-range.mjs": "3f099b66f908b58dd6ee20afd1fed4616ea02fd0c118dc91ff1ed3e72d795bc7", "https://esm.sh/to-regex-range@5.0.1?target=denonext": "5d6ed8b93f9fc4009378f84ade74e2681c2264b37e79f978c557037c612086ed", "https://esm.sh/ts-interface-checker@0.1.13/denonext/ts-interface-checker.mjs": "482a9d9214862af127455b80dbe15559b107bb8283dc4b6ba10da16757b3dfe8", "https://esm.sh/ts-interface-checker@0.1.13?target=denonext": "b1c4bedafbacf4fc6ca1b02c22601fe4e3dee3d3dc14ca3e8fb6f8656a368e72", + "https://esm.sh/uint8arrays@3.0.0/denonext/compare.mjs": "2b8ed67b92836546e504b87733eacd3f0569050ea645920d3f2503e8e335cd01", + "https://esm.sh/uint8arrays@3.0.0/denonext/concat.mjs": "ce3cfbcdd3cc6d1d9fa75f13963c7398a377d8a1dbd6302820f2058f42545fc7", + "https://esm.sh/uint8arrays@3.0.0/denonext/equals.mjs": "2c9a9504f97abc172b755fb5069cb9b69aac2e177ad4bc2cf9afdd6a4a322694", + "https://esm.sh/uint8arrays@3.0.0/denonext/esm/src/util/bases.mjs": "03de06f47b410a6ed09da73d6e58696ca34ac4e51bce4a0bcfac5cf88c23b8da", + "https://esm.sh/uint8arrays@3.0.0/denonext/from-string.mjs": "6df06b3ed43db82fa33500d4ab01a97ae4ecef234f76e06c1774b915d913bbe3", + "https://esm.sh/uint8arrays@3.0.0/denonext/to-string.mjs": "bafce61afad1706118c9c6bd08d6d2f53dada2c0892b8fe14da8124e5951390c", + "https://esm.sh/uint8arrays@3.0.0/denonext/uint8arrays.mjs": "2627bbf05b4b496ffe067a4f090dd91d4aa7bc8c815d36f1e543531fb0d9342f", + "https://esm.sh/uint8arrays@3.0.0/denonext/xor.mjs": "cc93f46198dca299adc26ae5344768914923bbc88e78eefd28699d0ec28c8e71", "https://esm.sh/util-deprecate@1.0.2/denonext/util-deprecate.mjs": "083639894972cb68837eef26346c43bdd01357977149e0a4493f76192a4008b8", - "https://esm.sh/util-deprecate@1.0.2?target=denonext": "859f4df8ba771a4c33143185d3db6a7edb824fab1ed4f9a4b96ac0e6bc3ef1a4" + "https://esm.sh/util-deprecate@1.0.2?target=denonext": "859f4df8ba771a4c33143185d3db6a7edb824fab1ed4f9a4b96ac0e6bc3ef1a4", + "https://esm.sh/zod@3.25.76/denonext/zod.mjs": "9f643d0cc560840b7fa3b6e6fc3a5a41595f12ff8863cac0ccbae3ec98989284", + "https://esm.sh/zod@3.25.76?target=denonext": "7d2e5b7450d6f99b9b3b228958bd1291d5a1f8378f82b8cdd2ce83b2f14961c2" }, "workspace": { "dependencies": [ diff --git a/main-index.ts b/main-index.ts index 8a89520..aa5d110 100644 --- a/main-index.ts +++ b/main-index.ts @@ -6,8 +6,6 @@ import { IndexServer, IndexServerConfig } from "./indexserver.ts"; import { extractDid } from "./utils/identity.ts"; import { config } from "./config.ts"; import { compile, devWatch } from "./shared-landing/build.ts"; -let { js, html, css } = await compile("index"); - // ------------------------------------------ // AppView Setup // ------------------------------------------ @@ -19,6 +17,14 @@ const indexServerConfig: IndexServerConfig = { export const genericIndexServer = new IndexServer(indexServerConfig); setupSystemDb(genericIndexServer.systemDB); +let { js, html, css } = await compile({ + target: "index", + initialData: { + config: config.indexServer, + users: (await genericIndexServer.unspeccedGetRegisteredUsers()) ?? [], + }, +}); + // add me lol genericIndexServer.systemDB.exec(` INSERT OR IGNORE INTO users (did, role, registrationdate, onboardingstatus) @@ -68,34 +74,31 @@ genericIndexServer.start(); // "/xrpc/party.whey.app.bsky.feed.getListFeedPartial", // ]); const placeholderselfcheckstatus = { - "#skylite_index:/xrpc/app.bsky.actor.getProfile": "green", - "#skylite_index:/xrpc/app.bsky.actor.getProfiles": "green", - "#skylite_index:/xrpc/app.bsky.feed.getActorFeeds": "green", - "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerator": "green", - "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerators": "green", - "#skylite_index:/xrpc/app.bsky.feed.getPosts": "green", - "#skylite_index:/xrpc/app.bsky.graph.getLists": "black", - "#skylite_index:/xrpc/app.bsky.graph.getList": "black", - "#skylite_index:/xrpc/app.bsky.graph.getActorStarterPacks": "black", - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getActorLikesPartial": "green", - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getAuthorFeedPartial": "green", - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getLikesPartial": "orange", - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getPostThreadPartial": "green", - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getQuotesPartial": "orange", - "#skylite_index:/xrpc/party.whey.app.bsky.feed.getRepostedByPartial": "orange", + "#skylite_index:/xrpc/app.bsky.actor.getProfile": "green", + "#skylite_index:/xrpc/app.bsky.actor.getProfiles": "green", + "#skylite_index:/xrpc/app.bsky.feed.getActorFeeds": "green", + "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerator": "green", + "#skylite_index:/xrpc/app.bsky.feed.getFeedGenerators": "green", + "#skylite_index:/xrpc/app.bsky.feed.getPosts": "green", + "#skylite_index:/xrpc/app.bsky.graph.getLists": "black", + "#skylite_index:/xrpc/app.bsky.graph.getList": "black", + "#skylite_index:/xrpc/app.bsky.graph.getActorStarterPacks": "black", + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getActorLikesPartial": "green", + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getAuthorFeedPartial": "green", + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getLikesPartial": "orange", + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getPostThreadPartial": "green", + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getQuotesPartial": "orange", + "#skylite_index:/xrpc/party.whey.app.bsky.feed.getRepostedByPartial": + "orange", "#skylite_index:/xrpc/party.whey.app.bsky.feed.getListFeedPartial": "black", - - - - "constellation:/links": "green", - "constellation:/links/distinct-dids": "green", - "constellation:/links/count": "green", - "constellation:/links/count/distinct-dids": "green", - "constellation:/links/all": "green", + "constellation:/links": "green", + "constellation:/links/distinct-dids": "green", + "constellation:/links/count": "green", + "constellation:/links/count/distinct-dids": "green", + "constellation:/links/all": "green", }; - //console.log("ready to serve"); Deno.serve( { port: config.indexServer.port }, @@ -104,7 +107,7 @@ Deno.serve( const pathname = url.pathname; const searchParams = searchParamsToJson(url.searchParams); - const publicdir = "/public" + const publicdir = "/public"; if (pathname.startsWith(publicdir)) { const filepath = decodeURIComponent(pathname.slice(publicdir.length)); try { @@ -114,30 +117,38 @@ Deno.serve( return new Response("404 Not Found", { status: 404 }); } } - - const todopleasespecthis = "/_unspecced" + + const todopleasespecthis = "/_unspecced"; if (pathname.startsWith(todopleasespecthis)) { - const unspeccedroute = decodeURIComponent(pathname.slice(todopleasespecthis.length)); + const unspeccedroute = decodeURIComponent( + pathname.slice(todopleasespecthis.length) + ); if (unspeccedroute === "/config") { const safeconfig = { inviteOnly: config.indexServer.inviteOnly, //port: number, did: config.indexServer.did, host: config.indexServer.host, - } + }; return new Response(JSON.stringify(safeconfig), { - headers: withCors({ "content-type": "application/json; charset=utf-8" }), + headers: withCors({ + "content-type": "application/json; charset=utf-8", + }), }); } if (unspeccedroute === "/users") { - const res = await genericIndexServer.unspeccedGetRegisteredUsers() + const res = await genericIndexServer.unspeccedGetRegisteredUsers(); return new Response(JSON.stringify(res), { - headers: withCors({ "content-type": "application/json; charset=utf-8" }), + headers: withCors({ + "content-type": "application/json; charset=utf-8", + }), }); } if (unspeccedroute === "/apitest") { return new Response(JSON.stringify(placeholderselfcheckstatus), { - headers: withCors({ "content-type": "application/json; charset=utf-8" }), + headers: withCors({ + "content-type": "application/json; charset=utf-8", + }), }); } } @@ -170,7 +181,6 @@ Deno.serve( }); } - if (pathname === "/.well-known/did.json") { return new Response( JSON.stringify( @@ -231,8 +241,15 @@ Deno.serve( } ); -devWatch("index", ({ js: newjs, html: newhtml, css: newcss }) => { - js = newjs; - html = newhtml; - css = newcss; -}); \ No newline at end of file +devWatch({ + target: "index", + initialData: { + config: config.indexServer, + users: (await genericIndexServer.unspeccedGetRegisteredUsers()) ?? [], + }, + onBuild: ({ js: newjs, html: newhtml, css: newcss }) => { + js = newjs; + html = newhtml; + css = newcss; + }, +}); diff --git a/main-view.ts b/main-view.ts index 7ed15a6..95c5704 100644 --- a/main-view.ts +++ b/main-view.ts @@ -6,7 +6,6 @@ import { ViewServer, ViewServerConfig } from "./viewserver.ts"; import { extractDid } from "./utils/identity.ts"; import { config } from "./config.ts"; import { compile, devWatch } from "./shared-landing/build.ts"; -let { js, html, css } = await compile("view"); // ------------------------------------------ // AppView Setup @@ -24,6 +23,13 @@ const viewServerConfig: ViewServerConfig = { }; export const genericViewServer = new ViewServer(viewServerConfig); setupSystemDb(genericViewServer.systemDB); +let { js, html, css } = await compile({ + target: "view", + initialData: { + config: config.viewServer, + users: (await genericViewServer.unspeccedGetRegisteredUsers()) ?? [], + }, +}); // add me lol genericViewServer.systemDB.exec(` @@ -107,9 +113,9 @@ const placeholderselfcheckstatus = { "#bsky_appview:/xrpc/app.bsky.video.getJobStatus": "black", "#bsky_appview:/xrpc/app.bsky.video.getUploadLimits": "black", "#bsky_appview:/xrpc/app.bsky.video.uploadVideo": "black", - "#bsky_appview:/xrpc/app.bsky.unspecced.getTrendingTopics":"red", - "#bsky_appview:/xrpc/app.bsky.unspecced.getConfig":"red", -} + "#bsky_appview:/xrpc/app.bsky.unspecced.getTrendingTopics": "red", + "#bsky_appview:/xrpc/app.bsky.unspecced.getConfig": "red", +}; Deno.serve( { port: config.viewServer.port }, @@ -118,7 +124,7 @@ Deno.serve( const pathname = url.pathname; const searchParams = searchParamsToJson(url.searchParams); - const publicdir = "/public" + const publicdir = "/public"; if (pathname.startsWith(publicdir)) { const filepath = decodeURIComponent(pathname.slice(publicdir.length)); try { @@ -129,9 +135,11 @@ Deno.serve( } } - const todopleasespecthis = "/_unspecced" + const todopleasespecthis = "/_unspecced"; if (pathname.startsWith(todopleasespecthis)) { - const unspeccedroute = decodeURIComponent(pathname.slice(todopleasespecthis.length)); + const unspeccedroute = decodeURIComponent( + pathname.slice(todopleasespecthis.length) + ); if (unspeccedroute === "/config") { const safeconfig = { inviteOnly: config.viewServer.inviteOnly, @@ -139,20 +147,26 @@ Deno.serve( did: config.viewServer.did, host: config.viewServer.host, indexPriority: config.viewServer.indexPriority, - } + }; return new Response(JSON.stringify(safeconfig), { - headers: withCors({ "content-type": "application/json; charset=utf-8" }), + headers: withCors({ + "content-type": "application/json; charset=utf-8", + }), }); } if (unspeccedroute === "/users") { - const res = await genericViewServer.unspeccedGetRegisteredUsers() + const res = await genericViewServer.unspeccedGetRegisteredUsers(); return new Response(JSON.stringify(res), { - headers: withCors({ "content-type": "application/json; charset=utf-8" }), + headers: withCors({ + "content-type": "application/json; charset=utf-8", + }), }); } if (unspeccedroute === "/apitest") { return new Response(JSON.stringify(placeholderselfcheckstatus), { - headers: withCors({ "content-type": "application/json; charset=utf-8" }), + headers: withCors({ + "content-type": "application/json; charset=utf-8", + }), }); } } @@ -223,9 +237,15 @@ Deno.serve( } ); - -devWatch("view", ({ js: newjs, html: newhtml, css: newcss }) => { - js = newjs; - html = newhtml; - css = newcss; -}); \ No newline at end of file +devWatch({ + target: "view", + initialData: { + config: config.viewServer, + users: await genericViewServer.unspeccedGetRegisteredUsers() ?? [], + }, + onBuild: ({ js: newjs, html: newhtml, css: newcss }) => { + js = newjs; + html = newhtml; + css = newcss; + }, +}); diff --git a/public/client-metadata.json b/public/client-metadata.json new file mode 100644 index 0000000..2216aef --- /dev/null +++ b/public/client-metadata.json @@ -0,0 +1,22 @@ +{ + "client_id": "https://local3768forumtest.whey.party/client-metadata.json", + "client_name": "ForumTest", + "client_uri": "https://local3768forumtest.whey.party", + "logo_uri": "https://local3768forumtest.whey.party/logo192.png", + "tos_uri": "https://local3768forumtest.whey.party/terms-of-service", + "policy_uri": "https://local3768forumtest.whey.party/privacy-policy", + "redirect_uris": [ + "https://local3768forumtest.whey.party/callback" + ], + "scope": "atproto transition:generic", + "grant_types": [ + "authorization_code", + "refresh_token" + ], + "response_types": [ + "code" + ], + "token_endpoint_auth_method": "none", + "application_type": "web", + "dpop_bound_access_tokens": true +} \ No newline at end of file diff --git a/shared-landing/browser/ClientOnly.tsx b/shared-landing/browser/ClientOnly.tsx new file mode 100644 index 0000000..b2f4f07 --- /dev/null +++ b/shared-landing/browser/ClientOnly.tsx @@ -0,0 +1,9 @@ +'use client'; +import React from "https://esm.sh/react@19.1.1"; +import { useEffect, useState } from 'https://esm.sh/react@19.1.1'; + +export function ClientOnly({ children }: { children: React.ReactNode }) { + const [mounted, setMounted] = useState(false); + useEffect(() => setMounted(true), []); + return mounted ? <>{children} : null; +} \ No newline at end of file diff --git a/shared-landing/browser/landing-index.tsx b/shared-landing/browser/landing-index.tsx index f111277..94013f5 100644 --- a/shared-landing/browser/landing-index.tsx +++ b/shared-landing/browser/landing-index.tsx @@ -2,11 +2,13 @@ import React, { useState } from "https://esm.sh/react@19.1.1"; import { createRoot, hydrateRoot } from "https://esm.sh/react-dom@19.1.1/client"; import * as ATPAPI from "https://esm.sh/@atproto/api"; import { AuthProvider } from "../browser/passauthprovider.tsx"; -import { App } from "../browser/landing-shared.tsx"; +import { Root } from "../browser/landing-shared.tsx"; + +const initialDataEl = document.getElementById("initial-data"); +const initialData = initialDataEl ? JSON.parse(initialDataEl.textContent!) : undefined; +// rule of thumb this is the only place where we can do browser-only code createRoot(document.getElementById("root")!).render( - - - + ); //hydrateRoot(document.getElementById("root")!, ); diff --git a/shared-landing/browser/landing-shared.tsx b/shared-landing/browser/landing-shared.tsx index 0d88831..a83cb85 100644 --- a/shared-landing/browser/landing-shared.tsx +++ b/shared-landing/browser/landing-shared.tsx @@ -64,7 +64,7 @@ function Header({ Skylite {capitaltitle} Server{" "} {instancehost && ( - ({/*instancehost*/"alpha"}) + ({/*instancehost*/ "alpha"}) )} @@ -269,8 +269,7 @@ function InstanceInfo({ return ( <>

- About {instanceConfig.name} ( - {window.location.hostname}) + About {instanceConfig.name} ({config?.host})

{instanceConfig.description}

{config && ( @@ -571,8 +570,32 @@ function RegistrationForm({ ); } -export function App({ type }: { type: "index" | "view" }) { +export function App({ + type, + initialData, +}: { + type: "index" | "view"; + initialData?: { + config: { + inviteOnly: boolean; + //port: number; + did: string; + host: string; + indexPriority?: string[]; + }; + users: { + did: string; + role: string; + registrationdate: string; + onboardingstatus: string; + pfp?: string; + displayname: string; + handle: string; + }[]; + }; +}) { const { agent, loginStatus, loading } = useAuth(); + console.log("hasinitialdata?",initialData ? true : false); const [users, setUsers] = useState< { did: string; @@ -583,8 +606,9 @@ export function App({ type }: { type: "index" | "view" }) { displayname: string; handle: string; }[] - >([]); - const [usersLoading, setUsersLoading] = useState(true); + >(initialData?.users ?? []); + const [usersLoading, setUsersLoading] = useState(!initialData?.users?.length); + const isIndex = type === "index"; const capitaltitle = isIndex ? "Index" : "View"; @@ -598,9 +622,10 @@ export function App({ type }: { type: "index" | "view" }) { indexPriority?: string[]; } | undefined - >(); - const [configloading, setconfigloading] = useState(true); + >(initialData?.config ?? undefined); + const [configloading, setconfigloading] = useState(!initialData?.config); useEffect(() => { + if (config) return async function fetchConfig() { try { const response = await fetch("/_unspecced/config"); @@ -618,6 +643,7 @@ export function App({ type }: { type: "index" | "view" }) { }, []); useEffect(() => { + if (users.length) return async function fetchUsers() { try { const response = await fetch("/_unspecced/users"); @@ -693,3 +719,34 @@ export function App({ type }: { type: "index" | "view" }) { ); } + +export function Root({ + type, + initialData, +}: { + type: "index" | "view"; + initialData?: { + config: { + inviteOnly: boolean; + //port: number; + did: string; + host: string; + indexPriority?: string[]; + }; + users: { + did: string; + role: string; + registrationdate: string; + onboardingstatus: string; + pfp?: string; + displayname: string; + handle: string; + }[]; + }; +}) { + return ( + + + + ); +} diff --git a/shared-landing/browser/landing-view.tsx b/shared-landing/browser/landing-view.tsx index a815ba0..abe7dcb 100644 --- a/shared-landing/browser/landing-view.tsx +++ b/shared-landing/browser/landing-view.tsx @@ -2,11 +2,13 @@ import React, { useState } from "https://esm.sh/react@19.1.1"; import { createRoot, hydrateRoot } from "https://esm.sh/react-dom@19.1.1/client"; import * as ATPAPI from "https://esm.sh/@atproto/api"; import { AuthProvider } from "./passauthprovider.tsx"; -import { App } from "./landing-shared.tsx"; +import { Root } from "./landing-shared.tsx"; + +const initialDataEl = document.getElementById("initial-data"); +const initialData = initialDataEl ? JSON.parse(initialDataEl.textContent!) : undefined; +// rule of thumb this is the only place where we can do browser-only code createRoot(document.getElementById("root")!).render( - - - + ); //hydrateRoot(document.getElementById("root")!, ); diff --git a/shared-landing/build.ts b/shared-landing/build.ts index dccc2ff..4a4cc01 100644 --- a/shared-landing/build.ts +++ b/shared-landing/build.ts @@ -5,9 +5,35 @@ import tailwindconfig from "../tailwind.config.ts"; import tailwindcss from "https://esm.sh/tailwindcss@3"; import postcss from "https://esm.sh/postcss@8"; import autoprefixer from "https://esm.sh/autoprefixer@10"; +import { renderToString } from "https://esm.sh/react-dom@19.1.1/server"; +import { createElement } from "https://esm.sh/react@19.1.1"; +import { Root } from "./browser/landing-shared.tsx"; // helper build function -async function build(entry: string) { +async function build({ + entry, + initialData, +}: { + entry: "index" | "view"; + initialData?: { + config: { + inviteOnly: boolean; + //port: number; + did: string; + host: string; + indexPriority?: string[]; + }; + users: { + did: string; + role: string; + registrationdate: string; + onboardingstatus: string; + pfp?: string; + displayname: string; + handle: string; + }[]; + }; +}) { const template = await Deno.readTextFile( `./shared-landing/template-${entry}.html` ); @@ -27,7 +53,7 @@ async function build(entry: string) { loader: { ".tsx": "tsx" }, jsxFactory: "React.createElement", jsxFragment: "React.Fragment", - platform: "browser", + platform: "neutral", //"browser", external: ["react/jsx-runtime", "react/compiler-runtime"], plugins: [ cache({ importmap, directory: "./cache" }), @@ -56,26 +82,88 @@ async function build(entry: string) { const html = template.replace( "", ` - ` + + + ` + ); + // const html = template.replace( + // "", + // ` + // ` + // ); + const ssr = renderToString( + createElement( + () => + Root({ + type: entry, + initialData + }), + null + ) ); + const ssrhtml = html.replace("", `${ssr}`); - return { js, html, css: cssResult.css }; + return { js, html: ssrhtml, css: cssResult.css }; } // public compile function -export async function compile(target: "index" | "view") { - return await build(target); +export async function compile({ + target, + initialData +}: { + target: "index" | "view"; + initialData?: { + config: { + inviteOnly: boolean; + //port: number; + did: string; + host: string; + indexPriority?: string[]; + }; + users: { + did: string; + role: string; + registrationdate: string; + onboardingstatus: string; + pfp?: string; + displayname: string; + handle: string; + }[]; + }; +}) { + return await build({entry: target, initialData}); } // watch loop -export async function devWatch( +export async function devWatch({target,initialData,onBuild}:{ target: "index" | "view", + initialData?: { + config: { + inviteOnly: boolean; + //port: number; + did: string; + host: string; + indexPriority?: string[]; + }; + users: { + did: string; + role: string; + registrationdate: string; + onboardingstatus: string; + pfp?: string; + displayname: string; + handle: string; + }[]; + }, onBuild: (data: { js: string; html: string; css: string }) => void + } ) { for await (const event of Deno.watchFs(".")) { if (event.paths.some((p) => p.endsWith(".tsx"))) { console.log("Rebuilding bundle…"); - const data = await compile(target); + const data = await compile({target,initialData}); onBuild(data); } } @@ -84,13 +172,13 @@ export async function devWatch( async function hashString(content: string): Promise { const encoder = new TextEncoder(); const data = encoder.encode(content); - + // SHA-256 hash const hashBuffer = await crypto.subtle.digest("SHA-256", data); - + // Convert buffer to hex string return Array.from(new Uint8Array(hashBuffer)) - .map(b => b.toString(16).padStart(2, "0")) + .map((b) => b.toString(16).padStart(2, "0")) .join("") .slice(0, 8); // optional: shorten hash for filenames -} +} \ No newline at end of file diff --git a/shared-landing/template-index.html b/shared-landing/template-index.html index 5e02490..3f54e79 100644 --- a/shared-landing/template-index.html +++ b/shared-landing/template-index.html @@ -9,6 +9,6 @@ -
+
\ No newline at end of file diff --git a/shared-landing/template-view.html b/shared-landing/template-view.html index 03ac75e..c1fa65f 100644 --- a/shared-landing/template-view.html +++ b/shared-landing/template-view.html @@ -9,6 +9,6 @@ -
+
\ No newline at end of file