Compare commits

..

2440 Commits

Author SHA1 Message Date
4a4bedfe2b docs: Fix the changelog version. Hmm. 2025-05-28 12:28:33 -04:00
051291f725 build: Let's build 0.0.31. 2025-05-28 12:27:37 -04:00
d2b338095f update: CodeMirror. 2025-05-28 12:26:42 -04:00
899827a8f2 ssb: Rename broadcasts to something not worse. 2025-05-27 21:09:26 -04:00
5fcbe3d6a9 docs: Prep for 0.0.31. 2025-05-27 12:44:33 -04:00
a0a40e6cb2 ssb: Implement blob file export from CLI. #121 2025-05-27 12:30:24 -04:00
bb1190e3f8 intro: Ugg, CSS. 2025-05-22 12:00:33 -04:00
0a3baed1da intro: Wordsmith some more, and fiddle with style. 2025-05-22 11:49:58 -04:00
4931c489ed ssb: Dispatch blob wants immediately when added as the result of a web request. 2025-05-22 10:56:30 -04:00
996f9abaa2 ssb: Suppress the 'set your profile' banner if we're still loading abouts. 2025-05-22 10:44:41 -04:00
08c097e176 ssb: Fix a source of stale user information. 2025-05-22 10:26:59 -04:00
daa861a98b test: Test the intro flow. 2025-05-22 10:19:55 -04:00
a25d08fd76 intro: Skipped a step. 2025-05-22 07:04:57 -04:00
392d31cc53 format 2025-05-21 22:16:52 -04:00
92926fa8df ssb: Chasing intermittent SQLITE_ERROR with multiple processes accessing the database. Switching to sqlite3_prepare_v2 for better errors, but maybe this is also the solution? 2025-05-21 22:05:33 -04:00
61ae9ae465 intro: Set an emoji, obviously. 2025-05-21 18:51:35 -04:00
89622697d5 intro: The default app is intro, and complete intro changes the default app to ssb. 2025-05-21 18:48:29 -04:00
17694f5646 update: CodeMirror. 2025-05-21 18:20:01 -04:00
5a1303149f intro: Add an intro app that aims to ease in completely new users. Needs some clean-up and to be hooked into the flow. #19 2025-05-21 18:08:19 -04:00
8a0e190a86 ssb: Clean up outdated dynamic blob_wants_cache entries. 2025-05-21 17:44:00 -04:00
0d7dfd8c9e ssb: Get the 'encrypt to' input in line with everything else style-wise. 2025-05-18 07:55:10 -04:00
f979ff7050 ssb: Speculation on why I sometimes don't see names update. 2025-05-17 20:10:15 -04:00
e3fcdea362 ssb: Add entries to the blob wants cache when requesting a missing blob from the web. #120 2025-05-17 12:46:47 -04:00
476fec2757 update: w3.css 5.02. 2025-05-14 22:19:53 -04:00
53c215399b ssb: Ugg, better safe than sorry. 2025-05-14 20:57:42 -04:00
2c330802da ssb: More account info fixes. 2025-05-14 20:56:13 -04:00
851d7046ea ssb: Fix failure to gather about information sometimes. 2025-05-14 20:39:06 -04:00
c0019d7246 format 2025-05-14 20:33:02 -04:00
7688e4d3a8 ssb: I tried smarter data structures in my own code, but a better database index shows better performance for determining follows. 2025-05-14 20:13:14 -04:00
ef58749ce3 perf: Make -t following_perf respect the usual db path rules. 2025-05-12 12:41:13 -04:00
35941a7ddc perf: Add a quick test to measure ssb.following performance. 2025-05-12 12:32:41 -04:00
1f2664e5a8 ssb: Reduce redundant work in ssb.following. 2025-05-11 22:20:16 -04:00
35656a5c34 prettier 2025-05-11 21:54:53 -04:00
799f22e989 ssb: The updated fetch_abouts means that image JSON is now a string we need to handle in tf-user / tf-profile. 2025-05-11 21:42:48 -04:00
e226a37251 prettier 2025-05-09 19:54:12 -04:00
8e3bc9d700 ssb: Now add back the about cache, and load times are getting good. 2025-05-09 13:25:05 -04:00
58c3e6c2ab build: Fix a -fanalyze issue in the tests. 2025-05-09 07:55:39 -04:00
0dc148bfea ssb: Don't forget the about info we know as we reload. 2025-05-09 07:35:52 -04:00
3eff1b08a9 ssb: Let about info load in its own time. 2025-05-09 07:27:35 -04:00
02d789471f ssb: Oops, filter on relevant accounts. 2025-05-08 12:58:57 -04:00
d367d47c4d ssb: Switch to a more brute force about-gathering approach. I think if I start with this and avoid querying all known accounts up-front, we will be plenty fast. 2025-05-08 12:39:26 -04:00
c93b8fc045 ssb: Show overall unread status on the hamburger menu. 2025-05-07 19:59:39 -04:00
eb9377e21d ssb: Add settings for broadcast and discovery. 2025-05-07 19:05:57 -04:00
a1764eee42 update: CodeMirror. 2025-05-07 18:37:23 -04:00
86ef74e20d test: More CLI tests, and make -u optional for publish, too. 2025-05-07 18:31:58 -04:00
4de53b9926 core: sqlite checkpoint tweaks. Switch the periodic checkpoint to passive mode. Truncate mode was painful on mobile. I'm seeing it succeed often enough that we don't grow indefinitely. Also fix the print. 2025-05-07 18:15:33 -04:00
99a195a3fd update: sqlite 3.49.2. 2025-05-07 18:00:30 -04:00
f1ced31f69 ssb: Faster loads by encouraging the right queries with CTEs in fetch_about. 2025-05-07 17:52:02 -04:00
b3cedf2baa ssb: Begin to add some CLI tests. 2025-05-06 12:49:57 -04:00
3bf19fabda ssb: Don't require -u for the private command. #119 2025-05-05 21:51:38 -04:00
cf81ebe8ad ssb: emoji-fy other cases of some reactions. 2025-05-05 21:32:40 -04:00
278b5566a1 ssb: Remove some unintended whitespace at the bottom of messages. 2025-05-05 21:09:58 -04:00
e8c1390f09 ssb: Reply arrow that shows up better on my phone. 2025-05-01 12:38:11 -04:00
3c04abda45 ssb: More shutdown correctness. #108 2025-04-30 12:35:40 -04:00
2597f99ccf ssb: Get recent reactions up front so that we don't need to delay showing the dialog for them. 2025-04-29 20:48:47 -04:00
9d3a07c1cf build: OpenBSD 7.7's SSL matches these signatures again. 2025-04-27 17:29:59 -04:00
bdfd8925b5 ssb: Remove some extra margin that slipped in. 2025-04-27 10:18:37 -04:00
1a4d1985f4 core: Revisit drag+drop into the editor. Works better but not as I intended. Use it just to update the screenshot in the welcome app. 2025-04-27 10:18:20 -04:00
6273f3ea53 ssb: Make the connections sidebar header also a link to the connections tab. 2025-04-26 18:53:08 -04:00
5bdc6fa471 update: CodeMirror. 2025-04-26 18:47:04 -04:00
3ba41291db update: QuickJS 2025-04-26. 2025-04-26 18:30:56 -04:00
0867811952 update: libuv 1.51.0. 2025-04-26 09:06:37 -04:00
8d961cd805 ssb: Indicate that content warnings can be expanded. 2025-04-24 12:35:36 -04:00
97cea7b40b build: Attempt to include native debug symbols in the Android .aab file. 2025-04-23 20:47:31 -04:00
4106834db8 build: nix flake update did this (but really it was nix --extra-experimental-features nix-command --extra-experimental-features flakes flake update). I don't know how any of this actually works. 2025-04-23 18:36:28 -04:00
a4a8f7cab2 build: Let's start work on 0.0.31. 2025-04-23 18:33:28 -04:00
9e209ee800 build: nix => 0.0.30. 2025-04-23 18:19:58 -04:00
ddfa84f040 docs: Changlog formatting. 2025-04-23 17:35:16 -04:00
6b3a6ec7c1 httpd: Don't overspecify the redirects. 2025-04-23 12:47:21 -04:00
4d037c02bf build: Let's build 0.0.30. 2025-04-23 12:29:42 -04:00
deaeab10d8 update: CodeMirror. 2025-04-23 12:29:02 -04:00
2a5375b1e7 core: Don't start new tasks as we're shutting down. #108 2025-04-20 18:26:44 -04:00
e7a03e3283 ssb: Slightly faster channel query. 2025-04-20 17:43:53 -04:00
efb3a12dcc ssb: Make the reactions list dialog a bit more compact/concise. 2025-04-20 09:35:39 -04:00
3830d695d7 docs: Getting 0.0.30 ready. 2025-04-20 08:50:10 -04:00
f36620927b ssb: Chasing some failed blob stores. Bumping some sqlite limits seems to have actually helped? 2025-04-19 21:40:15 -04:00
5423cbd628 import: Avoid log noise every launch when apps haven't actually changed. 2025-04-19 21:08:23 -04:00
abde709e54 prettier. 2025-04-16 19:27:24 -04:00
27f2d319ab storage: Faster. 2025-04-16 19:21:57 -04:00
66234b14bc test: Add some coverage of storing and resetting permissions by clicking the approve/deny/remember/reset buttons. 2025-04-16 12:32:34 -04:00
6a9167e565 ssb: More logging to help track down an issue I've seen on rare occasion when saving app changes from the editor. 2025-04-15 12:49:40 -04:00
3c60f8ca06 ssb: Whitespace around nested messages. 2025-04-15 12:42:13 -04:00
c26bf5c112 core: Setting and resetting user app permissions was all sorts of broken. 2025-04-14 12:41:35 -04:00
41cbde934a ssb: Layout the message expand/collapse buttons better. 2025-04-13 21:38:56 -04:00
946941d95e format 2025-04-13 21:18:28 -04:00
50f0104239 ssb: Add size to messages_stats. Forces an already-necessary rebuild and provides information I'm keen on having readily available. 2025-04-13 21:16:26 -04:00
40fa7edadf ssb: Show message count when viewing an account profile. 2025-04-13 20:48:55 -04:00
d6926569c6 verify: Add an option to dump a specific message in the format that its signature validates as well as a hex representation of the bytes for good measure. 2025-04-13 13:28:48 -04:00
a8bba324ca ssb: Fix removing a mention discarding a draft. 2025-04-13 07:53:15 -04:00
5bba5776b3 core: Get rid of the httpd JS object. Potential progress on #108. 2025-04-12 09:43:55 -04:00
8104f6f228 ssb: Fix and test the messages_stats trigger. 2025-04-12 08:40:36 -04:00
3f4738e593 ssb: Fall back to hostnames for connections in the sidebar. 2025-04-12 07:05:37 -04:00
1516e17f5d update: Lit 3.3.0. 2025-04-11 19:32:26 -04:00
676d2702b7 ssb: Read back-pressure on a tunnel connection affects the parent connection. This was causing spurrious disconnects. 2025-04-11 19:29:10 -04:00
5d39548964 ssb: Why is this faster? 2025-04-09 22:47:23 -04:00
67d458bd38 ssb: prettier. 2025-04-09 22:15:51 -04:00
d9684c7d62 ssb: Fix culling feeds again. 2025-04-09 22:15:01 -04:00
5a818d2119 ssb: More incremental profile loading? 2025-04-09 22:08:33 -04:00
6f96d4ce65 ssb: More different feed culling logic. 2025-04-09 20:45:23 -04:00
f72395756a ssb: If things time out because we're following a million accounts...recover ungracefully. 2025-04-09 20:02:16 -04:00
38d746b310 ssb: Dust off the verify command. 2025-04-09 19:32:38 -04:00
f7270987ea http: Trying to track down a rare 404 I get on save. 2025-04-09 19:08:28 -04:00
6f565c0f0a ssb: Move reply and react to the message % menu. 2025-04-09 19:02:02 -04:00
7f252e79b6 ssb: Faster channel loads. 2025-04-09 18:50:14 -04:00
ba2bb17638 ssb: Gather all the votes for messages seen. 2025-04-09 18:29:37 -04:00
bc7c658293 update: CoreMirror. 2025-04-09 12:28:56 -04:00
4d84e69bb5 update: libbacktrace. 2025-04-09 12:26:44 -04:00
03fac74908 update: c-ares 1.34.5. 2025-04-09 12:24:55 -04:00
5252ff1ecf update: OpenSSL 3.5.0. 2025-04-09 12:22:12 -04:00
20100d3fd4 ssb: Oops, that event was Firefox-specific. 2025-04-07 22:35:40 -04:00
dd3b2656ad ssb: Message % menu tweaks. Show on click. Hide when clicking off. Bury the message ID further. 2025-04-07 21:39:14 -04:00
657f25e22b ssb: Bring back the date. Whoops. 2025-04-05 22:05:26 -04:00
8be354fc49 ssb: It is troubling to me that querying like this is so much faster. 2025-04-05 18:40:00 -04:00
e574758340 ssb: Make a message % context menu with some new options to begin to declutter the message view itself. 2025-04-05 17:53:47 -04:00
40cf519492 http: I caught an http listener lingering on shutdown. Clean them up more correctly. Possible progress on #108. 2025-04-05 09:53:47 -04:00
0e4fda54e9 fdroid: Lean into SSB in the description. 2025-04-03 12:31:59 -04:00
868f91e1ef docs: Noticed some errors in the readme. 2025-04-02 20:01:26 -04:00
b9000c154f apps: Add a very wip web app. 2025-04-02 18:07:25 -04:00
894c72a82f ssb: Still chasing faster loads of the default news query. 2025-04-02 12:44:17 -04:00
c128cfc25c ssb: This makes the channels query sub-second for me. 2025-04-01 19:50:13 -04:00
36c88b463c buttfeed: Add PatchFox. 2025-04-01 08:13:54 -04:00
8a66e74074 ssb: Faster *and* correct. I think. 2025-03-30 13:18:16 -04:00
ea60b165da ssb: Had my refs backward. 2025-03-30 12:27:36 -04:00
1011e0026b ssb: Rearrange indexes for an overall faster load on mobile for me. Tidy up some things along the way. 2025-03-30 12:16:23 -04:00
9462521287 update: CodeMirror. 2025-03-27 12:37:13 -04:00
576022c41a build: 0.0.30-wip, let's gooooo. 2025-03-26 20:19:28 -04:00
70c38b7ea8 build: nix => 0.0.29. 2025-03-26 18:57:05 -04:00
36370f2dea build: Fix this dependendy test. 2025-03-26 18:48:49 -04:00
db9bf7f7bd build: Let's build 0.0.29. 2025-03-26 12:28:06 -04:00
fa7aef0c37 build: Fix make warnings on macos. 2025-03-25 19:31:25 -04:00
b135ea17f6 ssb: Let's make sure these are never null again. 2025-03-22 22:17:03 -04:00
4b1643bc47 ssb: Hook up a busy handler to give checkpointing a chance of working, and fix fundamental bugs with the messages_stats table. How did this ever work? 2025-03-22 08:58:43 -04:00
240a8ce9c7 ssb: All initial population in transactions for correctness. 2025-03-21 20:52:27 -04:00
8928e8722b ssb: Notifying apps of every single message added isn't practical for big replications. Only notify on the completion of each chunk. Update the tests. The apps need some treatment, but refreshing works around any issues for now. 2025-03-21 20:45:49 -04:00
d692734e55 ssb: Prefer getting last message sequence from the messages_stats table if we don't need the message id. Trying to chip away at things I see in profiles. 2025-03-20 12:53:38 -04:00
50197198b4 update: Missed one instance of w3.css. 2025-03-20 12:41:20 -04:00
1ee1107c93 update: w3.css 5.0.1. 2025-03-19 20:51:51 -04:00
cf90533b6c ssb: Make these queries match the index more pedandically, if only for consistency. 2025-03-19 20:31:42 -04:00
f0211f621e ssb: That's just a weird formulation of this query. I saw it in a profile. 2025-03-19 19:09:29 -04:00
d9693af89b build: Some prep for v0.0.29. 2025-03-19 18:37:17 -04:00
13722232fb ssb: Don't let GC saturate the main thread during replication. 2025-03-19 07:47:10 -04:00
0bcb033349 ssb: This seems like it would explain replication stalls. 2025-03-19 06:46:34 -04:00
e92c439724 ssb: Commit messages in transactions for performance. 2025-03-18 12:49:47 -04:00
7f34b585d3 ssb: Don't count messages we're not intending to replicate toward progress. 2025-03-17 21:13:20 -04:00
d7e9fd918a ssb: Idea: ebt clocks shouldn't go backward. 2025-03-17 20:49:55 -04:00
9899c0c5e2 ssb: Try to keep these stats from going negative. 2025-03-17 12:29:30 -04:00
c50de0b0f0 ssb: Testing a theory that message sends are piling up. 2025-03-17 12:27:16 -04:00
bb7d2d7ae0 ssb: Update ebt received value on the fly. 2025-03-16 22:04:06 -04:00
862d172ca8 ssb: Pub blobs in the idle queue, too. I'm confused why things aren't moving like I'd expect. This seems more fair. 2025-03-16 19:30:35 -04:00
3671051d0e cli: Show usage and error on unexpected arguments. 2025-03-16 12:45:54 -04:00
223e20cbbc ssb: Fix the tests. 2025-03-16 11:52:11 -04:00
9af4312561 ssb: Attempt to show EBT replication progress in the connections tab, mainly to help track down bugs, which there are. 2025-03-16 11:39:28 -04:00
934e40240e build: Fix some haiku make warnings. 2025-03-15 17:46:25 +00:00
edb1980387 ssb: Address a -fanalyze issue. #114 2025-03-15 13:44:02 -04:00
bb7b04013f ssb: Resolve a DB-related naming collision I caused better. 2025-03-12 20:49:48 -04:00
26a3007268 http: We can bind to localhost if we do it right, apparently. 2025-03-12 20:23:37 -04:00
5de2b09596 ssb: Obviously remove from blob_wants_cache when a blob is added. 2025-03-12 18:23:38 -04:00
3660577a23 ssb: I made blob_wants_view too slow. Let's make a real table updated by triggers. 2025-03-12 18:17:11 -04:00
98b4c7cf04 http: Disable binding to localhost on mobile until I can solve 'address not available'. 2025-03-11 21:36:55 -04:00
427a7b8d25 ssb: Request blobs referenced by messages, as an experiment. Recursively, too. 2025-03-11 19:02:48 -04:00
67b84830cd debug: Add an /ebt endpoint to examine the state of EBT clocks. Prevent invalid identities from getting in there, now that I see them. 2025-03-09 11:28:47 -04:00
973cd53266 security: Make mobile listen on localhost by default. I did not intend to leave it open. 2025-03-08 20:40:03 -05:00
1afdbe6932 build: Let's include speedscope again.
We're no longer trying to fit into a 5MB APK or anything.
2025-03-07 12:48:35 -05:00
942f582329 trace: Fix a crash and source of invalid json. 2025-03-07 12:37:02 -05:00
951a80389a update: CodeMirror. 2025-03-05 20:32:56 -05:00
b7ecfc9925 ios: Fix file upload. This is the last thing I would have expected. #109 2025-03-05 19:48:39 -05:00
59e389d793 ios: Add rough back/forward/refresh buttons. #111 2025-03-05 18:56:06 -05:00
2ec047cc00 build: Appease various doxygen versions. 2025-03-04 12:46:12 -05:00
ee33f54745 ssb: Don't send EBT clocks that weren't asked for. Fixes more replication-related warnings. 2025-03-04 12:19:52 -05:00
7a79534ca8 docs: Add some words about upgrading. 2025-03-02 21:21:04 -05:00
a74a9fc821 ssb: Clean up some muxrpc-related warnings. 2025-03-02 19:43:50 -05:00
e2c388b9db cleanup: Stray file again. 2025-03-02 19:29:27 -05:00
0f573ce09e ssb: Move identity info gathering to db. 2025-03-01 20:44:52 -05:00
bc70e41b7c ssb: prettier. 2025-02-27 20:17:24 -05:00
f500e14aa3 ssb: Make the connections tab a bit less scary. 2025-02-27 20:04:38 -05:00
8b47938238 perf: Make promise stack trace collection opt-in. 2025-02-27 19:41:21 -05:00
8912212d8e build: Fix 32-bit. 2025-02-27 19:10:48 -05:00
6a346bf940 http: Move websocket send to http, obvs. 2025-02-27 19:07:01 -05:00
b5bdae4611 js: prettier 2025-02-27 15:00:37 -05:00
6590da5793 js: Just delete some placeholder comments around code that I am trying to delete. 2025-02-27 15:00:02 -05:00
eb2b426ec7 js: Clean up some oddness in old code as I struggle to replace it. 2025-02-27 14:28:07 -05:00
4864a0411f js: This RPC info does not need to be global. 2025-02-27 13:52:24 -05:00
68590cae33 http: Avoid a potential null dereference. 2025-02-27 11:25:38 -05:00
abf2bbaec2 js: Very minor trimming. 2025-02-27 10:01:59 -05:00
0da7e2722f js: Add a place to start moving imports to C. 2025-02-27 09:58:15 -05:00
60d4b06057 http: Prevent reentering tf_http_destroy. 2025-02-27 08:52:42 -05:00
4c3df34950 build: Let's start work on 0.0.29. 2025-02-26 20:04:17 -05:00
7737e60b52 build: ios => CFBundleVersion=10. 2025-02-26 19:44:00 -05:00
71e816bc13 build: nix => 0.0.28. 2025-02-26 19:43:20 -05:00
c74f90ef04 core: Fix stock apps not being loaded/updated. 2025-02-26 18:54:00 -05:00
26cb7e5a17 ios: Redid icon stuff. 2025-02-26 18:27:54 -05:00
2bad6672d8 ios: Generate Assets.car out of an overabundance of caution that F-Droid is going to complain about this as a binary file. 2025-02-26 12:43:42 -05:00
71c4011526 build: Let's prepare a 0.0.28 release. 2025-02-26 12:07:54 -05:00
5e81078f59 update: CodeMirror. 2025-02-26 12:05:07 -05:00
31b78e74df ssb: Following calculation fixes. It was not handled appropriately if an account was encountered multiple times with decreasing depths. 2025-02-25 21:52:15 -05:00
2ff689aab0 buttfeed: De-duplicate updates by link. 2025-02-24 12:16:31 -05:00
0a6f0ed3f7 ssb: Audit timer use that might cause unnecessary delays during shutdown. 2025-02-23 13:07:36 -05:00
bfec46673d ssb: Test an experiment that blobs are getting priority over messages during initial sync. 2025-02-22 11:57:57 -05:00
3a16614c72 docs: Remember to update the latest_release tag. 2025-02-22 11:23:36 -05:00
9c9efb845c ssb: Schedule the clock for reevaluation any time new messages are added. I think this will improve initial replication. 2025-02-21 22:30:14 -05:00
6192f1b94d room: Fix the room app port number multiple ways. 2025-02-21 22:05:28 -05:00
ce451b2449 cli: Fix the return value for get_profile. 2025-02-21 19:58:01 -05:00
8534e16469 docs: +sidebar. 2025-02-19 20:20:21 -05:00
f6cc6f2eae docs: Minor prep for 0.0.28. 2025-02-19 19:54:45 -05:00
0904425221 update: CodeMirror. 2025-02-19 19:04:59 -05:00
a729886522 update: sqlite 3.49.1. 2025-02-19 18:59:45 -05:00
e5dfedc7d1 ios: Drop min ios version to 14. Generate more of the Info.plist. We don't use non-exempt encryption. 2025-02-19 18:49:53 -05:00
f02423d084 ios: Now with more sed. 2025-02-18 21:46:04 -05:00
8f4b6e83eb ios: This fixes the build on macos and runs in the simulator. 2025-02-18 21:28:03 -05:00
3029919553 ios: Might as well generate the CFBundleShortVersionString from that other version. 2025-02-18 20:58:16 -05:00
ac67db0591 Merge pull request 'nix: fix build instructions fuckup' (#107) from tasiaiso/tildefriends:tasiaiso-fix-fuckup-holy-shit into main
Reviewed-on: cory/tildefriends#107
2025-02-18 19:26:56 -05:00
1e08838f5b ios: I was able to get an iOS build to app store connect with this. Sanity lost. 2025-02-18 19:03:25 -05:00
d814f7ee77 nix: update flake lockfile, fix update procedure 2025-02-18 22:41:00 +01:00
7edfb9d386 docs: I forgot to do this last release. 2025-02-17 21:16:38 -05:00
6928d6caba cleanup: prettier. 2025-02-16 15:52:27 -05:00
1a626875cf build: Link warning on macos. 2025-02-16 15:13:45 -05:00
6eb3b64334 build: Fix android aab build. 2025-02-16 14:41:14 -05:00
09f3595e93 ssb: Use the right shape for your own profile image. 2025-02-16 14:37:45 -05:00
11e89622d4 security: Respect the autologin setting better. 2025-02-16 14:07:14 -05:00
0fa8acc264 ios: Untested, but attempt auto-login. 2025-02-16 13:42:07 -05:00
afc7c64ed8 android: Fix launch args. 2025-02-16 13:41:26 -05:00
c794c1b885 admin: Global settings can be specified on the command-line. Removed some previous, less thorough ways of configuring things. #102 2025-02-16 13:37:25 -05:00
6247529799 build: Fix F-droid icon reference. 2025-02-16 11:49:45 -05:00
ad3eedc1fb android: Avoid the extra background on the icon, and set a different color for F-droid builds. 2025-02-16 11:43:27 -05:00
1cfac3cae6 ssb: Allow otherwise unrecognized incoming connections when not talking to strangers if they have a valid invite. 2025-02-16 08:45:08 -05:00
478bcd5d13 ssb: New incoming connections replace old ones for the same id. 2025-02-16 08:19:40 -05:00
6932da69b3 update: speedscope 1.22.2. 2025-02-15 21:08:46 -05:00
857f47bf55 ssb: Make the invite.use reponse flags match the docs exactly, and add some connection state paranoia. 2025-02-15 20:52:39 -05:00
373d742751 ssb: The docs show the response to invite.use() wrapped in {key: ..., value: ...}, so do that. 2025-02-15 08:19:23 -05:00
575622c522 ssb: Did that from the wrong thread. 2025-02-13 21:37:40 -05:00
a3e86ccb1d update: CodeMirror. 2025-02-12 19:43:19 -05:00
e491798ff1 auth: Auto-login fixes. 2025-02-12 19:37:06 -05:00
15df4ac236 auth: Skip auth on mobile. #97 2025-02-12 19:25:05 -05:00
017a74c4e4 ssb: Reload the profile on follow/unfollow/block/unblock. 2025-02-12 18:20:44 -05:00
6e5b1127f3 ssb: If we don't accept the invite, give up on the connection. 2025-02-12 18:08:40 -05:00
95f4f88949 ssb: Non-expiring invites were still broken. 2025-02-12 18:03:53 -05:00
92858882d7 update: libbacktrace. 2025-02-11 20:53:57 -05:00
4cba95ec8c update: CodeMirror. 2025-02-11 20:52:13 -05:00
bbb2f89d85 update: OpenSSL 3.4.1. 2025-02-11 20:48:41 -05:00
88213038b2 build: Link with -gz=zlib to make some of these distributables megabytes smaller. 2025-02-11 20:42:22 -05:00
cc18b41e76 update: sqlite 3.49.0. 2025-02-10 22:05:02 -05:00
f16127a238 build: Fix mixing directory for lipo targets. 2025-02-10 21:28:22 -05:00
2a6ecfaede build: Set an LD_LIBRARY_PATH for macos on linux. 2025-02-10 20:57:14 -05:00
cf4a09bf03 build: Use clang-19 on the worker, and cleanup some symlinks I commited in error. 2025-02-10 20:23:54 -05:00
20e60262fd build: Some clangs are more strict than quickjs. 2025-02-09 21:46:17 -05:00
9e3928c976 build: Some clangs are more strict about this. quickjs is not. 2025-02-09 21:45:05 -05:00
95d8768545 build: Try to get CI building for macos. 2025-02-09 20:47:20 -05:00
8679d09040 build: Build a fat macos binary. 2025-02-09 08:13:13 -05:00
4cc5c6acb3 build: On second thought, split the cross-build of macos into x86_64 and arm. 2025-02-06 12:48:17 -05:00
6f9b548b1a build: There seems to be a way to build for macos from Linux. Neat. 2025-02-05 20:50:41 -05:00
fbff3386a9 update: CoreMirror. 2025-02-05 18:58:03 -05:00
e5899fca58 ssb: Use the cache of private messages we built for the unread notification to actually show private messages. Still needs some work, but it's something. 2025-02-05 18:41:37 -05:00
dddec489b9 ssb: Results of staring at unexpected shs disconnections: wire up tunnel.endpoints and blobs.createWants more correctly/thoroughly. And add slightly more context when deliberately disconnected from the remote side. 2025-02-04 21:32:22 -05:00
b4049eaeaa welcome: Feeling fancy. Might revert later. 2025-02-04 12:53:04 -05:00
b3fd724b5a docs: Some updates to the README. 2025-02-04 12:39:59 -05:00
aca25be86a docs: Minor cleanup/normalization. 2025-02-03 12:39:23 -05:00
0f8cbdac57 docs: Bring back docs as a directory. Long live https://docs.tildefriends.net/ 2025-02-02 22:39:55 -05:00
630219d667 docs: Stop using docs as a submodule. It discouraged pull requests. 2025-02-02 22:39:11 -05:00
fef268e434 build: Oops. 2025-02-02 22:21:16 -05:00
e18dcf3a48 build: Maybe ssh? 2025-02-02 22:18:05 -05:00
e019320146 build: Forgot the actual rsync options I wanted. 2025-02-02 21:55:57 -05:00
65b31e14f9 build: +rsync. Formatting yaml. 2025-02-02 21:51:18 -05:00
9cb5cbcde9 build: OK, that fail's on me. 2025-02-02 21:47:05 -05:00
25914ff5a7 build: c'mon 2025-02-02 21:44:05 -05:00
c4af799279 build: Let's try to put docs somewhere. 2025-02-02 21:40:29 -05:00
3f8f0e14f4 build: Make a directory for a thing that fails intermittently?? 2025-02-02 17:12:03 -05:00
5414b30e7f build: Resolve some zsign/cmake warnings. 2025-02-02 17:07:59 -05:00
7aee897c1b cleanup: No longer need form parsing in JS. 2025-02-02 16:52:44 -05:00
4060f9cc11 build: jarsigner -> apksigner to suppress a warning. 2025-02-02 16:38:55 -05:00
5b526cbf5b build: Clean up / consolidate some OpenSSL options now that there is only one place. Also: deadstrip better? 2025-02-02 16:19:46 -05:00
f5065ff42b build: Indicate that we always use system OpenSSL on Haiku and BSD. 2025-02-02 21:08:46 -05:00
86b5546f5f build: Get rid of the ios-specific OpenSSL build script. Now there is only one. 2025-02-02 15:56:06 -05:00
43ae2a293b build: Fix cross-compiling for arm. 2025-02-02 15:55:12 -05:00
b8ddbd4255 build: Remove the mingw-specific OpenSSL build script. 2025-02-02 15:21:38 -05:00
87cdba1db8 build: Replace the android-specific script to build OpenSSL with the shared one. 2025-02-02 15:16:51 -05:00
df83187e33 cleanup: Remove File.writeFile(). It is no longer used or necessary. 2025-02-02 14:52:25 -05:00
eccdbf29ab build: Move built openssl to out where it belongs. 2025-02-02 14:39:36 -05:00
28d181f8bc build: Fix. 2025-02-02 14:28:40 -05:00
d386daf2ff build: Rename the macosdebug/macosrelease targets to debug/release. #101 2025-02-02 14:08:27 -05:00
0c1e116c1e build: More concise build context. 2025-02-02 13:04:22 -05:00
bb0ed67827 httpd: Move starting the http server into C. 2025-02-02 12:27:06 -05:00
b111d06851 ssb: I think this fixes missing a range in some circumstances. 2025-02-02 10:14:14 -05:00
79388845ea build: Remove the dependency on zsign on macos. 2025-02-01 22:30:35 -05:00
99faef2e77 build: valid bash? 2025-02-01 19:59:18 -05:00
21fffbfe10 build: Valid yaml? 2025-02-01 19:58:28 -05:00
64fb9f0c2a build: +zlib. 2025-02-01 19:55:02 -05:00
a42e0bef2c build: The journey continues. 2025-02-01 19:15:50 -05:00
45a09006e1 build: Build zsign for the sake of the ios build. 2025-02-01 18:52:20 -05:00
240484be4c build: Fix docker build, and speed it up a bit? 2025-02-01 18:19:44 -05:00
22f4d115e3 build: Finally ios is happy. Now let's un-break docker. 2025-02-01 18:07:56 -05:00
32920e0e5d build: Still trying to get ios to build on this worker. 2025-02-01 17:58:55 -05:00
f03a5918d1 build: Apparently we need file. 2025-02-01 17:19:28 -05:00
dd1870b52a build: Nope, OpenSSL assumes this directory is SDKs, so it is SDKs. 2025-02-01 16:51:10 -05:00
f0c1a8f98f build: Minor cleanup and a disappointing workaround for iOS cross-compiling toolchain issues I don't understand. 2025-02-01 16:25:23 -05:00
0c181d7e7c build: Maybe maybe maybe. 2025-02-01 14:55:26 -05:00
e3dc0e833a build: Some docs say the syntax is like this. 2025-02-01 14:17:15 -05:00
6de875edea build: Print some configuration that is confusing me. 2025-02-01 13:38:52 -05:00
986a55173f build: I think CI can cross-build ios. 2025-02-01 12:50:31 -05:00
59c8cabf02 build: fix? 2025-02-01 11:39:58 -05:00
a33b9fab07 build: I misunderstood these makefile conditionals. 2025-02-01 11:32:01 -05:00
f8a725e1e7 build: ios dist is conditional on having the SDK. 2025-02-01 11:02:21 -05:00
b3ab3af01b build: dist uses curl. 2025-02-01 10:10:59 -05:00
79f9463e56 build: Can I get CI to artifact the dist files? 2025-02-01 09:49:49 -05:00
4257b2ed51 ssb: Unknown message types need some padding. 2025-02-01 09:41:22 -05:00
6488ab60ec build: Docker build no longer needs libssl installed. 2025-02-01 09:40:34 -05:00
18bd3dfcf9 build: So close. +docker? 2025-02-01 09:00:06 -05:00
ec114e160d build: on node:23-bookworm-slim 2025-02-01 08:34:42 -05:00
de033af18f build: Oh, now I can use a normal image, maybe with a more reasonable compiler? Also, update libbacktrace. 2025-02-01 08:31:33 -05:00
e971c6fcb7 build: Go home, -fanalyze, you're confused. 2025-02-01 08:14:11 -05:00
d3c465391c build: +zip 2025-01-31 21:47:24 -05:00
f1fa19593d build: Better system OpenSSL logic? 2025-01-31 21:43:18 -05:00
60b6f9c73e build: +build-essential 2025-01-31 21:32:17 -05:00
55b95ddecb build: +make 2025-01-31 21:27:14 -05:00
0800a251b2 build: +unzip 2025-01-31 21:23:22 -05:00
82cf7a80eb build: Maybe I don't need sudo here? 2025-01-31 21:19:22 -05:00
379f3d12eb build: Maybe we can just install the git we need? 2025-01-31 21:15:19 -05:00
e52972d4d4 build: Version shenanigans? 2025-01-31 21:11:35 -05:00
1a0ca4dec2 build: I guess this requires node? 2025-01-31 21:08:57 -05:00
0bac9d8d5a build: Can I specify the image we build on like this? 2025-01-31 21:07:01 -05:00
a9608363c5 core: Don't actually start the http server unless we've specified a port or are asking for a port to be determined and written to file. 2025-01-31 20:57:59 -05:00
f1a2c5ae8e ssb: Silence some persistent broadcast noise. 2025-01-31 20:45:35 -05:00
192a81ede7 core: As an experiment, handle running from a subdirectory (generally out/debug or out/release, since people tend to do that). Remove unused File.stat(). 2025-01-31 20:37:14 -05:00
916aa5abbd cli: Fix create_invite's expire option. 2025-01-30 22:16:06 -05:00
d4a5cc6eee build: Let's start work on 0.0.28. 2025-01-30 12:46:52 -05:00
d19605cc8d build: Fixes nix. Now everybody is happy. 2025-01-30 12:35:43 -05:00
8d529327a4 build: Let's go back to nix trying to use its own OpenSSL. 2025-01-30 12:31:12 -05:00
697e2f2071 build: Nope, I don't understand nix. 2025-01-29 20:53:09 -05:00
f7fb112f21 build: I don't understand this nix error. 2025-01-29 20:32:35 -05:00
b2c0211190 build: nix? 2025-01-29 20:28:26 -05:00
c59e0ea6e5 build: Let's release 0.0.27. 2025-01-29 19:58:31 -05:00
6c2fc1444d ssb: Fix some SQL syntax for private messages. They need more work. 2025-01-29 12:15:46 -05:00
94d969fe46 update: CodeMirror. 2025-01-28 22:23:52 -05:00
a7bc3d301c cleanup: format. 2025-01-28 22:00:48 -05:00
18bab849f7 ssb: prettier. 2025-01-27 21:02:15 -05:00
04878fcc30 ssb: Fix multiple bugs with follow status lying. 2025-01-27 20:28:44 -05:00
ffe1299548 ssb: More room for activities in the emoji picker dialog. 2025-01-27 12:45:54 -05:00
64bdbf5725 build: Never mind. flatpak tools don't want to work in docker. 2025-01-27 12:11:41 -05:00
b82deb557f build: https://github.com/flatpak/flatpak-builder/issues/237 ?? 2025-01-26 21:43:18 -05:00
d529a48a11 build: flatpak maybe? 2025-01-26 21:14:55 -05:00
b711e4e6bd build: Can the CI worker build the flatpak? Let's find out. 2025-01-26 20:47:44 -05:00
186eecfbff build: I don't know why this works better, but it does. 2025-01-26 20:43:02 -05:00
d766c33f59 build: Stop using lto. Not worth the hassle. 2025-01-26 09:56:53 -05:00
2c9257f1a8 build: Trying to understand a build thing. 2025-01-26 09:33:45 -05:00
71ff604f90 ssb: Stop breaking up the news queries into chunks. It sometimes produced incorrect results, and it is not necessary if we're fast enough. 2025-01-25 20:13:05 -05:00
83e00763ea ssb: Be a bit more aggressive about loading latest messages. It bugs me when I don't see my own reactions in a channel or whatnot, and I think it has to do with the queried time ranges. 2025-01-25 18:00:06 -05:00
5b647e0937 buttfeed: Use markdown that works better in Manyverse. 2025-01-25 08:08:02 -05:00
e0444510f4 trace: Use our own sequential thread ids to be more compatible with different trace viewers. 2025-01-24 19:00:40 -05:00
82e876a892 ssb: Only re-populate the messages_stats table on first creation. 2025-01-24 18:06:31 -05:00
c728e05032 ssb: Add a lookup table of max sequence and timestamp per account.f 2025-01-22 19:19:50 -05:00
c7a8ce7060 apps: display: grid. 2025-01-22 19:13:15 -05:00
762b4339fe ssb: Better 'Load More', too. 2025-01-22 18:28:55 -05:00
f824b8988e ssb: Correctness around tunnel.endpoints. 2025-01-22 18:03:05 -05:00
6280d6d167 apps: Mobile CSS tweaks. 2025-01-21 21:46:48 -05:00
4f18e744b4 ssb: Unbreak the channel query. 2025-01-21 21:31:16 -05:00
01d8f720e8 ssb: Treat timestamps of related messages separately from those of the primary queried messages. 2025-01-21 21:07:37 -05:00
18cf058af3 ssb: Experimenting with the news query strategy. 2025-01-21 20:53:23 -05:00
e2406df367 apps: Messing with CSS. 2025-01-20 20:45:35 -05:00
1fd669bdb3 update: npm. 2025-01-20 20:25:31 -05:00
f6add12c80 build: Update the change notes. 2025-01-20 17:57:15 -05:00
0f643bfe39 ssb: Complete using an invite, following the pub and posting a pub message. #99 2025-01-20 17:47:30 -05:00
15be498e4b ssb: Don't show connections in various states of disconnectedness in the sidebar. 2025-01-20 16:57:22 -05:00
fba465dd62 ssb: Allow a concurrent connection if the other one is a connection in the process of closing. 2025-01-20 16:49:21 -05:00
19dbe354e7 core: Consolidate default global setting values in one place. 2025-01-20 14:23:41 -05:00
fca5d37b7e ssb: Add an option to control whether we talk to strangers. #98 2025-01-20 13:35:28 -05:00
aa04ad2dc2 ssb: Clean up used and expired invites. 2025-01-20 08:01:24 -05:00
7ef4d814ef ssb: Avoid showing a broken img when viewing a profile without one assigned. 2025-01-19 21:34:42 -05:00
3f3deb665c ssb: Add a command-line action to generate an invite, and verified that Patchwork can accept it. 2025-01-19 21:00:38 -05:00
97fc22ce57 ssb: Test the one message generated from an invite so far. 2025-01-19 18:38:26 -05:00
616f3ad76d ssb: Invite support progress. Now the pub accepts the invite, tracks its use, and follows. The client still needs to react. 2025-01-19 17:02:08 -05:00
faca63946c build: Fix make docs. 2025-01-19 16:03:21 -05:00
57bae341a2 build: Missed an include. 2025-01-19 16:02:51 -05:00
fd09a766d2 ssb: Work in progress invite support. We can generate them. We can connect using an invite code. We can't yet invite.use(). 2025-01-19 16:00:37 -05:00
11564a5292 core: Let's try some neutral colors to avoid clashing with app colors. 2025-01-18 21:56:43 -05:00
ac12e350bf ssb: People without profile images get emoji faces. I'm amazed it took me this long. 2025-01-18 21:17:07 -05:00
2def15337d update: speedscope 1.22.0. 2025-01-17 17:55:47 -05:00
3e3d58a4a9 ssb: Try harder to avoid doing things with new connections during shutdown. 2025-01-16 12:47:50 -05:00
5ce4f55228 update: speedscope 1.21.2. 2025-01-16 12:35:43 -05:00
21788fc7b0 ssb: Stared at the news feed queries for performance and correctness a bit. 2025-01-15 19:32:31 -05:00
a1c4382fde update: libuv 1.50.0. 2025-01-15 18:53:34 -05:00
364e95698e ssb: Remove the react confirmation dialog. 2025-01-15 12:34:02 -05:00
6eec142499 update: sqlite 3.48.0. 2025-01-15 12:14:46 -05:00
a8f6b3a39a ssb: pub messaged needed padding. 2025-01-14 21:50:38 -05:00
250933bf41 ssb: Suppress noisy output when running command-line actions with output intended to be parsed. 2025-01-14 21:37:11 -05:00
56c77c781a ssb: Placeholder messages needed padding. 2025-01-14 21:18:49 -05:00
f7602b39a1 ssb: The compose preview needed some padding. 2025-01-14 20:51:56 -05:00
8c86092356 ssb: Make the refresh icon a circle. 2025-01-14 20:29:12 -05:00
db0a4bff77 ssb: Use most recent post timestamps to feature more relevant people to follow. 2025-01-14 20:15:18 -05:00
e198ff9cb1 ssb: Show some suggested accounts to follow. 2025-01-12 14:54:09 -05:00
b8eaa5cf97 ssb: prettier. 2025-01-12 12:08:50 -05:00
0d597721bf ssb: Try harder to avoid a full re-render. It's disruptive. 2025-01-12 12:01:52 -05:00
003e0caada ssb: Distant/unknown users get a circle avatar, too. 2025-01-12 11:56:59 -05:00
053637cfb4 ssb: The sync button indicates if a one-shot sync is active. 2025-01-12 11:54:30 -05:00
8178213f1a ssb: Keep the previous db location for android. wip release notes. 2025-01-11 16:14:39 -05:00
b4222a41de update: CodeMirror. 2025-01-11 16:02:52 -05:00
f28e409ea5 ssb: Add a get_contacts command to enumerate follows, blocks, and friends. 2025-01-11 15:49:49 -05:00
287c6c06e1 core: More clean shutdown? 2025-01-11 14:48:12 -05:00
8216bdb4b3 core: Poking at task cleanup. 2025-01-11 14:41:46 -05:00
aa15da50ab ssb: Tried to do the right lit things to prevent unnecessary re-rendering. Ended up doing a lazy JSON thing. 2025-01-11 14:09:42 -05:00
02759c6f83 ssb: Hint at follow depth with profile image shape. Also, reload follow information the same way we re-determine channel unread status. Let's see if this feels good. 2025-01-11 13:48:06 -05:00
6b0c49752c ssb: Trying to learn about occasional errors updating connection info in the database. 2025-01-11 13:02:30 -05:00
2e4f792fc3 ssb: Try to consolidate the local users list. Man, CSS. 2025-01-11 12:48:44 -05:00
17eba059f0 ssb: Fix trying to connect to the same stored connection over and over. 2025-01-11 12:32:18 -05:00
e59a00922b ssb: Respond to tunnel.endpoints. Patchwork didn't seem to like that we responded to tunnel.isRoom but not this. 2025-01-11 09:23:12 -05:00
872201c886 ssb: Support publishing private messages from the command-line. #89 2025-01-08 20:16:17 -05:00
3352098284 ssb: Connections established for a one-shot sync timeout due to inactivity so that the sync eventually completes. 2025-01-07 12:48:21 -05:00
d0bbd7f24f ssb: Add a has_blob command. #89 2025-01-06 20:46:16 -05:00
7f87714b58 ssb: Add some missing padding. 2025-01-05 21:43:26 -05:00
5594bee618 ssb: Add get_identity, get_sequence, and get_profile commands. #89 2025-01-05 17:16:05 -05:00
c469ef23e6 ssb: Make the profile layout a little friendlier. 2025-01-05 15:49:57 -05:00
f6e74f2526 ssb: Try to fix profile layout yet again. Man, CSS. 2025-01-05 15:41:56 -05:00
10b6e9c537 ssb: Remove the weird option to make the server account follow you. Now that this account is admin-controlled, it's unnecessary. 2025-01-05 15:29:29 -05:00
3f27af30b7 ssb: Actually fall back to this default global setting value. 2025-01-05 15:17:41 -05:00
23db09f9b7 core: Default to loading into the ssb app. No more messing around. 2025-01-05 14:52:27 -05:00
d1b7681efc ssb: Don't show 'Loading...' forever in the ssb app when not signed in. Direct to the login page. 2025-01-05 12:52:52 -05:00
61ad405ad8 ssb: Too bright. 2025-01-04 21:38:52 -05:00
aff98110e0 ssb: Tidy up some of the more common reasons for disconnect. 2025-01-04 21:37:43 -05:00
2f36db9142 ssb: Don't display mentions for tags that are used in the text of a message. 2025-01-04 21:05:24 -05:00
aa86ee1066 cleanup: rm test.c 2025-01-04 17:12:00 -05:00
dbbcce8165 ssb: Don't store connections that aren't user-initiated. 2025-01-04 17:08:36 -05:00
1ed066ef0f ssb: Fix naked hashtag links (to the corresponding channel). 2025-01-04 13:03:58 -05:00
763f7d45d8 ssb: Prettier. 2025-01-04 12:41:04 -05:00
2328f3afb5 ssb: Ease up on excessively re-hitting the database for ebt.replicate even more. 2025-01-04 09:58:16 -05:00
2223245861 ssb: Maybe ease up on hammering the db for follows. 2025-01-03 18:17:54 -05:00
36226b01cd ssb: Manage new message handling from the new EBT code. 2025-01-03 17:04:38 -05:00
da31f9cadd cleanup: get/set sent clock is now unused. 2025-01-03 16:56:04 -05:00
9da4857066 ssb: Make the client a bit less aggressive about determining private messages every load. 2025-01-03 15:53:19 -05:00
75c71135ba ssb: No longer replicate every account we hear about. 2025-01-03 15:25:59 -05:00
0cb5025a16 core: Improve global setting grammar. 2025-01-03 14:10:27 -05:00
44d9f69434 ssb: Refactoring EBT implementation. I think this works not worse than before and will let me schedule message replication better in a future change. #93 2025-01-03 13:59:25 -05:00
3f343b283b ssb: Delete one more redundant global setting accessor. 2025-01-03 08:41:13 -05:00
03a28fc3c5 update: CodeMirror. 2025-01-03 08:19:41 -05:00
3513619221 ssb: Reduce message margins. 2025-01-02 21:16:55 -05:00
0c9f5769d3 build: Trying to fix flatpak build for some reason. 2025-01-02 17:45:27 -05:00
587a666ab6 build: Needed out/ earlier for ssl-local. 2025-01-02 17:40:29 -05:00
f26deea508 build: mkdir out/openssl-local. 2025-01-02 17:35:49 -05:00
b8e19040b5 ssb: Fiddling with render of encrypted messages. 2025-01-02 16:11:04 -05:00
7d9e0f4080 macos: Fix build. 2025-01-02 14:20:58 -05:00
16ce7fbc7b ssb: Fix the message encrypted icon placement. 2025-01-02 13:55:47 -05:00
639fce376a ssb: More uv_async_send paranoia still. #96 2025-01-02 13:01:09 -05:00
3cdbac5c22 build: Archive the windows .exe with data. 2025-01-02 13:00:42 -05:00
3dcafdf403 ssb: More uv_async_send paranoia. #96 2025-01-02 12:40:11 -05:00
cd2fe9f8d9 ssb: Fix a crash on Windows when we would call uv_async_send on a handle that had already been closed. Various other cleanup and improvements along the journey. #96 2025-01-02 12:35:58 -05:00
fd40596ce7 ssb: Every now and then I load in Chrome and see everywhere I used overflow: scroll when I wanted overflow: auto. 2025-01-02 08:58:10 -05:00
7ecda69703 ssb: tags never got an updated CSS treatment. 2025-01-02 08:49:30 -05:00
a3b76cd5c2 core: Let's try getting crash callstacks on win32 with a vectored exception handler. 2025-01-02 08:32:18 -05:00
54df862998 ssb: Continuing to untangle message CSS. 2025-01-01 16:44:16 -05:00
301b7a4911 ssb: Trying to untangle some message formatting ugliness. First step: some minor refactoring. 2025-01-01 15:45:11 -05:00
e0a048abe6 follow: This app had never been updated since jsonb, whoops. #94 2025-01-01 15:28:19 -05:00
671e3e19ff ssb: Try to stop dates from wrapping into a vertical line of single characters. 2024-12-31 08:39:02 -05:00
0c394c2e61 ssb: Trying to keep things CSS-ing off the screen. 2024-12-30 07:13:49 -05:00
4ecbb5234c ssb: Tweaking profile card CSS. 2024-12-29 15:51:51 -05:00
98f1700049 ssb: Fiddling with message card and compose CSS some more. 2024-12-29 15:42:12 -05:00
2f0b4a0187 ssb: Choose an unread notification that is a bit mire color-agnostic. 2024-12-29 15:15:28 -05:00
f66c6ed0c3 ssb: Fiddle with the placement of the hamburger menu, and fix the tf-compose placeholder text. 2024-12-29 15:11:14 -05:00
5d9785ac2d ssb: Why did this vertical alignment change? I will never know, but I can poke it back. 2024-12-29 14:59:12 -05:00
bb97a8cccc ssb: Show connections in the sidebar. Fiddle with tf-user CSS to make it fit. 2024-12-29 14:54:29 -05:00
571cf5b5b8 ssb: Color scheme is determined by day/hour/second. Couldn't help it. 2024-12-29 13:55:48 -05:00
1974ed1c03 ssb: We don't have to wait for channel status to finish load. 2024-12-29 13:41:57 -05:00
98275f7c87 cleanup: Remove a debug print. 2024-12-29 13:34:51 -05:00
eca8726909 ssb: Load and show new messages as they arrive. 2024-12-29 13:32:37 -05:00
baf125c450 ssb: Trying to get the sidebar to behave better. Fighting CSS. 2024-12-29 12:44:42 -05:00
efcc710d91 ssb: Let's assume we read our own messages. 2024-12-28 21:31:24 -05:00
5980ee4c86 cleanup: Unneeded #include. 2024-12-28 21:13:53 -05:00
db9b7a22c2 core: Report the c-ares version. 2024-12-28 20:38:07 -05:00
5e24d4f322 build: Support Xcode 16.2 on Linux, including cross-compiling OpenSSL. 2024-12-27 21:32:33 -05:00
2dd32cdce2 ssb: Tweak idle scheduling even more, still. Fixes -t=bench. 2024-12-27 15:51:33 -05:00
9cddd93dad ssb: Don't schedule duplicate history stream requests for the same account. Changes how we schedule idle work. Let's see if this is better. 2024-12-27 15:02:52 -05:00
4127898655 ssb: Avoid more work on shutdown. 2024-12-27 14:27:52 -05:00
45d48483d0 ssb: Avoid scheduling idle work while shutting down, so that we shut down sooner. 2024-12-27 14:03:14 -05:00
852c25296a ssb: Better errors for failing to decrypt private messages. 2024-12-27 13:38:09 -05:00
aea631138e ssb: Fix private messages starting with unread status when there are none. 2024-12-27 13:25:40 -05:00
683fdbb02a ssb: Fix channel status not updating reliably. 2024-12-27 13:23:29 -05:00
c3bbab35e2 ssb: Fix global settings defaults. 2024-12-27 13:16:11 -05:00
ba8941046e ssb: Consolidate some redundant connection code. 2024-12-27 12:27:54 -05:00
d202f4e00d auth: Provide some feedback about valid account names. #92 2024-12-27 11:39:38 -05:00
42da5d8d32 ssb: Experimenting with generating the w3 css theme colors. 2024-12-26 22:24:52 -05:00
5af3533598 tests: Clean up some warnings by avoiding in-memory databases. I never got that working well, and it's not representative of actual operation. 2024-12-26 20:17:17 -05:00
7843168fad ssb: Hook up some more disconnect messaging. 2024-12-26 20:12:04 -05:00
8f51eb63b0 ssb: More experimenting with the unread status strategy. 2024-12-26 19:36:04 -05:00
855f5f7af4 ssb: Before destroying a connection, show a message on why it is going away in the UI. 2024-12-24 17:23:22 -05:00
c85dd2655c ssb: Strip out the old disconnection debug information. 2024-12-24 16:44:52 -05:00
fb0e4060cd ssb: Instrument some more callbacks for hitches. 2024-12-24 16:33:08 -05:00
707b4990a6 build: Not all the toolchains support -Oz. Oh well. 2024-12-24 15:01:09 -05:00
9c8b922069 build: Use all the tricks to make release smaller on all the platforms. 2024-12-24 14:47:33 -05:00
d4b421421d ssb: prettier. 2024-12-24 14:22:24 -05:00
58e9646fa6 ssb: Populate reply information in posts. 2024-12-24 13:09:27 -05:00
500f172561 ssb: Double down on a loading indicator. 2024-12-24 12:45:25 -05:00
68f6c90ea4 ssb: Get saving the about cache off of the main load path. 2024-12-24 12:05:31 -05:00
41e91f2922 ssb: Consolidate global settings helpers. 2024-12-24 11:16:52 -05:00
999117cfeb clean: Remove a file I sloppily added. 2024-12-24 10:45:47 -05:00
6185df512f build: Add help for armdebug/release, and fix some make help alignment. 2024-12-24 10:39:11 -05:00
0cbf66c007 build: Let's try to artifact the x86_64 + ARM linux executables. 2024-12-24 10:31:09 -05:00
cd378b721d build: Support and test cross-compiling for linux-aarch64. 2024-12-24 10:01:14 -05:00
547d38d1ef ssb: Put the database in (ie, ~/.local/share/tildefriends/db.sqlite) by default. Unless it already exists in the working directory, so that nobody worries they've lost it. #91 2024-12-23 16:32:30 -05:00
dca56af5b9 build: Let's go static openssl on macos, too. 2024-12-23 14:41:31 -05:00
224442772e build: Let's try a thing. Use our own static openssl libraries built in-tree. 2024-12-23 14:22:27 -05:00
003951fdf7 ssb: Load more context for mentions. 2024-12-23 13:32:36 -05:00
d51b3da1b4 ssb: Fix channel cycling key shortcut. 2024-12-23 13:18:30 -05:00
69f4af84db ssb: Fix weird sidebar sizing. 2024-12-23 13:07:33 -05:00
771759b252 ssb: Show drafts in the sidebar. 2024-12-23 12:25:52 -05:00
20c7a71db6 ssb: Add a checkbox to reply in a new thread. #47 Also, it's crab time. I'm sorry it took me so long. 2024-12-23 12:06:32 -05:00
8475ee0985 build: Let's start work on 0.0.27. 2024-12-23 11:23:51 -05:00
f42811d3d4 build: Let's release 0.0.26. 2024-12-23 11:12:26 -05:00
c3b1832cfb update: CodeMirror. 2024-12-23 11:08:36 -05:00
eb6753afe1 ssb: prettier. 2024-12-23 11:08:27 -05:00
5051cecb84 ssb: Make the emoji picker behave a little better, still. 2024-12-23 10:28:12 -05:00
cd03ede358 ssb: Work in progress trying to get the emoji picker in line with some of the other modal dialogs. 2024-12-22 14:45:16 -05:00
6563f8c738 ssb: Avoid unqualified emojis. I noticed the red heart was missing ever since I reprocessed the list. 2024-12-22 14:19:28 -05:00
e5279b4827 ssb: Show unread status on all message types. 2024-12-22 13:41:03 -05:00
79ff505963 ssb: Fix various channel / unread status / show new messages bugs. 2024-12-22 13:16:56 -05:00
8a67eba5fc ssb: Add a store_blob command. #89 2024-12-22 10:41:58 -05:00
6609a5f340 core: Length of undefined is 0. It's fine. Quiet some errors. 2024-12-18 20:54:13 -05:00
d9972cb349 tests: Work around an intermittent -t=auto failure. The 'Edit Profile' click is getting lost as things rapidly update? I haven't ever seen it as a human clicking. 2024-12-18 20:09:50 -05:00
28d2539432 ssb: A first pass at showing private messages next to channels. #84 2024-12-18 20:03:53 -05:00
f28386b71f ssb: Off by one on the unread line. 2024-12-18 12:46:02 -05:00
53717076f5 ssb: Fix some unread marker issues. 2024-12-18 12:43:25 -05:00
a9aa928629 tests: Prefer tf_printf. 2024-12-17 20:41:27 -05:00
8df121148d update: c-ares 1.34.4. 2024-12-15 08:33:38 -05:00
5e23c32ae8 build: Fix a potential null dereference? 2024-12-15 07:53:24 -05:00
9c0f6481c0 ssb: Try to go easier on the main thread, still. 2024-12-14 21:36:33 -05:00
68ae45dd58 ssb: Prevent -t=bench from stalling. 2024-12-11 20:53:25 -05:00
3091747438 ssb: prettier. 2024-12-11 20:35:32 -05:00
2f266b8dd4 ssb: Attempt to request more feeds as more contact messages come in. #83 2024-12-11 20:26:28 -05:00
ee20b87ee2 ssb: Alt+up/down to cycle through channels. 2024-12-11 12:53:04 -05:00
83e025d0bb update: CodeMirror. 2024-12-11 12:41:42 -05:00
5115c6e217 ssb: Fix an instance of channels being stuck unread. 2024-12-10 21:09:55 -05:00
76f6a94de5 ssb: Fix replication hops usage. Thanks @Cashew. 2024-12-10 19:18:01 -05:00
954830be18 ssb: Allow encrypting/decrypting with the server identity as an admin. 2024-12-10 12:43:07 -05:00
ea70299a45 update: sqlite 3.47.2. 2024-12-08 16:47:21 -05:00
88da071ed6 ssb: We can load more messages by author, now. 2024-12-08 09:40:02 -05:00
1dbf162a71 ssb: Bring back the updating date while loading. 2024-12-07 14:58:01 -05:00
1c0964753b ssb: Correctness around loading messages by time range. 2024-12-07 14:25:19 -05:00
daa1c7f577 ssb: Don't miss contact messages that aren't followed by non-follow messages. 2024-12-07 14:08:53 -05:00
854416ceb2 ssb: Make the depth arg to ssb.following() match the docs. 2024-12-07 11:28:33 -05:00
2230351e3e ssb: Show the load more button for mentions. 2024-12-07 10:38:34 -05:00
7da3244da2 ssb: prettier. 2024-12-05 20:47:02 -05:00
bfeb0c2988 update: prettier. 2024-12-05 20:46:23 -05:00
d4e75c1dec ssb: Move mentions into the channels sidebar. 2024-12-05 20:45:20 -05:00
405bddcde0 ssb: Make the tab bar stay on top of the content. Weird, the random things that were showing up on top. 2024-12-04 21:23:17 -05:00
8a27c45ab1 ssb: An experiment in including hashtag mentions in channel content. Also sort the channel list like I thought I already did. 2024-12-04 20:50:46 -05:00
10b15896b3 ssb: Fix the loading cancel button. 2024-12-04 20:28:57 -05:00
0e97bbe37c android: Fix some crashes, callstacks, and warnings I'm seeing in the logs. 2024-12-04 20:05:50 -05:00
e0d7e90894 ssb: Add an overlay for the sidebar so that it can be closed by tapping back on the content. 2024-12-03 19:40:08 -05:00
5d13f6aab6 wiki: Back to latest commonmark built as mjs. 2024-12-02 18:45:23 -05:00
1ebfbbe89e wiki: Go back to the last version that worked. 2024-12-02 17:57:08 -05:00
91ad43fdfc ssb: A more plausibly correct way to load new messages correctly. 2024-12-01 18:20:57 -05:00
6fe6fc180d ssb: New theme, better load, remove debug prints. 2024-12-01 16:27:59 -05:00
d84d0bec38 ssb: This index help channel status load faster. 2024-12-01 16:26:40 -05:00
7e7b1c6ee1 ssb: Make #hashtags direct to channels. 2024-12-01 15:32:35 -05:00
effb354d1b ssb: Working toward a more sensible unread indication and user interface for setting read/unread. 2024-12-01 12:56:31 -05:00
ba7d1ad35f core: This case is not a good cause to crash. 2024-12-01 09:48:15 -05:00
3ca2b19502 ssb: Canceling loads, more mobile-friendly sidebar, and respond to channel subscription changes. 2024-11-30 17:49:36 -05:00
8e0d91dcf5 security: Setting global settings requires approval. 2024-11-30 16:58:48 -05:00
cd2c2587ae ssb: Merge in the new very work in progress channels interface. 2024-11-30 15:05:14 -05:00
53044696ba ssb: Just request blobs for all references from about messages for now. Much faster than narrowing down to the most recent images. 2024-11-29 10:28:16 -05:00
6d6927213f Revert "ssb: Try harder to replicate profile images, even if they were set before our blob replication cutoff."
This reverts commit 7f4e2617ee.
2024-11-29 08:54:54 -05:00
be1b5bce4f test: Simplify my selection helper syntax a bit. 2024-11-28 19:58:51 -05:00
4b4fd0735b test: Make -t auto a bit more resilient by hoisting all the retries into one place that makes sense to me. 2024-11-28 17:51:22 -05:00
c565b2a31f bot: Make sure release messages get through. 2024-11-28 11:11:25 -05:00
55f2261905 prettier: Update the copy of prettier used in the editor. 2024-11-28 11:00:59 -05:00
51912f2b83 ssb: Update emojis.json, and add a script to regenerate it. 2024-11-28 09:16:07 -05:00
7f4e2617ee ssb: Try harder to replicate profile images, even if they were set before our blob replication cutoff. 2024-11-27 21:42:54 -05:00
960a385202 update: CodeMirror. 2024-11-27 15:20:32 -05:00
21f48d3485 build: Let's start work on 0.0.26. 2024-11-27 12:24:42 -05:00
7f9605e55f nix: Update for 0.0.25. 2024-11-27 12:23:52 -05:00
cc409dc3f7 build: Let's build 0.0.25. 2024-11-27 12:10:17 -05:00
af6091760c ssb+docs: prettier. 2024-11-27 12:07:00 -05:00
e1d93c003c docs: Update docs from wiki. 2024-11-27 10:13:16 -05:00
ff9dd2dd03 haiku: Disable a bit of a test that is giving me an SQLITE_PROTOCOL error only on Haiku. 2024-11-27 15:05:23 -05:00
7a306bb3d2 build: Fix a regex warning. 2024-11-27 14:36:50 -05:00
7ffc148358 build: I wanted to get the binary out of the makefile to appease F-Droid, and one thing lead to another. 2024-11-27 09:28:14 -05:00
50fef2edfa build: Fix on OpenBSD. TIL awk. 2024-11-27 09:06:02 -05:00
aa40084010 build: Redid this thing in sed to make it work on more platforms. 2024-11-26 22:55:01 -05:00
740d788c7c storage: Show accounts with the most follows, for help pruning accounts. 2024-11-26 16:25:15 -05:00
4c2fa2c1b3 storage: Show totals, too. 2024-11-26 16:05:28 -05:00
4350c7b7a9 storage: Add a little app to show something about feed sizes. 2024-11-26 15:59:02 -05:00
595f14d98d docs: Update some docs links to the gitea wiki and generally refresh the README.md slightly. 2024-11-26 11:42:33 -05:00
2e95d6ea63 docs: Add the Tilde Friends gitea wiki as a git submodule to replace the docs directory. Maybe I will succeed at doing something with it if it is more web-facing. 2024-11-26 11:30:57 -05:00
0da6abeb98 ssb: We can trace request names these days. 2024-11-26 11:14:30 -05:00
e4e050e8e7 ssb: Fix some message link encoding. 2024-11-26 08:42:51 -05:00
5bc082b75e build: Prepare a changelog for the next release. 2024-11-25 21:12:00 -05:00
beedbd7646 build: Attempt to self-document the makefile. 2024-11-25 21:11:36 -05:00
507b069ffe cleanup: prettier. 2024-11-25 20:05:40 -05:00
71444b0427 ssb: Shutdown fixes. 2024-11-25 17:14:16 -05:00
a08bba438e update: sqlite 3.47.1. 2024-11-25 13:16:20 -05:00
df1e6711af ssb: Add a setting to periodically clean up un-followed feeds. #80 2024-11-25 12:53:28 -05:00
f6d4e934e3 ssb: Adjust the follow/hops policies. Replication defaults to 2 hops, counted in the same way as the docs, and is configurable. #79 2024-11-25 11:20:01 -05:00
d5bd4c6735 test: Use -t=auto to update some screenshots. 2024-11-25 09:53:11 -05:00
eb12ba6ed2 test: Use -t=auto to generate some screenshots, detect -t=auto failure more reliably, exercise setting the initial profile, and fix various bugs that fell out. 2024-11-25 09:38:49 -05:00
6e83c08535 ssb: Add an index that helps me calculate feed size about 8x faster. 2024-11-23 17:50:32 -05:00
b6bfdec48d ssb: Move the refresh/sync button to the navigation bar as an experiment. 2024-11-23 16:49:33 -05:00
f9ec796291 bot: Give more information about new issues. 2024-11-23 13:50:23 -05:00
3beb1d0683 update: CodeMirror. 2024-11-20 20:26:30 -05:00
8836c7f0ca cleanup: prettier + format. 2024-11-20 20:24:58 -05:00
ef5ce1d6e1 web: Show the little graphs if the Tilde Friends verison thingy is expanded. I want to be able to optionally see these on mobile. 2024-11-20 20:06:33 -05:00
0ea1213139 ssb: Use the same refresh character in two places. 2024-11-20 19:46:41 -05:00
51fe372f60 ssb: Stick the stylesheet on document.body. No more fonts changing when various dialogs show up. 2024-11-20 19:44:27 -05:00
eb8f9f8936 web: Add some meta tags to make it show up better in search engines / embeds maybe. #43 2024-11-20 19:24:13 -05:00
afc1524874 bot: Scrape my changes better from gitea RSS. 2024-11-18 22:58:51 -05:00
fbb975625c update: speedscope 1.21.0. 2024-11-17 19:07:27 -05:00
53e75d8209 cleanup: Consolidate countof macros. 2024-11-13 20:22:42 -05:00
5bdf970c10 ssb: Don't list broadcasts for identities to which we are already connected. 2024-11-13 19:23:04 -05:00
50089f72c6 ssb: We can show what state a connection is in. 2024-11-13 19:15:59 -05:00
62e15e0208 update: CodeMirror. 2024-11-13 19:03:01 -05:00
3d8b02a7f3 ssb+issues+core: prettier 2024-11-13 18:58:09 -05:00
20701d9cf1 ssb: Missed a few connection failures for context. 2024-11-13 18:44:14 -05:00
fa94442eb2 ssb: Populate more connection errors with context. 2024-11-13 18:35:17 -05:00
68ff77e172 ssb: Hook up connect error messages more thoroughly. 2024-11-13 18:20:14 -05:00
102e9be3a8 update: c-ares 1.34.3. 2024-11-13 17:54:10 -05:00
92bf01a183 ssb+issues: Fix missing dependencies of my commonmarkjs extensions. 2024-11-12 21:47:15 -05:00
559504ae29 security: Use commonmarkjs with {safe: true} as intended. 2024-11-12 20:43:03 -05:00
9b00b41a1e ssb: Connection result preliminary hookup to ui, and fix some fallout. 2024-11-11 22:24:54 -05:00
b1f6ad17e1 ssb: Pass around reasons for failing to connect. This will help get that information to the ui when I finish hooking it up. 2024-11-11 22:12:41 -05:00
e7979fe9db test: Add more retries until selenium cooperates. 2024-11-11 21:06:04 -05:00
7a276adbbc ssb: Size blob ID buffers appropriately. 2024-11-11 21:05:29 -05:00
db4997fdc4 bot: Remove the header. 2024-11-11 08:19:46 -05:00
44ebb841f0 bot: Fix empty buttfeed posts, and use requested RSS feed for Habitat. 2024-11-10 19:30:36 -05:00
09ae4e2096 ssb: Handle the inevitable %25 in a document hash better? 2024-11-09 18:04:58 -05:00
0b46efe4ea test: Hack around an intermitted -t=auto failure. 2024-11-09 15:09:08 -05:00
f1dda43e66 ui: Click off the identity menu to close it. 2024-11-09 14:52:54 -05:00
ce483138d7 ssb: Fighting with profile CSS. 2024-11-09 14:41:40 -05:00
73cc39226d bot: Some fixes to get SecureScuttlebuttFeed running. 2024-11-09 09:24:13 -05:00
57257f63dd bot: Add a little script to post about recent development activity from a handful of RSS feeds I've gathered. 2024-11-09 09:01:34 -05:00
88b25790e8 ssb: Remove some pointless logging. 2024-11-06 20:56:10 -05:00
e01defc4aa update: CodeMirror. 2024-11-06 20:49:03 -05:00
cb50c43e93 build: We all cope in our own ways. 2024-11-06 20:42:49 -05:00
5908d15f91 js: Move default global settings to C. 2024-11-06 20:29:48 -05:00
f66cfaec12 http: Fix some caching issues. 2024-11-06 12:41:54 -05:00
259f92c53b http: Populate query and headers for handler.js like we used to. 2024-11-04 21:46:38 -05:00
a84f850e91 http: Bring back handler.js support, mostly. Partly in C, this time. 2024-11-03 21:09:57 -05:00
5a765e6f07 js: Also unused. 2024-11-03 07:44:31 -05:00
791889c659 js: Remove some unused code. 2024-11-03 07:38:52 -05:00
5da63faf1f http+js: Move app blob handling from JS to C. handler.js support has been temporarily removed. 2024-11-02 21:37:14 -04:00
30d108fc35 http: URL pattern matcher fixes. 2024-11-02 20:10:55 -04:00
a09fefab5e http: Add a more expressive but still nowhere near regex URL pattern matcher. 2024-11-02 19:22:04 -04:00
f74ca1c236 test: Remove some debug prints, whoops. 2024-11-02 16:32:05 -04:00
30e027092b test: Cover more ways to request apps and files. 2024-11-02 15:43:03 -04:00
fd4ac7c9b9 test: Test some expectes results from http requests to various paths. 2024-11-02 14:11:54 -04:00
4482049b94 log: Show the version number in the welcome banner. 2024-11-02 08:45:47 -04:00
5839380437 update: CodeMirror to latest. 2024-11-02 08:45:47 -04:00
2152470fdc update: libbacktrace to latest. 2024-11-02 08:45:47 -04:00
93b2a81495 test: Fix -t=publish on haiku. 2024-11-01 18:55:27 -04:00
e139e952c0 ssb: Fix some spacing in the permissions dialog. 2024-11-01 18:18:16 -04:00
cf1c57ccb8 build: Let's start work on 0.0.25. 2024-11-01 18:01:10 -04:00
f7a2138488 nix: Update version to 0.0.24. 2024-10-30 19:40:12 -04:00
9614d03bef ssb: Fix a timer leak I observed trying to wrap up 0.0.24. 2024-10-30 19:32:24 -04:00
32a335c676 test: Retry harder. 2024-10-30 19:32:05 -04:00
06e27fc1e0 docs: Update the 0.0.24 changelog. 2024-10-30 19:31:33 -04:00
1f40e8dcd9 build: Let's build 0.0.24. 2024-10-30 12:56:20 -04:00
77ff8cef1f db: Fix the db app, and show a message instead of an ugly error when you're not signed in. 2024-10-29 20:19:50 -04:00
ef844fbccb build: Oh, you can generate a .flatpak file, if that's your thing. 2024-10-27 18:50:07 -04:00
070dc5a4c0 build: flatpak filesystem access tweaks. 2024-10-27 14:37:37 -04:00
177ef1cdcc build: A flatpak experiment. I still don't get it. 2024-10-27 14:31:11 -04:00
4b1ebf02e1 js: Remove a stale /save reference, and exercise re-saving an app in the test. 2024-10-27 14:05:20 -04:00
863e50203e js: Move /save to C. 2024-10-27 13:42:56 -04:00
01b8c209de core: Testing a theory to encourage clean shutdowns. 2024-10-25 15:34:43 -04:00
30e92f2bc1 js: Fix typo in /delete. 2024-10-25 15:34:01 -04:00
02accabb4a js: Oh yeah, administrators can delete core apps still. 2024-10-25 15:20:54 -04:00
fa00a41fe0 js: Move app delete to C. 2024-10-25 13:58:06 -04:00
2e66666bdf ssb: Indicate which connections are one-shot / sync now connections. 2024-10-25 12:53:45 -04:00
4fe3c9a751 test: Verify that deleting apps actually does something. 2024-10-25 12:34:22 -04:00
0a35e14590 js: Fix database.getall(). 2024-10-23 21:50:34 -04:00
e979c176e3 test: Exercise nominally creating and deleting an app. 2024-10-23 18:48:42 -04:00
a0d9c3dc29 js: Move the global 404 response to C. 2024-10-23 18:27:36 -04:00
efcb68351c docs: Reminding myself how to make a release. 2024-10-23 18:06:56 -04:00
94e8bf2e1c test: Add some nominal testing for the new publish command. 2024-10-23 15:57:44 -04:00
82d1a294a6 ssb: prettier. 2024-10-23 15:38:49 -04:00
de20274589 ssb: Add a publish command that can be used to publish messages from the command-line. 2024-10-23 15:38:07 -04:00
2f193e64c8 ssb: Show muxrpc command names when possible in verbose logging. 2024-10-23 15:37:28 -04:00
86751362cb ssb: Indicate which muxrpc sends failed, and use that to fix some replication nonsense and log noise. 2024-10-23 14:13:55 -04:00
4118323631 build: Fix some cflags not making it to libsodium. Disable the libsodium -flto warning a more different way. 2024-10-23 12:02:41 -04:00
0d134f7f10 update: CodeMirror to latest. 2024-10-23 11:34:30 -04:00
409724cfcd update: OpenSSL 3.4.0. 2024-10-23 11:32:45 -04:00
799a33be40 update: libbacktrace to latest. 2024-10-23 11:20:23 -04:00
2fa9c66495 update: libuv 1.49.2. 2024-10-23 11:05:15 -04:00
ad818a8e7e update: sqlite 3.47.0. 2024-10-23 11:01:42 -04:00
581f72b3f8 ssb: Disallow rich text paste on Firefox. Didn't realize it doesn't support contenteditable='plaintext-only'. 2024-10-17 12:41:50 -04:00
1dd7e4347c js: Kill setGlobalSettings. 2024-10-16 21:02:48 -04:00
36cc9398c7 js: Move storePermission to C. 2024-10-16 20:36:53 -04:00
68817feeec js: Kill getSessionProcessBlob. 2024-10-16 19:50:31 -04:00
97661e2ca2 http: Fix some headers. 2024-10-16 19:26:26 -04:00
72def5ae6d js: Move /view to C. 2024-10-16 19:16:45 -04:00
e638b155a1 js: Kill gGlobalSettings. Decouples things a bit. 2024-10-16 18:11:08 -04:00
32db18b0d6 ssb: Close the reactions list dialog by clicking off of it. 2024-10-16 12:35:10 -04:00
b653a5250d build: Appease gcc 14. 2024-10-15 12:41:47 -04:00
30329f7cad ssb: No duplicate connections, even with tunnels. This is confusing. 2024-10-14 12:44:21 -04:00
29a1478c86 ssb: No duplicate tunnels. 2024-10-13 18:13:31 -04:00
c882bf31ec docs: grammar 2024-10-13 14:58:21 -04:00
17ccb8f083 update: libuv 1.49.1. 2024-10-13 14:46:24 -04:00
0e7d2a8b0e ssb: The identity app now lets you switch out the server identity if you are an administrator. 2024-10-13 14:40:14 -04:00
3743543ef8 welcome: prettier 2024-10-13 14:19:55 -04:00
700dd7b45a build: Appease OpenBSD. 2024-10-11 19:04:49 -04:00
c2eb73fd8a update: c-ares 1.34.1. 2024-10-11 18:25:09 -04:00
e1f4f7f95b ssb: Don't stretch profile images when fitting into a circle. I swear I did this ages ago. 2024-10-10 21:41:34 -04:00
37401409c6 ios: Include data in the app. How did this ever work? 2024-10-10 21:32:35 -04:00
b282631cd5 ios: Mobile provision junk. 2024-10-10 20:43:13 -04:00
9618d3b3f3 welcome: Link to the open testing Google Play build. 2024-10-09 12:20:37 -04:00
c9f997d121 update: commonmark 0.31.2. 2024-10-08 20:40:29 -04:00
f1dee2a089 ssb: Why would I not log the host of failed DNS requests? 2024-10-08 20:16:04 -04:00
8273277c91 editor: Fix in-browser prettification of html files. 2024-10-08 20:15:04 -04:00
9758844da3 editor: Fix visible whitespace toggle. 2024-10-08 19:56:58 -04:00
e41c7fbbc7 welcome: prettier 2024-10-08 19:41:55 -04:00
24db8a5a49 welcome: Slight wording updates. 2024-10-08 19:28:23 -04:00
36e82b9873 ssb: Sync now connects to room members one level deep. 2024-10-08 19:10:33 -04:00
8a32f2b8b1 Latest CodeMirror. 2024-10-08 12:44:49 -04:00
277830bc3c format: Sort includes. Yes, please. 2024-10-08 12:19:44 -04:00
a8fa969114 Lit 3.2.1. 2024-10-08 12:18:37 -04:00
c3f3dced68 docs: I figured out how to disable the gitea release zips lacking submodules (DISABLE_DOWNLOAD_SOURCE_ARCHIVES), so remove the caveat about them from the docs. 2024-10-06 12:16:30 -04:00
85fce59c0c ssb: Sync on demand fixes. Avoid keeping message streams live in this mode. 2024-10-06 11:50:49 -04:00
8a6147d512 ssb: Beginnings of a "sync now" mode for mobile. 2024-10-06 11:14:37 -04:00
e799b256b2 ssb: Even more muxrpc activity status fixes. 2024-10-05 21:00:50 -04:00
b222dc0ca8 Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-10-05 20:44:17 -04:00
c52c6b04ca ssb: muxrpc activity status fixes. 2024-10-05 20:44:01 -04:00
b95eed46bb ssb: Fix a request leak in tunnel.connect. 2024-10-04 22:05:17 -04:00
7c36a543da ssb: Fix a leaked request and a shutdown error. 2024-10-04 12:39:39 -04:00
90e000c18e ssb: Fix activity indication of muxrpc requests expiring. 2024-10-03 12:41:45 -04:00
1bb9d737d8 ssb: Show activity for each muxrpc request. 2024-10-02 20:43:51 -04:00
9a5db2ec51 appimage: Put update information in the appimage. 2024-10-02 20:03:44 -04:00
dbed29a044 Update prettier. And run it some more. 2024-10-02 18:49:17 -04:00
681859531c muxrpc: Simplifying comparing RPC names. This has just always bugged me. 2024-10-02 18:46:12 -04:00
8e1ad6b16a js: Unused external. 2024-10-02 18:12:28 -04:00
5448f1ba2d Update CodeMirror. 2024-10-02 18:00:40 -04:00
e43da4e1a3 welcome: Better OpenSSL link. 2024-10-02 17:56:36 -04:00
eaa9da49cc welcome: F-Droid/AppImage links. 2024-10-02 17:55:01 -04:00
40873b529c build: Suppress a warning in libuv on arm. 2024-09-30 12:37:41 -04:00
8cc4c19d73 Prettier and generated files I've missed. 2024-09-30 12:15:27 -04:00
bb9c18faf1 Some missing log newlines. 2024-09-30 12:13:57 -04:00
fabdfb76b9 android: readParcelable compatibility. 2024-09-29 08:18:46 -04:00
bce263a928 android: Use FileObserver, which is actually compatible with api level 24 which we claim to support. 2024-09-29 00:17:38 -04:00
195920e476 android: Avoid a ClosedWatchServiceException. 2024-09-28 23:25:28 -04:00
a821d895c5 docs: Give working advice on how to get the tree and dependencies. 2024-09-28 07:11:47 -04:00
ab1b6ec27d build: Add a dependency off appimagetool?? 2024-09-27 22:10:01 -04:00
6dc099809f build: This creates a working AppImage. 2024-09-27 21:19:18 -04:00
03c8b75994 Let's start work on 0.0.24. 2024-09-25 20:26:57 -04:00
38887452ad nix => 0.0.23. 2024-09-25 20:20:14 -04:00
7512edad59 build: I forgot to build the .xz as part of dist. 2024-09-25 20:02:45 -04:00
944c895bcd Generated 0.0.23 files. Oops. 2024-09-25 19:55:12 -04:00
e7d87ee8e2 I think that worked. Let's build 0.0.23. 2024-09-25 19:49:52 -04:00
cfdbd10635 ci: Oh, we can not require fuse? 2024-09-25 19:45:05 -04:00
d3a2d8733f ci: Maybe we don't need to manually load it? 2024-09-25 19:37:17 -04:00
a7e623d817 ci: apt install fuse3? 2024-09-25 19:35:47 -04:00
3f0c37cea4 ci: modprobe harder. 2024-09-25 19:33:30 -04:00
2c96a6d22a ci: modprobe fuse? Disable things to get this going faster until it works. 2024-09-25 19:30:33 -04:00
57b4214a72 AppImages require FUSE to run. 2024-09-25 19:10:13 -04:00
433b3d39d9 ci: Build the appimage, for real.nofoolin. 2024-09-25 18:50:06 -04:00
26441ed45c Let's try to artifact the appimage. 2024-09-25 12:49:32 -04:00
92cd38c2a0 Change notes. 2024-09-25 12:33:06 -04:00
3b5a06794f libuv 1.49.0. 2024-09-25 12:11:17 -04:00
d104409272 Prevent votes from overflowing. 2024-09-23 12:43:48 -04:00
e5f58c2898 Produce user info for the server identity for admin users. 2024-09-19 12:22:38 -04:00
f83863ef01 This doc was ancient, so paste some of the latest from the wiki in. It's something. 2024-09-18 20:16:35 -04:00
837f069cf5 Update CodeMirror. 2024-09-18 20:16:35 -04:00
9f057dc29a Add F-Droid and c-ares to the welcome page. 2024-09-18 20:01:36 -04:00
c4904f176c Distinguish the server identity in the identity app. 2024-09-18 19:09:44 -04:00
d3a5aba703 A brave new world where admin users can use the server identity. 2024-09-17 12:47:28 -04:00
9e283e427c Fix viewing apps by blob ID URL. 2024-09-16 12:45:06 -04:00
133ba31d66 c-ares 1.33.1. 2024-09-15 08:57:22 -04:00
241a65a92a sus. Disable a warning in c-ares during ltcg with gcc 13 on Haiku. 2024-09-15 12:52:28 -04:00
0b54795bab Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-09-11 20:28:06 -04:00
6208193de5 Fix plumbing for replies on the search tab. 2024-09-11 20:25:55 -04:00
c53321532f Update CodeMirror. 2024-09-11 20:18:57 -04:00
34f25e3e06 How did I not have an index on type? Wow. 2024-09-11 19:53:07 -04:00
c46244366e I don't know what GHES is, but it says to use this version, so sure. 2024-09-11 19:52:43 -04:00
6518af04fc It finally built. Now let's upload some artifacts. 2024-09-11 19:33:37 -04:00
bf137ff1f7 Seriously? More volume mount config. 2024-09-11 19:00:30 -04:00
1877955b62 Syntax? 2024-09-11 18:54:39 -04:00
50d0875de2 Mount volumes across another container? 2024-09-11 18:49:06 -04:00
bf151e6b7d I am confused. 2024-09-11 18:41:55 -04:00
82893402d0 Maybe we can sign here? 2024-09-10 21:54:36 -04:00
8049102787 More silent OpenSSL build for mingw. 2024-09-10 21:19:15 -04:00
f42cc3d9fd Find the Android SDKs you just installed. 2024-09-10 21:01:20 -04:00
5f9a5208db Appease the sdkmanager version number whatever. 2024-09-10 20:34:25 -04:00
6df506d238 Spelling. 2024-09-10 20:25:51 -04:00
2bd3354256 yaml better?? 2024-09-10 20:22:06 -04:00
b55aaa1d18 Maybe CI android?? 2024-09-10 20:20:40 -04:00
34e19505bd No longer need this test. 2024-09-09 15:57:43 -04:00
6e06ec0904 Clean up connections that don't handshake in time. 2024-09-09 15:25:10 -04:00
a5814074fe OpenSSL 3.3.2. 2024-09-04 20:24:32 -04:00
d7479df5a2 Latest CodeMirror. 2024-09-04 20:11:28 -04:00
34508aa0ae dist slightly more in parallel. Exclude dotfiles from data.zip. 2024-09-04 20:07:26 -04:00
ae096b2c9c Try harder to make webview localStorage work on different versions. I suspect that's what #73 is about. 2024-09-04 12:50:12 -04:00
95d036e34a Build an AppImage. Why not? 2024-08-28 20:55:52 -04:00
4af5e8ec42 I guess prettier says this, now. 2024-08-28 20:24:26 -04:00
2a5f71bd5d This now lives in the fdroiddata repository. 2024-08-28 19:59:49 -04:00
97fb63dda1 Actually 0.0.23-wip. 2024-08-28 19:59:34 -04:00
87d42e3b3b 0.0.23-wip again. Let's gooooo. 2024-08-28 19:49:36 -04:00
0394129a4c nix => 0.0.22 again. 2024-08-28 19:42:31 -04:00
3c499c834b Fix stale data being saved when setting global settings. 2024-08-28 19:39:05 -04:00
17d6cc7d46 Let's try 0.0.22 again. 2024-08-28 19:20:55 -04:00
646bd7dc38 Fix changing boolean settings. 2024-08-28 19:16:19 -04:00
56e483782d Let's start work on 0.0.23. Clean out some libuv non-submodule cruft while I'm in here. 2024-08-28 19:10:16 -04:00
e1b9066b26 nix => 0.0.22. 2024-08-28 18:49:35 -04:00
7114ce2516 Let's release 0.0.22. 2024-08-28 18:40:10 -04:00
9240c6570a Changelog updates. Almost ready for a release. 2024-08-26 12:27:46 -04:00
f80a44ccd7 Title case settings names in the admin app. 2024-08-26 12:24:36 -04:00
e6f5eb244e Missing port. 2024-08-25 22:00:35 -04:00
ab62e83110 Fixed some peer ID brokenness. 2024-08-25 21:56:01 -04:00
aeefb9e536 Configure c-ares for haiku a bit better. 2024-08-25 13:48:57 -04:00
ee0efa536a Fix and assert against some more unsafe cross-thread JSContext use. 2024-08-25 13:30:46 -04:00
2523130fdc Fix some weird layout in the admin app on mobile. 2024-08-25 13:03:19 -04:00
c024777184 #buildfix 2024-08-25 12:45:42 -04:00
5951d7cd2d Kill some warnings. 2024-08-25 10:07:44 -04:00
011670c70b Pass along and use the actual port we're listening on for peers.exchange. 2024-08-25 09:50:28 -04:00
6cebd6c769 Try to be more static. 2024-08-25 09:39:05 -04:00
546ae5cbf1 Latest CodeMirror. 2024-08-24 21:57:13 -04:00
f543cc642e Clean up some error'd RPC requests. Don't send blobs.createWants if we're not replicating. 2024-08-24 10:39:47 -04:00
8ac3c5ea22 Keep c-ares initialized. Fixes android, which can't just be re-initialized. 2024-08-22 12:43:20 -04:00
63918f0680 Make blobs.has do its work off the main thread so it doesn't violate that assert, and make the test cover such things a bit better. 2024-08-21 22:55:40 -04:00
bfb3d8b8a2 Add an option to disable account registation, and fix use of a JSContext from the wrong thread along the way. 2024-08-21 20:56:21 -04:00
e38ff99607 Special treatment to make TXT record lookup work on android. 2024-08-21 20:27:43 -04:00
b0e3d922c8 libuv busy loop in uv__run_timers with -flto. Sigh. 2024-08-21 19:40:07 -04:00
a15bb8e994 Don't rely on being idle to do anything. Fixes JS job starvation on slow machines more. 2024-08-21 12:53:38 -04:00
6f487100cd Format. 2024-08-20 12:35:42 -04:00
0693a2315f Fix async job starvation if everything is running too slowly. 2024-08-20 12:26:34 -04:00
f360e886ff Make -t peer_exchange complete and test that something happened. 2024-08-19 12:29:40 -04:00
6ea08cc5dc Add the beginnings of a peers.exchange test and begin to fix fallout. 2024-08-15 12:48:24 -04:00
347c706d6f ci: undefined reference to arc4random_buf 2024-08-15 12:12:58 -04:00
5f5e6616c7 Install graphviz for building docs. 2024-08-14 21:16:31 -04:00
657bcadc7e Work-in-progress, untested, naive peer exchange. Intended to be disabled by default by a setting. 2024-08-14 21:07:16 -04:00
107666cc60 Add a setting to toggle whether replication is allowed, to be able to make a pure room, or even less, node. 2024-08-14 20:02:46 -04:00
b37669184a doxygen -u # 1.9.8 2024-08-14 20:01:21 -04:00
163a01f224 sqlite 3.46.1. 2024-08-14 19:43:57 -04:00
3d58094199 Fix some sanitizer issues, and disable LTO in debug builds to save some iteration time. 2024-08-14 19:40:20 -04:00
463951a4f1 Track/show the origin of each broadcast (discovery/room/peer exchange). 2024-08-14 19:23:01 -04:00
34804d5162 Fix android crashing in c-ares and a makefile typo. 2024-08-14 18:55:34 -04:00
3895c33915 Implement prompt() for android. #72 2024-08-14 12:45:22 -04:00
17f4eb1a56 Make it easier to copy ids from the profile view. 2024-08-11 16:26:24 -04:00
0abdffdea6 Fix OpenBSD. 2024-08-11 11:17:49 -04:00
d32999f178 Decouple DNS-based seed discovery from the broadcast timer. 2024-08-08 18:50:54 -04:00
f621feb843 Fix some builds and make the windows build actually succeed at resolving what I want. 2024-08-07 22:25:38 -04:00
8d277f029d Support using a seeds host for bootstrapping connections. 2024-08-07 21:03:39 -04:00
1788a02338 Add c-ares. These are the hoops I have to jump through to be able to provide some bootstrap nodes. 2024-08-07 20:21:39 -04:00
ba0800d16c Lit 3.2.0. 2024-08-06 12:19:10 -04:00
4008c7d8f6 Latest CodeMirror. 2024-08-06 12:18:54 -04:00
610a2e2afc Latest libbacktrace. 2024-08-06 12:18:32 -04:00
6f3715d1eb Latest libsodium stable. 2024-08-06 12:18:21 -04:00
b78ecaa814 F-Droid looks all set for now. Let's start 0.0.22. 2024-08-06 12:17:26 -04:00
e6f5399d53 Clear out timestamp and file modes on classes.dex, too. 2024-08-05 12:43:22 -04:00
0e5806cadd Re-add classes.dex to the F-Droid APK. (!) 2024-08-05 12:26:10 -04:00
68c9d4afa7 Found some docs that say the icon.png max size is 512x512. 2024-08-04 21:54:42 -04:00
f0ea38fe49 Just set SOURCE_DATE_EPOCH=1. Using the last commit time is complicated (have to rebuild OpenSSL every commit/release). This only affects a debug string that we don't expose. 2024-08-04 12:54:02 -04:00
b0332f923e Debugging a SOURCE_DATE_EPOCH thing. 2024-08-04 12:16:46 -04:00
8a76c25394 Silence some OpenSSL build output so I can see what else is going on. Also install the signed fdroid APK in dist. 2024-08-04 12:10:52 -04:00
fd96126e3e Ooh, can I just exclude OpenSSL submodules? I don't want to see those. 2024-08-04 11:49:04 -04:00
ff3fbedc18 Fix inconsistent file modes in zip. 2024-08-04 11:25:06 -04:00
8791419f8e Sort better, and actually use ndk r26d. 2024-08-04 10:21:04 -04:00
5447b247a0 Back to r26d, and pin the timezome to get SOURCE_DATE_EPOCH to work correctly. 2024-08-04 09:54:33 -04:00
aabbb10564 for fdroid: Use android ndk r27, set SOURCE_DATE_EPOCH for the android ssl build, and remove a non-determinism in AndroidManifest.xml. 2024-08-04 09:36:46 -04:00
3ccd6c9a3e I missed. 2024-08-02 22:26:01 -04:00
c290240de7 Make a release to make sure F-Droid can pick it up. 2024-08-02 22:20:18 -04:00
8e799b174b Address some fdroid zip non-determinism. 2024-08-02 21:55:00 -04:00
a9c3a93989 Add some images for F-Droid. 2024-08-02 20:37:27 -04:00
3ef8698f42 Put android:versionCode and such back in the static AndroidManifest.xml. I forgot that F-Droid needs to see it. 2024-08-02 20:37:05 -04:00
fa4e843c30 Update default.nix. Did I do it right finally? 2024-07-31 20:14:40 -04:00
9a4d11f4d9 Attempt to shrink OpenSSL on android again, ineffectively. 2024-07-31 19:58:41 -04:00
eed2b8d618 Latest CodeMirror. 2024-07-31 19:49:52 -04:00
13f02c2aca Preparing to release 0.0.21. 2024-07-31 12:50:35 -04:00
d50f8fbc8b ios: ssl fix. 2024-07-27 21:31:31 -04:00
155238a516 build: I mean -flto=auto. 2024-07-27 11:08:28 -04:00
427fcdbdca build: -flto all the things. 2024-07-25 16:02:14 -04:00
ca05d402a7 An exercise in stripping down the win32 .exe size. 2024-07-24 15:25:36 -04:00
c5a80b68ca Fixed more aab build issues. 2024-07-24 14:03:21 -04:00
c1fb15b135 ci tweaks and aab fixes. 2024-07-24 13:50:48 -04:00
4b2c131836 ci: Install doxygen for docs. 2024-07-24 13:04:52 -04:00
9ca1e69b3c Let's try to build in docker, too. 2024-07-24 12:56:27 -04:00
082d041d44 Update the android app icon / launch icon. 2024-07-24 12:50:31 -04:00
221f276c4b Simplify stats sending. 2024-07-24 12:15:05 -04:00
24cec21465 Move last remnant of static file handling from core to C. 2024-07-24 12:06:24 -04:00
9f71ec6194 Minor android cleanup. 2024-07-24 11:27:37 -04:00
bb36afc390 Use android ndk r27 (LTS) if available. 2024-07-24 11:20:35 -04:00
b53bf0ff64 Disallow rich text in the ssb compose box. 2024-07-22 14:42:37 -04:00
3ebc6f2436 Prettier. 2024-07-22 14:19:12 -04:00
2eef6778a6 Latest CodeMirror. 2024-07-20 17:13:43 -04:00
81fabec810 Latest libbacktrace. 2024-07-20 17:12:43 -04:00
dc6e7924b5 Is this how I install dependencies on the gitea runner? 2024-07-18 12:42:08 -04:00
48dec5a2c8 More submodules. 2024-07-16 22:32:26 -04:00
9b500e1da9 Now actually build something. 2024-07-16 22:30:36 -04:00
a038820112 Add the demo gitea action. 2024-07-16 22:20:45 -04:00
70a15973b6 An fdroid build config that worked locally, for me. 2024-07-16 21:45:29 -04:00
09b6a00731 Fix android build with not enough -j. 2024-07-16 20:22:07 -04:00
883c3cf0e9 Clean up this core file. 2024-07-16 19:01:20 -04:00
a46bb8183c Fix OpenBSD compile. 2024-07-14 16:59:23 -04:00
d5d5a7b012 Build a separate .apk for fdroid with its own app ID. 2024-07-14 16:18:47 -04:00
a120efdc91 May as well dist the .aab. 2024-07-10 20:52:40 -04:00
d48f4b06eb Another f-droid directory. 2024-07-10 20:42:50 -04:00
f078912736 Add some recommended fdroid metadata. 2024-07-10 19:45:04 -04:00
63b0f0dedd Fix fdroid build with OpenSSL in-tree. 2024-07-10 19:35:49 -04:00
84c22dbf5f Move to OpenSSL as a git submodule. Redundant for platforms where it's not used, but makes fdroid easier. 2024-07-10 19:25:01 -04:00
b8cd1232be Have a little category, as a treat. 2024-07-09 19:30:33 -04:00
a518ab07f4 Add a WIP .fdroid.yml that seems to actually build something. 2024-07-09 19:28:45 -04:00
9e5a1ee975 Ugg. 2024-07-09 19:21:27 -04:00
95bf3f0316 This is almost doing something. 2024-07-09 19:19:01 -04:00
d69dd513bc Another silly fdroid test. 2024-07-09 19:08:40 -04:00
525cdf571a Testing a thing for fdroid. 2024-07-07 17:14:13 -04:00
9cfe0a8804 Add a 'JavaScript disabled' message. #56 2024-07-04 14:35:53 -04:00
50b54599ef Minor cleanup. 2024-07-04 13:18:23 -04:00
ed6bef6d24 Get android running its sandbox in a seprate, isolated service process. So that we support not extracting the native code from the APK, so that we support distributing as an .aab file, so that we may one day release on the app store. 2024-07-04 13:02:39 -04:00
71268636df Steps toward following all the inconvenient, changing android rules:
* Set android:debuggable=false.
 * Call native code through JNI only.  Having a native executable on disk and exec-ing it no longer seems possible.
 * Do all the Tilde Friends things in one process, without a proper sandbox, until I can wire up a restricted service worker process.
 * Jam Android App Bundle (.aab) building into the makefile.
 * Yuck.
2024-06-30 13:32:17 -04:00
568729ecd6 Stop auto-updating the version in default.nix. Will do it manually only on release. 2024-06-29 08:33:51 -04:00
9139725be6 Merge pull request 'build: fix the nix derivation' (#69) from tasiaiso/tildefriends:tasiaiso-0-0-20 into main
Reviewed-on: cory/tildefriends#69
2024-06-29 08:33:48 -04:00
969a8da6bf build: update nix package to 0.0.20 2024-06-28 10:37:26 +02:00
2338b26329 Start working on 0.0.21. 2024-06-26 20:47:44 -04:00
d4df206740 Oh, I think I see how to nix this now. 2024-06-26 20:36:54 -04:00
8a93cdd33c Let's release 0.0.20. 2024-06-26 20:29:07 -04:00
92b31de4a9 Latest libbacktrace. 2024-06-26 20:20:41 -04:00
5452f3f623 Appease -fsanitize. 2024-06-26 20:20:34 -04:00
256614dbaf Actually stop stomping settings. 2024-06-26 19:58:59 -04:00
049449b213 I think this is how I lost settings. 2024-06-26 19:44:45 -04:00
85b46336b1 Better draft cleanup on submit. 2024-06-26 19:30:58 -04:00
590afa7b01 Fix content warnings. 2024-06-26 19:27:15 -04:00
574292b798 Reduce some common log noise. 2024-06-23 15:11:18 -04:00
21cf503a59 Fix a navigation bar option I neglected to button-ify. 2024-06-23 11:47:12 -04:00
3630cdbfe0 Consolidate the acount/login navigation bar options to try to save some space on mobile. 2024-06-20 20:41:27 -04:00
0f3be229e6 Actually, let's minify this thing using svgomg. 2024-06-20 20:07:58 -04:00
8e5a024d3d SVG favicon. 2024-06-20 20:05:00 -04:00
410bb7c09d Fix a ref count mistake and add a long-overdue tf_util_print_backtrace() that helped me find it. 2024-06-20 19:49:21 -04:00
9de8b0f449 Oops. 2024-06-20 12:36:21 -04:00
d47c3a1222 Fix a ref/unref mismatch. 2024-06-17 21:45:51 -04:00
df99b3aa90 Trying to catch an issue I think I saw in the debugger. 2024-06-17 21:23:48 -04:00
0090850e10 Forgot the other end of blobs.get. 2024-06-17 20:59:25 -04:00
9efd64bd18 Actually enforce _tf_ssb_assert_not_main_thread. 2024-06-17 12:36:54 -04:00
b16c37e48b Make ssb.privateMessageDecrypt do its work not on the main thread. I think that's finally everything for real. 2024-06-16 17:22:26 -04:00
3ee2c00726 Build fix. 2024-06-16 17:08:10 -04:00
d5a7e19f1a Move the bulk of ssb.privateMessageEncrypt work (CPU + DB) off the main thread. 2024-06-16 17:07:12 -04:00
9b52415b35 Make ssb.setServerFollowingMe not use the DB from the main thread. Two left?? 2024-06-16 16:22:59 -04:00
dbe24494d9 Remove ssb.messageContentGet. It's easy to do this with ssb.sqlAsync, and this wasn't being used productively. Three uses of DB on the main thread remaining. 2024-06-16 16:02:39 -04:00
3eab5a5f70 Make ssb.forgetStoredConnection not use the DB on the main thread. Four remaining? 2024-06-16 15:57:19 -04:00
548febfb22 Make ssb.storedConnections do its DB work not on the main thread. Five remaining by my new count? 2024-06-16 15:29:59 -04:00
b40f72443a A little format, as a treat. 2024-06-16 12:18:19 -04:00
2c03496373 Make databases.list, database.remove, and database.getLike all do their DB work off the main thread. That's the last thing I'm aware of. 2024-06-16 12:17:51 -04:00
b6a937c954 Move db.exchange DB work off of the main thread. 2024-06-16 10:16:39 -04:00
63776d40bd Update codemirror. 2024-06-16 09:23:14 -04:00
cb3c7afade Move ssb.getPrivateKey's DB work off the main thread. 2024-06-16 08:07:02 -04:00
991022adfc Move ssb.appendMessageWithIdentity's DB work off the main thread. 2024-06-16 07:51:06 -04:00
2bc71a18a6 Make ssb.deleteIdentity not block the main thread with DB work. 2024-06-14 17:39:24 -04:00
57ca864fbb Build fix. 2024-06-12 21:08:41 -04:00
a09edfb612 ssb.addIdentity without hitting the DB from the main thread. 2024-06-12 21:06:30 -04:00
7997a739ab ssb.createIdentity without hitting the database from the main thread. 2024-06-12 20:47:48 -04:00
248b258413 Make database.getAll() not block the main thread on database access. 2024-06-12 20:29:39 -04:00
0423ed7fb4 Login without hitting the DB from the main thread. 2024-06-12 20:12:35 -04:00
c29378c2f8 Yes, curl, follow redirects. 2024-06-10 21:19:06 -04:00
163fbd85e7 Fix docs. 2024-06-10 20:23:11 -04:00
58bb86ebe1 Make http.auth_query async and get its DB work off the main thread. 2024-06-10 20:22:28 -04:00
c5140ee8e8 Move DB work for ssb.getIdentities() and ssb.getAllIdentities() off the main thread. 2024-06-10 17:18:29 -04:00
6270fd8118 We don't need to go to the DB to get our public key. 2024-06-10 16:56:21 -04:00
3fff706848 Get the code of conduct and JWT signing key without hitting the database from the main thread. 2024-06-10 16:37:12 -04:00
c259defab5 Move database.get and database.set off the main thread. 2024-06-10 15:30:14 -04:00
e5fee5c306 Buildfix. 2024-06-10 12:01:49 -04:00
9d35b4bdfb Resuming work to move all DB access off the main thread. 2024-06-10 11:45:20 -04:00
9497d7cf64 Fix some shutdown hangs/leaks. 2024-06-06 20:31:24 -04:00
c7d3e602cb Fix &-mentions while I'm at it. 2024-06-06 20:14:00 -04:00
0076eb4ed4 Fix autocomplete again/more. #65 2024-06-06 20:05:24 -04:00
6070bde413 Avoid a null dereference. 2024-06-06 19:57:36 -04:00
c7a6d426f0 Fix autocomplete on Chrome, because contenteditable and shadowRoots are tricksy, and this module for @mentions is aging. #65 2024-06-06 19:52:37 -04:00
f66cf0f802 Unused. 2024-06-06 19:11:48 -04:00
e4b6c81024 No need to show your identity in the navigation bar if you have a name. 2024-06-06 18:51:40 -04:00
44d784cd04 OpenSSL 3.3.1. 2024-06-05 12:51:26 -04:00
0394201113 Merge pull request 'buld(nix): Misc Nix-related improvements' (#68) from tasiaiso/tildefriends:tasiaiso-nix-misc into main
Reviewed-on: cory/tildefriends#68
2024-06-04 20:16:15 -04:00
e270c16516 lit 3.1.4. 2024-06-04 20:10:27 -04:00
4c10538632 buld(nix): Misc Nix-related improvements
- Nixpkgs 23.11 is deprecated, use 24.05 instead
- update flake.lock
- add glibc as a build dependency
- add doxygen and graphviz as development dependencies for `make format`
2024-06-04 15:22:18 +02:00
71329c5532 format+prettier 2024-06-03 12:36:34 -04:00
feb4bf9e87 Limit message sends in a continued attempt to fix intermittent runaway memory usage. #64 2024-06-02 12:38:12 -04:00
5d5567e94c Reworking the emoji picker to use w3-modal, in a step toward doing the same for the currently broken @autocomplete. 2024-05-30 12:40:21 -04:00
684e6fb9cb Merge pull request 'nix: update version to 0.0.19' (#66) from tasiaiso/tildefriends:tasiaiso-nix-update into main
Reviewed-on: cory/tildefriends#66
2024-05-30 12:12:45 -04:00
ee21fa6d03 nix: update version to 0.0.19 2024-05-30 11:34:57 +02:00
7a2974e54f Working on 0.0.20. 2024-05-29 20:17:33 -04:00
f4dfc1dd98 Let's release 0.0.19. 2024-05-29 19:50:59 -04:00
2eebfa9a7a Make the websocket disconnect message not pop up a modal dialog so that it's less annoying when it happens in the normal course of events. #60 2024-05-27 20:35:40 -04:00
10097ffeb8 Update codemirror. 2024-05-27 08:23:45 -04:00
cbe1f54a2a libsodium 1.0.20. 2024-05-27 08:21:48 -04:00
4d8f081a59 Update libbacktrace to latest. 2024-05-27 08:21:10 -04:00
29e79c9484 Fix collapsing images taking extra clicks. 2024-05-25 08:09:44 -04:00
ba35869b0a sqlite 3.46.0. 2024-05-25 07:46:15 -04:00
580688381e prettier 2024-05-22 20:52:10 -04:00
e63d69a440 Missing generated semicolon. Sigh. 2024-05-22 20:44:28 -04:00
be64fe04fb Auto-update all the versions. 2024-05-22 20:35:48 -04:00
801ab20723 Merge pull request 'Add Nix support' (#62) from tasiaiso/tildefriends:tasiaiso-nix into main
Reviewed-on: cory/tildefriends#62
2024-05-22 20:31:11 -04:00
d974a5e044 An experiment in controlling memory usage when syncing. uv_read_stop when we have too active message/blob writes to the database and uv_read_start when we're back under control. #64 2024-05-22 19:53:33 -04:00
1be94ae0be Removed ssb.addEventListener and ssb.removeEventListener from the public API. Can do the same thing with core.register. 2024-05-22 18:51:21 -04:00
b883e6a485 Fix username/id extending off the screen in the welcome line. 2024-05-22 12:33:18 -04:00
a0210379ae Avoid confusing log output when responding with a method not found error. 2024-05-20 12:39:21 -04:00
e56dc207d1 Fix some shutdown issues in connection tracker code. 2024-05-16 12:41:48 -04:00
523c9c9ad2 Move mime type shenanigans from JS => C. 2024-05-15 19:25:48 -04:00
74bb2151c1 Fix shutdown issues with in-flight SSB connection attempts. 2024-05-15 12:37:13 -04:00
f79d7b35a4 Disallow creating accounts as a guest. #52 2024-05-14 12:41:17 -04:00
3b36496dac chore: a bit more doc 2024-05-12 21:17:38 +02:00
4ebd6c24a9 chore: missing period in description 2024-05-12 21:15:30 +02:00
05451d98b3 Merge branch 'tasiaiso-nix' of https://dev.tildefriends.net/tasiaiso/tildefriends into tasiaiso-nix 2024-05-12 21:13:43 +02:00
22a4bce3c8 docs(nix): add documentation in default.nix 2024-05-12 21:13:22 +02:00
76d499f00b Merge branch 'main' into tasiaiso-nix 2024-05-12 14:56:12 -04:00
f0772f9b99 build(nix): add Nix support 2024-05-12 20:34:03 +02:00
46e711f0a5 Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-05-12 10:40:14 -04:00
abffac3f82 Show missing profile images more deliberately. 2024-05-12 10:40:06 -04:00
27b275548e Fix docs. 2024-05-12 08:37:14 -04:00
93ce253d1e prettier 2024-05-12 08:23:34 -04:00
a5af312b39 Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-05-12 08:23:23 -04:00
4b5e8e8a43 Consolidate similar request tags in the connection list. #59 2024-05-12 08:21:47 -04:00
443dd4d168 Merge pull request 'chore: code formatting' (#58) from tasiaiso/tildefriends:tasiaiso-format into main
Reviewed-on: cory/tildefriends#58
2024-05-12 08:05:02 -04:00
907479df84 Merge branch 'main' into tasiaiso-format 2024-05-12 07:52:33 -04:00
9887a78e98 prettier 2024-05-12 07:48:34 -04:00
f669371349 Show tab names on large enough screens. Inspired by tasio's #61. 2024-05-12 06:58:01 -04:00
24c720c79a Merge branch 'main' into tasiaiso-format 2024-05-12 02:06:09 -04:00
4485234980 chore(style): tell prettier to ignore code block 2024-05-12 08:01:37 +02:00
b6871c0b1f chore: code formatting 2024-05-11 23:44:09 +02:00
47838d5e48 More name info issues. 2024-05-11 10:53:21 -04:00
69fccd56d3 Add a little guidance about how to set your name. It's a common confusion. 2024-05-11 10:40:34 -04:00
ca00c4fb5d Fix multiple issues getting identity info. 2024-05-11 10:23:07 -04:00
427ca3f265 Indicate both the server account and your own accounts in the ssb connections tab. 2024-05-11 09:58:24 -04:00
c1a80e50e7 Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-05-11 09:50:06 -04:00
52962f3a5e Remove the :auth key. We can sign JWTs with :admin, and it's one less magic key. 2024-05-11 09:50:00 -04:00
b3f095b61f Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-05-11 09:33:48 -04:00
a5004c8ba9 Indicate the local server identity. 2024-05-11 09:33:38 -04:00
7d9b1b508b Print a little colorful message when we've started about where to connect. Multiple people have pointed out that it's not obvious that it's working. 2024-05-11 09:18:30 -04:00
5e265dfc83 Make sure the first user can admin. 2024-05-11 09:03:56 -04:00
3a43d6f8ac Build fix. 2024-05-11 09:03:37 -04:00
11a6649847 Add back a verify command. Remove unused and not very useful ssb.getMessage(). Make field ordering shenanigans more explicit. 2024-05-11 08:48:50 -04:00
7caf4a0173 Fix numerous issues around setting the first registered used as an admin. 2024-05-10 22:21:59 -04:00
385524352c Refactor most uses of uv_queue_work to go through a helper that keeps track of thread business, traces, and is generally less code. 2024-05-08 21:00:37 -04:00
5ca5323782 Fix /speedscope/ => deps/speedscope/index.html. 2024-05-08 20:57:53 -04:00
ba6da856bb Let trace truncate names more if it means we can generate valid JSON. 2024-05-08 20:56:44 -04:00
c0e72246cc Trying to understand a lingering 'previous message doesn't exist.' And format. 2024-05-08 12:20:57 -04:00
c7ab5447ea Move / redirect handling to C 2024-05-05 15:24:15 -04:00
5fdd461159 Fix setting multiline admin settings. 2024-05-05 15:19:00 -04:00
421955f2a0 getIdentityInfo => C. 2024-05-05 13:48:22 -04:00
a28f6985ed getActiveIdentity => C. 2024-05-05 12:55:32 -04:00
8244dddab7 Latest libbacktrace. 2024-05-05 12:03:57 -04:00
a5ca436eaa Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-05-02 20:35:24 -04:00
d7fc1c2c88 Minor style/layout changes. 2024-05-02 20:35:00 -04:00
382627ef8d Latest codemirror. 2024-05-02 20:11:54 -04:00
17667b4cf8 make format 2024-05-02 20:10:56 -04:00
5231ec22e7 More trying to clean up lingering requests. 2024-05-02 19:59:54 -04:00
929ae1b709 After eyeballing lingering requests, clean up requests after the response to an async (non-streaming) request is done. 2024-05-02 19:37:38 -04:00
f01f7a5ab9 Show active RPC requests in the connections tab. Probably TMI, but I want greater introspection into what is going on, and this seemed like a positive step. 2024-05-02 19:02:23 -04:00
a2dce833f8 Fix another shutdown issue. 2024-05-02 12:30:22 -04:00
de6c7a4fd4 SSB app stylin'. 2024-05-01 12:34:36 -04:00
4edee0f7f6 Allow importing from a single app .json. 2024-04-30 21:43:14 -04:00
988a807fa4 Admin app styles. 2024-04-30 19:18:33 -04:00
5258e4253d Better identity app layout on mobile. 2024-04-29 12:24:35 -04:00
09ba86dec5 Show replies to gatherings. 2024-04-28 12:55:17 -04:00
78d8a1aa23 Set the core room app icon. 2024-04-28 12:33:19 -04:00
22def15209 Merge branch 'main' of https://dev.tildefriends.net/cory/tildefriends 2024-04-28 12:25:31 -04:00
4cbda7a849 Improve file errors so that it doesn't look like everything has failed when we see there's no https cert available. 2024-04-28 12:25:12 -04:00
be85a620ef Fix app delete. 2024-04-28 12:11:13 -04:00
0b07b678b4 Theme the identity app a bit. 2024-04-28 11:57:35 -04:00
4733ce9287 Fix ssb draft discard. 2024-04-28 11:23:28 -04:00
48d6bf4c15 Hook up onJsAlert on android. 2024-04-28 11:04:29 -04:00
8c759bcbac Hide the reactions button if there aren't any. 2024-04-26 18:19:13 -04:00
b5ed7014f6 Fix attaching files (aka WebView file picking) on Android. 2024-04-26 18:10:22 -04:00
6cd9dea186 Merge v0.0.18 compose fixes. 2024-04-24 20:35:36 -04:00
202b416acf More ssb compose fixes. 2024-04-24 20:32:09 -04:00
93d46f5610 Fix some ssb compose issues. 2024-04-24 20:20:18 -04:00
c5ddf3ac99 Fix some ssb compose issues. 2024-04-24 20:19:14 -04:00
a9cb913a47 Working on 0.0.19. 2024-04-24 19:29:17 -04:00
b7b5d4f1a5 Calling it 0.0.18. 2024-04-24 19:24:10 -04:00
a947396bad Prettier. 2024-04-24 19:23:13 -04:00
d528bc808e Add retries around some 'test -t auto' intermittent failures. 2024-04-22 12:37:06 -04:00
c6fd05c2cf ssb tf-compose fixes. 2024-04-21 18:53:47 -04:00
d6bb9d311a An experiment in improving ssb text entry. 2024-04-21 18:24:57 -04:00
53b4cbbf8c CSS, ugh. 2024-04-21 15:24:23 -04:00
628716ec28 Add a thing to inspect reactions. #48 2024-04-21 14:18:06 -04:00
bd14168627 Don't pop up the error modal for connecting/status messages. 2024-04-18 12:46:06 -04:00
96037d4da6 Android pull refresh fixes. Sigh. 2024-04-17 22:37:24 -04:00
5448e773d8 Rejiggled error display. 2024-04-17 20:56:33 -04:00
848ef21c7c Build a windows standalone executable with attached data for dist. #28 2024-04-17 20:16:07 -04:00
2ecae7da93 Implement my own hokey pull to refresh on Android. Nobody's got time for all those dependencies. 2024-04-17 19:55:14 -04:00
d9ce569eb9 Add a thing to encourage editing your profile. 2024-04-17 17:21:44 +01:00
eacaf392b1 Lit 3.1.3. 2024-04-16 12:31:53 -04:00
ce16592b6a Update codemirror. 2024-04-16 12:30:27 -04:00
295d76d354 sqlite 3.45.3. 2024-04-16 12:16:36 -04:00
23b3c998bd Re-CSS'd the identity dropdown. 2024-04-14 17:47:47 -04:00
b5e966c9a1 Make the wiki app use the global id picker. 2024-04-14 13:53:51 +01:00
96cb6f4b12 Make the issues app use the global id picker, fix jsonb issues, and fix the global id picker. 2024-04-14 13:47:28 +01:00
e2c0f82ec0 Size the identity picker a tad better. 2024-04-14 13:10:32 +01:00
dbf28c03e6 Let's get account names to the UI. 2024-04-13 21:51:18 -04:00
26165e30de Fix -t auto. 2024-04-13 20:32:17 -04:00
c52331a23a format/prettier 2024-04-13 20:07:39 -04:00
8007e71e1d Make the ssb app use the global identity picker. 2024-04-13 19:52:40 -04:00
28d08e013f Trying to make the ssb connections tab not overflow all the layouts. Dunno. 2024-04-13 19:29:31 -04:00
64bbd383de Trying to make the navigation bar fit again with a new dropdown. Good grief, CSS. 2024-04-13 16:52:30 -04:00
8a9f53102b Needs some color. 2024-04-13 13:33:57 -04:00
0412b97170 WIP managing a per-app current identity from the Tilde Friends navigation bar. 2024-04-13 13:22:59 -04:00
c8b8a8fc03 Oops, the tf-auth lit was all wrong. 2024-04-13 10:28:35 -04:00
95d3090b9b Fix the app permissions list missing its reset buttons. 2024-04-13 10:03:06 -04:00
49129ee6dd Welcome changes. Added a first steps blurb. 2024-04-12 02:32:21 +01:00
6a7ecb0d4a Update codemirror to latest. 2024-04-11 20:36:14 -04:00
1ceeed1007 prettier + clang-format. 2024-04-11 18:36:31 -04:00
a7922ff44e Get commonmark blockquotes on-theme. 2024-04-11 01:30:49 +01:00
a421604ed5 OpenSSL 3.3.0. 2024-04-10 19:44:49 -04:00
7d182db32f Move to submodules: libsodium, quickjs, crypt_blowfish, libbacktrace, libuv, picohttpparser. Kudos to @tasioiso in #45. 2024-04-10 19:25:18 -04:00
c5cb9979d3 Move zlib to a submodule, informed by @tasiaiso's #45. And fixup [archive] dist/tildefriends-0.0.18-wip.tar.xz
[cp] TildeFriends-x86-0.0.18-wip.apk
[cp] TildeFriends-arm-0.0.18-wip.apk
[cp] TildeFriends-0.0.18-wip.ipa to support it.
2024-04-10 19:09:31 -04:00
b9a73106ed Better CSS for the ssb app to fill the iframe? 2024-04-10 18:43:48 -04:00
c674cca482 Move some DB things out of httpd. 2024-04-04 21:00:59 -04:00
81d1228b92 Experimenting with w3.css themes. 2024-04-04 20:35:09 -04:00
6ae61d5b81 Fix wiki vs. JSONB. 2024-04-05 00:11:55 +01:00
9cb872eec2 Remove JS functions: hmacsha256sign, hmac2ha256verify, parseHttpRequest, sha1Digest, and maskBytes. These are no longer needed with httpd and auth in C 2024-04-03 21:14:52 -04:00
68e8c010b7 Show recently used emojis in the emoji picker. #16 2024-04-04 02:12:43 +01:00
9671413906 Make it easier to @mention the person to whom you are replying. 2024-04-04 00:50:59 +01:00
4c8d24c319 Consolidate markdown linkification, and add support for authors, blobs, and messages. 2024-04-04 00:18:39 +01:00
e50144bd34 Validate exit codes more thoroughly. C'mon, Cory. 2024-04-02 20:32:47 -04:00
9f3171e3f1 Remove auth.js. #7 2024-04-02 20:11:36 -04:00
cc92748747 Move sending refresh tokens out of JS. 2024-04-02 12:42:31 -04:00
0a0b0c1adb Make sure we don't leak the session string when reassigning it. 2024-04-02 12:20:59 -04:00
92a74026a6 Format the new auth code. 2024-04-01 12:53:47 -04:00
3fa1c6c420 Tidied up getting an auth key slightly. 2024-04-01 12:53:00 -04:00
b04eccdbda Move the auth handler out of JS. #7 2024-03-31 16:15:50 -04:00
9ce30dee70 Start working on 0.0.18. 2024-03-27 19:08:10 -04:00
3c0b680b8e Let's release 0.0.17. 2024-03-27 18:59:40 -04:00
895356897b archive whichever branch. 2024-03-25 18:10:07 -04:00
9164be2f37 Fix loading from not standalone zip. 2024-03-25 16:34:27 -04:00
5385264f94 Fix an http use after free during shutdown. 2024-03-25 16:31:09 -04:00
610e756c07 Ever closer to the elusive clean http shutdown. 2024-03-25 16:23:45 -04:00
15c9f8f458 Rudimentary support for building the executable with data attached. Pushed some things around in the makefile to fix issues along the way. #46 2024-03-25 13:50:17 -04:00
fb704a5b83 I will get better at keeping this tree clean. 2024-03-25 12:56:33 -04:00
fdda628be8 Fix paths in the source tarball. 2024-03-20 20:43:41 -04:00
2b45d8aa05 Doh. Never mean to add that. 2024-03-20 20:37:52 -04:00
0e2fc65301 Document run -k flag. 2024-03-20 20:33:23 -04:00
e8ef7e74de Fixed a leak in JS blob store. 2024-03-18 12:46:12 -04:00
c32e1b9583 http request cleanup crash fix. 2024-03-18 16:34:07 +00:00
9d0f6ec155 Fix the sneaker app RE: JSONB. 2024-03-18 12:32:40 -04:00
855d603795 docs + prettier 2024-03-17 13:21:33 -04:00
af25782185 More http/request shutdown issues. 2024-03-17 12:38:37 -04:00
e5ba51b80a Chasing a leak that looks like an EBT clock. Deleted some unneeded code and adding a missing JS free. 2024-03-17 13:44:05 +00:00
5e240de677 Fix requesting blobs from blob_wants. ids were trucated. Yikes. 2024-03-17 09:16:06 -04:00
418cfac0e3 Add a stock app with local room connection info. #15 2024-03-14 00:43:11 +00:00
9d09607013 Update CodeMirror. 2024-03-13 20:23:48 -04:00
eddf25b622 Give libuv the same download treatment as sqlite. 2024-03-13 19:53:57 -04:00
537a8654fa Rename sequence_before_author => flags. #29 2024-03-13 19:40:09 -04:00
9de33d06d2 Specifying -fsanitize=... early seems good. 2024-03-13 18:26:24 -04:00
0e5f320664 sqlite 3.45.2. 2024-03-13 12:30:14 -04:00
88d8e60511 Some minor paranoia to appease valgrind. 2024-03-12 21:44:20 -04:00
439f07162e Disable Haiku automation tests until I find a way to automate a browser on Haiku. 2024-03-09 08:44:06 -05:00
efe2b6cbd9 A make target to run prettier. 2024-03-08 21:43:08 -05:00
0aa1ed9464 Fix a failure requesting more blobs. 2024-03-08 21:38:31 -05:00
cb94ed6a2a Some plumbing to expose the actual bound SHS port so that I can make a dynamic room app. 2024-03-07 21:03:14 -05:00
cf187ee46b Reorder things so that we only zipalign -z during a dist build. To slow for make all. 2024-03-07 20:42:08 -05:00
3e71fc20fd Prettier. 2024-03-06 21:14:09 -05:00
f3601321f7 That's all the doxygen warnings. #27 2024-03-06 21:13:16 -05:00
540059368c 11 make docs warnings left, but I'm out of time for tonight. 2024-03-06 20:57:38 -05:00
7ce89123f7 85 make docs warnings remain. 2024-03-06 12:46:27 -05:00
e3c7c86212 All but the two biggest .h files have docs. 2024-03-06 12:31:17 -05:00
794804e27f A few more .h file docs. 2024-03-05 21:17:20 -05:00
6d89c1da6e Format. 2024-03-05 20:49:30 -05:00
d059554464 Some workarounds for Haiku. uv_fs_scandir can't tell if a dirent is a file. setrlimit doesn't do anything productive for us. 2024-03-05 20:49:16 -05:00
3a392d4a9f More .h docs. 2024-03-05 12:47:58 -05:00
e3071b372a Poking at TCP binds from Haiku. 2024-03-04 21:51:27 -05:00
18bd279b0c Some progress on .h docs, and add a preliminary CONTRIBUTING.md. 2024-03-04 12:23:00 -05:00
5b93db7463 A buncha muncha cruncha .h docs. Also add vim temporary files to .gitignore. 2024-03-03 18:12:44 -05:00
5b7e5eb91b Give fts a better chance of working with jsonb messages.content. 2024-03-03 18:55:58 +00:00
78ca383e3c http.h docs. 2024-03-03 12:35:10 -05:00
c1eed9ada3 Fixed a leak in ssb.getServerIdentity(). 2024-03-03 12:20:03 -05:00
8d6feb5394 Set the root of private messages correct so that other clients show them. 2024-03-03 12:09:03 -05:00
42994f8977 Make the SSB network key configurable by command-line argument. 2024-03-02 15:01:09 -05:00
f0a871e1f8 More docs. 2024-03-01 21:18:12 -05:00
a710c30572 Fix apps for jsonb. 2024-02-29 19:26:56 -05:00
c991763b00 tests.h and tlscontext.js.h docs. 2024-02-28 21:18:59 -05:00
72dae14f87 Android NDK update. 2024-02-28 21:04:22 -05:00
5800340762 Fix up some more jsonb references. 2024-02-28 20:41:27 -05:00
c5f5adcac6 Missed some more jsonb messages.content use issues. 2024-02-28 20:31:25 -05:00
591642efb3 Convert messages.content to JSONB. This is a very disruptive change. 2024-02-28 20:01:52 -05:00
6182ffa1d4 Docs for tls.h and trace.h. 2024-02-28 19:12:41 -05:00
402a898d96 Let's start working on 0.0.17. 2024-02-28 18:47:21 -05:00
13d43d8319 Let's release 0.0.16. 2024-02-28 18:24:12 -05:00
7bcdbd3813 Revert "Update commonmark.js to 0.31.0."
This reverts commit 165f25db69.
2024-02-26 12:34:50 -05:00
60ada22674 Add a button to toggle visible whitespace for now. Not yet persisted. 2024-02-25 22:31:31 -05:00
637119d46d ideviceinstaller makes this unnecessary. 2024-02-25 21:41:32 -05:00
40f3da6a65 Fix a leak in returning HTTP responses. 2024-02-25 19:38:00 -05:00
f4697fe7f7 Update CodeMirror. 2024-02-25 18:54:35 -05:00
3bc18b9021 Docs for util.js.h. 2024-02-25 18:52:34 -05:00
c21581aefa Use zipalign w/zopfli for APKs to save a little on size. 2024-02-25 18:29:10 -05:00
165f25db69 Update commonmark.js to 0.31.0. 2024-02-25 16:25:23 -05:00
9aa0617aa1 Fix android argv. 2024-02-25 16:02:56 -05:00
ddce88dce6 Merge branch 'tasiaiso-wiki-improvements' 2024-02-25 15:37:56 -05:00
6aa2bce2be Merge branch 'wiki-improvements' of https://dev.tildefriends.net/tasiaiso/tildefriends into tasiaiso-wiki-improvements 2024-02-25 15:37:13 -05:00
a43c1d3d1e Format. 2024-02-25 15:03:43 -05:00
1ed0e817e8 BSD compile fix. 2024-02-25 14:57:14 -05:00
709ca55e65 Fix overbuild on macos. 2024-02-25 14:52:35 -05:00
8c13f5dbba xopt => getopt_long. I give up on xopt. It didn't help me as much as I had hoped, and I had problems building for mingw with only some versions of GCC. Not worth any further time. 2024-02-25 14:45:31 -05:00
4cb82d81b7 apps/gg doesn't belong here and isn't ready for prime time.. 2024-02-24 11:19:36 -05:00
0c42921387 Appease prettier in index.html. 2024-02-24 11:16:07 -05:00
70a3e7fc7d Make app export append a trailing newline to the app.json files so that we match prettier. 2024-02-24 11:12:35 -05:00
d5267be38c Run prettier. 2024-02-24 11:09:34 -05:00
8e7e0ed490 Merge branch 'tasiaiso-prettier' 2024-02-24 11:03:36 -05:00
8cf2837725 Export app json files indented with tabs. 2024-02-24 10:58:53 -05:00
63ae186c76 Export app json files indented with tabs. 2024-02-24 10:55:09 -05:00
dbf5c7b832 Merge branch 'main' into prettier 2024-02-23 09:50:49 +00:00
bfbfc01e99 keep the new config files 2024-02-23 10:42:26 +01:00
8fa9d0e843 Revert "build: Add prettier to the project"
This reverts commit 41024ddb79.
2024-02-23 10:35:39 +01:00
2d3e108fd9 Reapply "build: Add prettier to the project"
This reverts commit 7822b30dcb.
2024-02-23 10:29:46 +01:00
7822b30dcb Revert "build: Add prettier to the project"
This reverts commit 41024ddb79.
2024-02-23 10:25:51 +01:00
2701b7d04e Address some gcc-13 analyzer warnings. #33 2024-02-22 20:13:51 -05:00
e361c3f975 chore(wiki): the button class is now optional for input elements 2024-02-22 22:34:11 +01:00
260706c172 chore: copy .prettierrc.yaml over to client.js 2024-02-22 21:31:15 +01:00
390668ec34 Merge branch 'master' into prettier 2024-02-22 21:23:39 +01:00
1d5cdf9607 feat(wiki): improvements to the wiki's UI 2024-02-22 18:39:53 +01:00
a4bf3542e0 Merge branch 'main' into wiki-improvements 2024-02-22 15:14:49 +00:00
df82cfe66b chore rename core.css to tildefriends.css, remove license from tildefriends.css 2024-02-22 16:11:49 +01:00
f23414adaf prevent previous commits from appearing in git blame 2024-02-22 15:37:40 +01:00
41024ddb79 build: Add prettier to the project 2024-02-22 15:36:45 +01:00
53f9547cc5 style(wiki): use core.js 2024-02-22 13:03:21 +01:00
4bfd9de100 Give iOS the same openssl build treatment as android and mingw. #11 2024-02-21 20:23:35 -05:00
c01e00d77d Get geckodriver.log from 'tildefriends test -t auto' out of the root. 2024-02-21 20:06:25 -05:00
825191c08f Fix 'make dist'. 2024-02-21 19:59:26 -05:00
9dc6670795 Fetch and build OpenSSL as part of the code build. 2024-02-21 19:46:28 -05:00
1db8eee9f7 Merge pull request 'Documentation, build improvements' (#1) from tasiaiso/tildefriends:dev_tasia into main
Reviewed-on: cory/tildefriends#1
2024-02-21 23:51:01 +00:00
1bc50cb62c Remove prebuilt OpenSSL from source control. #11 2024-02-21 12:31:05 -05:00
450b07fd08 Add a Doxyfile and preliminary module-level docs. 2024-02-20 21:41:37 -05:00
12c7515ee8 chore: revert changes to codemirror's config 2024-02-20 18:45:46 +01:00
ed65da4340 doc: typos 2024-02-19 19:26:15 +01:00
d9d2917cf5 chore: add folders to .gitignore 2024-02-19 19:16:05 +01:00
ce5ca1875b doc: add JSDoc annotations in the core folder
start documenting a bit, mostly inconsequential changes
2024-02-19 19:12:42 +01:00
4f869252a2 codemirror: add build script, edit build settings
Disabled `highlightWhitespace()` and `highlightTrailingWhitespace()`, could be reverted if necessary
2024-02-19 15:15:41 +01:00
17b92126de Fill in some blanks in the readme. 2024-02-18 21:31:07 -05:00
6e88c44229 Fiddle with some deps as I'm building from a clean tree. 2024-02-18 21:22:42 -05:00
6c3d338c12 How long has this extra character been in the readme? 2024-02-18 20:48:10 -05:00
4ebd44cb4e Avoid leaking some console colors.f
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4859 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-18 15:39:32 +00:00
75cb9f7fd2 Make things workable with a reverse proxy in front.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4858 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-18 15:27:44 +00:00
eacca9d2ab Ignore some files in subversion.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4857 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 20:45:22 +00:00
d0e11bc68b Add missing .clang-format, and fix some spaces that slipped through.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4856 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 19:22:02 +00:00
1958623a7a Package prettier.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4855 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 18:59:36 +00:00
498d8b6520 Hook up prettier in the editor.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4854 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 18:53:21 +00:00
a12f2fec5a Grarrgh. Build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4853 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 16:36:40 +00:00
22bf046643 Fix fix fix tests.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4852 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 15:33:08 +00:00
dca48fae36 Some test fixes, and introduce some pledge and unveil for OpenBSD.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4851 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-17 14:55:39 +00:00
9af4068bb6 This apparently works around errors if I remove a header.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4850 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-16 03:27:41 +00:00
2992d8ec12 Fix showing decrypted messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4849 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-16 01:09:08 +00:00
33dd2560e0 Format.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4848 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-16 00:48:49 +00:00
aeb5c6ee25 Run the selenium automation tests from C, so that they all run in once place, and because I get better errors for some reason. Fix more issues along the way.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4847 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-16 00:47:54 +00:00
08a2436b8f Updates to 'apps' from Tasia.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4846 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-16 00:13:39 +00:00
fbc3cfeda4 clang-format the source. Not exactly how I want it, but automated is better than perfect.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4845 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-15 23:35:01 +00:00
c8812b1add Make the tests not do the imports all the time.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4844 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-15 03:00:34 +00:00
8d82e80639 Nope. JS_EVAL_FLAG_STRIP loses line numbers and other debug information. Need those.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4843 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-14 17:45:28 +00:00
ed741d53d7 Enable top-level async and JS_EVAL_FLAG_STRIP.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4842 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-14 17:39:27 +00:00
685754895b Have we achieved clean shutdown?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4841 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-13 23:07:36 +00:00
e7791d38ff Continuing the fight against http lifetime issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4840 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-10 22:09:52 +00:00
9f14653001 No, yikes, Cory.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4839 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-10 21:58:02 +00:00
6c5a7b0751 Add missing statics, and remove the 'tildefriends check' command.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4838 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-10 16:50:00 +00:00
51a327c52d .well-known => C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4837 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-10 16:10:58 +00:00
5a978bb30d CodeMirror update.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4836 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-10 15:10:33 +00:00
6801758cb3 staticDirectoryHandler => C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4835 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-10 03:14:02 +00:00
14de3dd9e5 Linkify better?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4834 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-09 02:05:49 +00:00
ed2d57fb4b Serve core static files without leaving C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4833 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-09 01:21:57 +00:00
e87acc6286 robots.txt => C
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4832 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-08 01:08:05 +00:00
0de932bc9e Update CodeMirror.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4831 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-08 00:54:31 +00:00
d021d9f757 Automate fetching sqlite.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4830 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-08 00:17:30 +00:00
eb5da26004 Now this OpenSSL use is perfect.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4829 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-07 23:45:04 +00:00
6765254f43 libuv 1.48.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4828 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-07 23:12:32 +00:00
e98802f5b2 Fix https somehow.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4827 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-07 22:59:51 +00:00
af54b6483e Some success exporting and importing apps on android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4826 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-07 00:05:07 +00:00
96167c3167 Fix more memory leaks and ssb shutdown order issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4825 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-06 17:42:17 +00:00
eecfdf482f Lit 3.1.2.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4824 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-02-01 01:18:11 +00:00
7ceb865206 ios OpenSSL => 3.2.1.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4823 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-31 04:45:17 +00:00
b919670706 Updated CodeMirror.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4822 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-31 03:11:38 +00:00
72120b8842 OpenSSL 3.2.1, and some android SDK updates.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4821 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-31 03:06:47 +00:00
1e53c08d9d Android OpenSSL => 3.2.1.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4820 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-31 02:22:16 +00:00
2d1b6a09e9 sqlite-amalgamation-3450100.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4819 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-31 02:15:24 +00:00
7f661d9af9 Appease the analyzer, but also how did this ever work?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4818 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-31 02:04:10 +00:00
81c66bdddd Allow downloads and top navigation from sandboxed pages. Trying to make the wiki more sensible.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4817 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-29 00:00:20 +00:00
4bd46a1657 Working on 0.0.16 now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4816 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 23:55:17 +00:00
244a752ae1 Some wiki link fixes. Not enough.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4815 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 23:54:28 +00:00
72369ab745 Let's release 0.0.15.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4814 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 23:35:28 +00:00
b62a05f627 Latest picohttpparser 4e7bc76.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4813 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 21:32:12 +00:00
03eb8e7fae Change that mentions icon.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4812 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 21:11:24 +00:00
a5a00b6987 Make garbage collecting blobs ease up on my phone.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4811 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 21:08:08 +00:00
542162c78a One editor at a time.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4810 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 20:59:46 +00:00
8cfe0fb7d2 -Os => -Oz for android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4809 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 13:54:51 +00:00
49c831cb62 Fix seeding files for a new app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4808 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 13:09:31 +00:00
2c79e03094 A little paranoia as I stare at this code and some analyzer nonsense.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4807 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-28 12:50:47 +00:00
21e6cf10b6 Sigh. Linked list bugs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4806 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 21:53:57 +00:00
dc655bb359 Prefer tf_resize_vec many places over tf_realloc.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4805 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 21:29:06 +00:00
b9987580ee Now all the tests run clean.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4804 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 21:01:10 +00:00
cb2dfc696d Fixed a few more good leaks. Now there are just some unclean shutdown issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4803 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 18:26:01 +00:00
7f0643f9c0 Stop leaking the TLS context.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4802 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 17:27:56 +00:00
14a4117aff Don't leak the http handlers.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4801 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 17:11:24 +00:00
55fb5dce1a Whoa, leaked messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4800 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 16:37:22 +00:00
923d6f9835 I think that's all the leaks accounted for though not yet fixed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4799 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 15:45:51 +00:00
08b5ade8ec Getting closer on lifetime issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4798 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 14:44:17 +00:00
91f41c7497 Fix the windows build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4797 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 13:51:08 +00:00
fa06282ff9 Make it so we don't have to wait ages for a timer to be able to shutdown with ^C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4796 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 13:48:16 +00:00
48b967f5b6 Tryingn to button down websocket lifetime issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4795 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 02:36:08 +00:00
f479165aac Fixes 'tildefriends test'.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4794 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 01:47:51 +00:00
2f83ecc1ac At least one legit memory leak, but also add a SIGTERM handler that attempts a clean shutdown so that I can ensure that it succeeds. It currently does not.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4793 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-27 01:25:30 +00:00
01efc215fd Update codemirror.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4792 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-26 02:47:47 +00:00
00ba74a6c4 This simplifies upgrading an HTTP request to a websocket, I believe, and fixes sending refresh auth tokens.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4791 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-25 18:00:23 +00:00
44b5ba1a9a Fix excessive scroll bars.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4790 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-24 03:11:49 +00:00
843e172e56 Allow pasting non-image files into the wiki editor.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4789 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-24 02:58:53 +00:00
a0df336abe Latest libsodium-1.0.19-stable.tar.gz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4788 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-23 02:18:59 +00:00
0db4bb06c9 zlib 1.3.1.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4787 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-23 02:14:27 +00:00
ad2b49b838 App import/export from the editor.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4786 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-21 23:56:36 +00:00
ab519342e8 Styling the files pane.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4785 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-20 16:05:00 +00:00
1f0b9012e3 Use some w3.css in the core HTML.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4784 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-19 02:32:55 +00:00
1ddad6be93 Null check around my apps change.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4783 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-19 02:17:09 +00:00
cf311003c0 Fix some weird spacing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4782 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-19 02:12:17 +00:00
64249976a8 Fix https requests redirecting to http.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4781 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-19 00:48:42 +00:00
6ecb3ccd08 Some var => let.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4780 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-18 00:38:38 +00:00
4867bacb72 Remove the docs app. Will figure out how to do this all via the wiki app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4779 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-18 00:37:49 +00:00
7d029d3d7a Remove the appstore app. apps does most of what it used to do, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4778 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-17 23:36:08 +00:00
455befc18f List shared apps in the apps app. App.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4777 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-17 22:43:32 +00:00
6e57845512 sqlite-amalgamation-3450000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4776 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-15 20:58:15 +00:00
1335a6e1e5 Fixed the create account falling off the screen.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4775 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-15 02:13:21 +00:00
1eab44464c More style.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4774 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-15 02:01:36 +00:00
c3e2da3d51 Oops, this is the rebuild of cm6 with that last change.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4773 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-15 01:57:37 +00:00
1716f71c12 Make the editor theme background a bit darker.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4772 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-15 01:56:43 +00:00
b52e99c958 Fix indentation?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4771 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-14 03:07:08 +00:00
86531bfd7e Fix some sizes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4770 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-14 03:06:59 +00:00
874a22325e Gotta highlight that whitespace.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4769 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-14 02:58:46 +00:00
2380b65853 Man, CSS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4768 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-14 02:37:15 +00:00
f72e8cbd91 CodeMirror 6.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4767 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 17:40:47 +00:00
24e418344e Make malloc_usable_size() go away with CFLAGS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4766 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 13:19:08 +00:00
2b7077ca70 quickjs-2024-01-13.tar.xz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4765 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 13:04:19 +00:00
10d438e723 Eh? Windows fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4764 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 13:00:39 +00:00
331846ee2e Fiddling with buttons.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4763 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 03:03:03 +00:00
dc0e58afc1 w3.css-ified ssb more.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4762 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 02:55:52 +00:00
18e9252998 speedscope 1.20.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4761 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-13 02:34:41 +00:00
b2e3c04036 I did some CSS, and it was kind of OK.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4760 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-12 04:23:31 +00:00
4fd155e68a Make haiku compile again, though I'm not happy about its lack of INADDR_ANY support.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4759 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-12 00:11:03 +00:00
59ac0b5f20 Print a colored result at the end of autotest.py.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4758 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-11 23:57:02 +00:00
f4979c841a Cleanup of some minor old cruft in the js code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4757 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-11 02:11:24 +00:00
74eb74deb1 Playing with pahole.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4756 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-11 01:38:30 +00:00
9e5e7b70d4 Let's try only showing my own blog posts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4755 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-11 01:02:47 +00:00
2384fc9fa9 Improve some more blog links.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4754 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-11 00:50:12 +00:00
576e58b1e3 Make blogs semi-navigable.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4753 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-11 00:33:53 +00:00
a0af058f5e Don't leak promises.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4752 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-10 02:49:44 +00:00
b40457d774 Disable storing messages for disconnection debug by default, and add another environment variable for logging SSB RPC messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4751 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-10 02:41:28 +00:00
2353b43514 Attempt to release sqlite memory.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4750 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-10 02:36:27 +00:00
b11d5192c2 Fiddling with blog links.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4749 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-10 02:23:40 +00:00
d38c58ce1d lit 3.1.1
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4748 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-10 00:00:14 +00:00
a0f390b7dc Fix a memory leak in httpd.js.c.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4747 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-09 17:22:39 +00:00
cb12799111 Add audio/midi mime type.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4746 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-09 17:22:09 +00:00
86fb5c53a1 Fix wiki links within the standalone pages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4745 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-08 17:42:56 +00:00
29fc728509 These look like potential leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4744 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-08 02:30:08 +00:00
0fb341f378 Enable memory tracking on an environment variable.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4743 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-08 02:18:10 +00:00
8a1a182479 Fix mingw build?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4742 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-07 21:35:51 +00:00
49907bc8ee Oops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4741 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-07 21:08:37 +00:00
21d4a9b328 Appease gcc 12's analyzer.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4740 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-07 21:08:20 +00:00
d5ede43a13 Update the welcome links to all go to pages with versions for my own convenience.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4739 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-07 15:23:09 +00:00
b73f5011cf Continuing trying to crunch android openssl sizes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4738 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-06 21:33:20 +00:00
32ebfa78cd Some automation for the identity app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4737 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-06 19:52:14 +00:00
39c942a205 Support deleting identities, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4736 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-06 19:22:49 +00:00
ebc4533b10 Minor identity interface improvements.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4735 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-06 18:40:57 +00:00
4e5f9c86a8 Fix the app emoji button.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4734 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-06 15:47:14 +00:00
d89a7a5556 Looks like I can round-trip an SSB identity, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4733 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-04 01:17:30 +00:00
8ab53f2da3 Some plumbing to export an SSB identity from Tilde Friends.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4732 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-04 00:21:15 +00:00
4c8eab2692 Set more button tooltips.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4731 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-03 23:52:05 +00:00
08989f54d9 Wiki link colors, and determine the thumbnail better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4730 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-03 23:24:24 +00:00
c78753f3ff Expose bip39 to script, and fix some things around base64 so that I can round trip it properly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4729 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-03 17:25:34 +00:00
34a87d8b3b Minor cleanup. Make http.c trace its callbacks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4728 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-03 02:14:17 +00:00
7516524d69 Implement the rest of the endpoints that were already mostly C in C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4727 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-02 23:26:42 +00:00
549d7ffec8 Minor blog changes I've apparently been sitting on.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4726 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-02 22:21:13 +00:00
ccafc23d3c Adding bip39 so I can use it to move around private keys.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4725 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-02 20:25:11 +00:00
709b57d84f Move /trace and /mem to C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4724 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-02 15:43:17 +00:00
9ef909c9a1 Reimplement http -> https redirects. Remove request phases. With just a little extra storage, it wasn't needed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4723 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-02 15:02:47 +00:00
d7c0ffaac4 speedscope 1.19.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4722 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-02 01:09:05 +00:00
e4cd5312f1 Oops, fix websockets.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4721 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-01 22:22:03 +00:00
197fca6d3b Fix/cleanup around a crash I'm seeing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4720 ed5197a5-7fde-0310-b194-c3ffbd925b24
2024-01-01 22:14:27 +00:00
04af1f0053 I think it we ask for AF_INET6, we get 4+6. Let's do that.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4719 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-31 03:42:07 +00:00
93d9b1ed93 I think we can assume curl on all platforms for tests.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4718 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-31 03:24:20 +00:00
2d73116bc0 Don't free an undefined JSValue.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4717 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-31 03:09:32 +00:00
f2f6d78790 Fine, whatever.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4716 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-31 03:09:15 +00:00
797509fc11 Fix a crash processing TLS while a session is closing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4715 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-31 03:05:52 +00:00
6920504762 Work around this test failure. Dunno.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4714 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-31 02:41:16 +00:00
9d1476a760 Slight memcpy paranoia.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4713 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 21:41:48 +00:00
c1890775dc Fixes for fragmented websocket messages. Android is happy, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4712 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 21:35:53 +00:00
72e5fe5b8f Allow receiving fragmented websocket messages. I thought this was what was breaking me on Android, but it's not.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4711 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 20:35:03 +00:00
c81ec214e2 Missing thread busy indicator.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4710 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 20:34:35 +00:00
0dcc879eb1 Delete httpd.js.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4709 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 19:47:36 +00:00
4f3f4295ea Some HTTP fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4708 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 19:18:09 +00:00
d02f17a8cf I think the new HTTP implementation is basically working, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4707 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 18:59:02 +00:00
2f6a92168e Implement connection activity timeouts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4706 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 16:52:05 +00:00
b6a3923b27 Some quick http refactors to make websockets less magic.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4705 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 16:29:16 +00:00
d556cbc835 Let's start 0.0.15.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4704 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-30 16:08:15 +00:00
f186806117 wiki size fix and allow replying/reacting to blog posts in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4703 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-29 20:13:35 +00:00
f4f560b164 Let's call this 0.0.14. Cut some apps to squeeze in under 5MB.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4702 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-29 19:33:46 +00:00
14b7f9237b A uv_connect_t is not a handle that can be closed. Fixes a crash.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4701 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-29 18:58:58 +00:00
f3518b3d0f Fix some broken tooltips.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4700 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-29 18:12:14 +00:00
7964524e0a Fix websocket unmasking issues. Autotest works with C httpd, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4699 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-29 17:45:07 +00:00
8ab8335baa This is exchanging some websocket messages, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4698 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-25 23:50:55 +00:00
cd43bf9dfa Bugs galore, but this is sending and receiving some websocket messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4697 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-25 23:39:16 +00:00
ccebf831e7 A bit closer to websockets.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4696 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-25 22:53:05 +00:00
9f2f9bd8b0 Fixed some package math.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4695 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-24 22:09:09 +00:00
adf8c14536 Saw a websocket message go across the wire with this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4694 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-24 22:06:11 +00:00
606e82d718 Saw a websocket message go across the wire with this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4693 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-24 21:39:51 +00:00
1621f1753a WebSocket request/response header dance. Feels like the loop is getting close to closed, but I want to refactor everything.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4692 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-24 17:43:33 +00:00
196ab66e14 Treat the ?query string and body the same as httpd.js does. Now I can auth.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4691 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-23 19:52:59 +00:00
38ab32dad9 Fix some http request lifetime issues, and follow the same lowercase convention for headers.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4690 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 17:45:06 +00:00
86046e52f0 One less dynamic http allocation. Also one less crash.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4689 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 17:15:59 +00:00
9e7c860414 Compile fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4688 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 02:06:17 +00:00
7dc8b86ee2 Return legit responses for some static files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4687 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 02:04:20 +00:00
6ecbfe3de6 Sort of barely starting to call httpd callbacks with the new implementation.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4686 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 01:27:57 +00:00
f9940fc436 Add a runtime switch between httpd implementions. One of which is totally not hooked up yet.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4685 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 00:56:16 +00:00
58e75ee276 I think we did some keep-alive.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4684 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 00:13:03 +00:00
e7771f539d Now we're uploading some data.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4683 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-21 00:00:15 +00:00
c2f62cd8e0 Now we're uploading some data.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4682 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-20 23:58:28 +00:00
f4b6812675 Auto-add a content-length header.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4681 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-20 23:13:03 +00:00
03e4b37c04 Make the http test complete successfully.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4680 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-18 17:51:15 +00:00
7b3a9e0f63 Send a valid HTTP response and shutdown the connection.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4679 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-17 17:44:54 +00:00
067f546580 Send a canned HTTP response.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4678 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-14 01:59:23 +00:00
2f7697b7ec These colors were bugging me.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4677 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-14 00:02:18 +00:00
1d214f89ed Work in progress HTTP server in C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4676 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-13 23:59:11 +00:00
0b47207949 Show selected and hovered items in the wiki table of contents.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4675 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-12 17:38:10 +00:00
94dd573a81 Show a tree of wikis and docs in the wiki app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4674 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-11 17:48:08 +00:00
6fa4896155 Fix OpenBSD.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4673 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-10 23:16:00 +00:00
28c99f9d8b We often have alloca.h.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4672 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-10 23:07:05 +00:00
88fbb5f73b Unused code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4671 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-10 01:50:33 +00:00
402c185dd4 Let's be clear about our C standard.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4670 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-10 00:49:53 +00:00
ae2015a604 Add the blog app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4669 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-09 20:25:49 +00:00
023731fc3f Make the wiki app produce the blog title.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4668 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-09 19:35:41 +00:00
99998aac8a Fixed some publicWebHostring UI issues in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4667 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-09 19:26:33 +00:00
360d0bc110 Let the wiki app post blog messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4666 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-09 19:13:06 +00:00
817838e522 Call out a summary and thumbnail for wiki pages, for the purpose of using in blog posts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4665 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-09 18:35:42 +00:00
deb3cfb4b6 quickjs-2023-12-09.tar.xz with Haiku+OpenBSD tweaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4664 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-09 15:18:26 +00:00
af61519632 Compile fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4663 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-07 02:29:30 +00:00
b1714cf554 I think I fixed following calculations, again. Revived the test, though it's still very not thorough.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4662 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-07 02:28:49 +00:00
f0984b19f2 Encrypt wiki docs to all editors..
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4661 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-06 17:48:44 +00:00
eb3c9cd6f3 Compile fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4660 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-06 00:52:47 +00:00
e677b0ac3c Fix tf_min and some crashes in trace. Wow.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4659 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-06 00:40:34 +00:00
dd909bfe53 Give some feedback about encrypted wiki pages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4658 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-05 23:39:45 +00:00
b13b111614 Make privateness of wiki pages sticky.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4657 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-04 17:50:13 +00:00
5511530926 Fix a mention of a renamed make target.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4656 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-03 18:06:50 +00:00
5e1ef01bc0 Support pasting and showing images in the wiki.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4655 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-03 18:03:42 +00:00
a060eadab7 ios build is part of the makefile.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4654 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-03 17:12:52 +00:00
70db31bb8f Add an index_map which can be used to redirect different hostnames to different app paths so that I can host multiple domains of the same device.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4653 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-03 17:03:17 +00:00
1292775a75 Now we're 0.0.14-wip.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4652 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-12-03 16:29:49 +00:00
0fbc84d364 Let's release 0.0.13.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4651 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-29 23:40:04 +00:00
0dd0b835ec wiki new message fix and sorting.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4650 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-27 17:26:02 +00:00
d96e0a7497 wiki cruft.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4649 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-27 17:23:48 +00:00
625504b8eb Fix an httpd error log.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4648 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-27 17:23:31 +00:00
a185ded47e Exclude the sequence number from the request in the response to createHistoryStream and ebt.replicate. I believe I had done this to match a broken client when I implemented it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4647 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-26 18:01:43 +00:00
5a0c77d06a Trim down dist sizes by filtering zip contents more effectively.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4646 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-26 17:36:35 +00:00
e54bd316d5 iOS OpenSSL => 3.2.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4645 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-25 17:40:08 +00:00
f908b45cc7 mingw64 OpenSSL => 3.2.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4644 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-25 17:32:12 +00:00
d02751ee08 Android OpenSSL => 3.2.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4643 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-25 17:30:55 +00:00
13ab9786f7 TIL HttpOnly https://owasp.org/www-community/HttpOnly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4642 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-25 13:25:41 +00:00
ba13a08e78 sqlite-amalgamation-3440200.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4641 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-25 13:21:49 +00:00
8c92a5ff7b CodeMirror 5.65.16.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4640 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-22 18:11:52 +00:00
37f728835b sqlite-amalgamation-3440100.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4639 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-22 18:08:22 +00:00
a6f1eaa09e Put a cap on how many new messages we store browser-side. Unbounded growth is leading to crashed tabs and unresponsiveness.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4638 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-18 15:58:16 +00:00
dff8eca16e lit => 3.1.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4637 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-18 14:01:10 +00:00
a3cca9aae6 Slight wiki formatting tweaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4636 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-16 01:35:36 +00:00
edabd7735c Forgot this file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4635 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-16 01:33:15 +00:00
461e7b7d5a Progress toward generating static wiki pages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4634 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-16 01:33:00 +00:00
06ea8d4781 Have jshint discourage 'var'.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4633 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-15 03:29:39 +00:00
62ef0bcb42 Rename Makefile so it won't seem like it can be run with BSD make or other.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4632 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-15 02:41:05 +00:00
a0043ec49f Fix up links to other wiki-doc pages, and reduce the following depth to improve load times.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4631 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-14 17:38:48 +00:00
305f5232e7 Add a missing order by to fix missing wiki changes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4630 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-13 17:32:15 +00:00
d467c4dd8a Support removing editors, I think, and include wikis from the app owner and from the authenticated user.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4629 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-12 20:17:23 +00:00
5b2ace80d4 Made it possible to add wiki editors.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4628 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-11 13:44:20 +00:00
1484a87cad Fix wiki following, and shows wiki-docs from editors of the wiki.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4627 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-11 02:22:53 +00:00
b23bc0b16b Trying to work toward multiple users. List wikis of people you are following. Also hook in to the lit updated event.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4626 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-09 17:39:05 +00:00
a6c8dd846c Put verbose messages on a command-line argument, finally, and format the messages a bit better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4625 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-09 00:28:34 +00:00
5fff3b8161 Following asan fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4624 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-09 00:08:04 +00:00
b4236d0ec0 Show names in the id picker.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4623 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-08 23:51:54 +00:00
5e8cd12760 Latest libsodium-1.0.19-stable.tar.gz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4622 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-08 23:17:32 +00:00
699438602c Make import and export commands complete reliably.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4621 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-08 23:03:21 +00:00
52aa6eed0d Builds for OpenBSD!
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4620 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-08 03:36:08 +00:00
6cdf207dcd Encrypt draft wiki blobs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4619 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-08 01:58:02 +00:00
607e9ef71b Show more information about encrypted messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4618 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-08 01:43:58 +00:00
367c489fc3 Hide wiki things that don't apply when you're not logged in.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4617 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-07 23:34:55 +00:00
b3c9ad2fcb Two wiki fixes that I've redone multiple times. :/
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4616 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-07 23:31:12 +00:00
ee9cb63327 libuv 1.47.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4615 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-07 17:30:39 +00:00
889773c38d Re-hook up all the wiki-related modification events.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4614 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-06 00:59:30 +00:00
b83704a218 Fix a runaway thing in journal, too, same as wiki.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4613 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-05 23:26:54 +00:00
dfe5d51d04 Fix a death spiral.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4612 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-05 23:25:55 +00:00
280dee0438 Might as well benefit from a little parallelism.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4611 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-05 23:05:26 +00:00
aa10ab69f6 Hitting some limit with following too many people. Working around it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4610 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-05 13:07:07 +00:00
6ef14d985d Maybe avoid increating load with the wiki app as requested accrue.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4609 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-05 01:07:08 +00:00
61a3226e14 Fix some wiki issues I found while making journal.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4608 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-04 23:03:14 +00:00
f9c370212b Add the journal app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4607 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-04 18:15:58 +00:00
021f3ad5bc Fix wiki doc confusingly and incorrectly being pre-selected.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4606 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-04 16:52:49 +00:00
8bdc27bf5c lit => 3.0.2.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4605 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-04 16:37:12 +00:00
00eb5222f8 Fumbling with wiki some more.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4604 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-04 16:32:21 +00:00
d06f490cc2 Work in progress wiki simplification, I hope.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4603 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-04 02:00:35 +00:00
b087a09d37 Fix blocking the same way, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4602 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-03 00:49:17 +00:00
4cedc54d2d Reworked some following math.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4601 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-03 00:45:30 +00:00
8fe7adc50e wiki: Make it possible for links to work. Minor cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4600 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-02 01:43:32 +00:00
bf5236e68b collections -> wiki
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4599 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-02 01:20:15 +00:00
da1d686705 Some fixes around drafts, and set the app icon.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4598 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-02 01:19:14 +00:00
2ce5bc73d5 Drafts. Boom.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4597 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-02 00:45:20 +00:00
c6ae9313cc More wiki layout/navigation fixes, and use markdown for the wiki.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4596 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-02 00:29:07 +00:00
8f3883563f Close to the general experience I want for editing wiki pages. Bugs galore.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4595 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-01 23:39:34 +00:00
950273da41 If you can get all identities, you might as well be able to see the identities of the owner of a package.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4594 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-01 23:10:29 +00:00
391da742fd Collections progress.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4593 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-01 22:21:42 +00:00
4414676076 sqlite-amalgamation-3440000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4592 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-11-01 22:00:08 +00:00
0da45b7b40 lit => 3.0.1.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4591 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-30 16:42:30 +00:00
7e02cb90f6 Use ssb.following() in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4590 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-30 16:18:07 +00:00
01ba90fdba Add a work-in-progress collections app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4589 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-30 00:22:30 +00:00
b394140f9e Expose ssb.following to JS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4588 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-29 19:05:32 +00:00
4a1d136721 Report 'haiku' as a platform, and don't bind to :: on it, because that doesn't seem to be working.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4587 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-26 16:41:57 +00:00
ab3009f771 This seems to be a safer way to generate version.h.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4586 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-26 03:03:25 +00:00
bf340f3de4 Working on 0.0.13.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4585 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-26 02:59:37 +00:00
68f5827dee Builds for Haiku.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4584 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-26 02:56:33 +00:00
b695a4ba3b Sort issues open first, and show checkboxes for open/closed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4583 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-25 23:13:46 +00:00
d84ab2734e This is 0.0.12.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4582 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-25 22:31:29 +00:00
4f0cc793c7 mingw64 OpenSSL => 3.1.4.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4581 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-25 21:56:29 +00:00
b7a4ac22b2 OpenSSL => 3.1.4 for iOS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4580 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-25 21:46:16 +00:00
5db9acae1d Android OpenSSL => 3.1.4.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4579 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-25 16:45:38 +00:00
c299c1432c Report more platform names, and clean up blobs on default on iOS like on Android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4578 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-25 16:41:39 +00:00
d8551ab732 sqlite thread safety back on. Trying to fix a weird issue.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4577 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-24 01:34:59 +00:00
25bc1279c2 This is how we bind sqlite variables by index.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4576 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-24 01:27:35 +00:00
f6d9d23456 Test docker before release.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4575 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-24 00:30:07 +00:00
b20d95d616 Ugg, don't clean up just-added app file blobs. Need a better solution for this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4574 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 19:33:04 +00:00
071c2f1c20 This looks like it could miss files on import.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4573 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 19:25:52 +00:00
566d00f0df Put the native executable in the lib directory, to appease recent R^X requirements, and bump the Android target version back up to 34.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4572 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 18:52:20 +00:00
0550aa4e98 Oh for crying out loud. Android started disallowing executing files from the private data directory in SDK 29.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4571 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 18:07:23 +00:00
baf69355a5 Target android min sdk version 24 (the lowest that libuv claims to support), and specify the target SDK version as 34.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4570 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 17:51:16 +00:00
17c0266998 Lower android min sdk version to 26, and use libuv's random code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4569 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 17:26:53 +00:00
14a2207064 Add a Server: header.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4568 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 12:44:12 +00:00
7c721fc6eb Add an emoji of the day to gg, and add a tropical fish for reasons.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4567 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-22 00:11:14 +00:00
ab03692a4c Lay out the profile editing form better so it feels less janky.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4566 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-21 21:31:46 +00:00
626fa4f27b Address some lifetime issues in the single-process case.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4565 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-21 19:47:47 +00:00
15676e0f4f Resize on rotation on iOS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4564 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-21 18:32:23 +00:00
8709ce8ad5 Added a missing filesaver.min.js.map file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4563 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-21 12:53:31 +00:00
bb924d79d6 Bring back logs on macos.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4562 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-21 02:12:27 +00:00
8e075e33d9 Work around log obfuscation on iOS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4561 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-21 00:56:00 +00:00
b0b002104a Updated libbacktrace to latest.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4560 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 20:11:01 +00:00
43d1f34fa3 Build separate arm+x86 android APKs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4559 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 19:46:20 +00:00
6db1a097aa Add a button in the profile editor to ask the server to follow you. I'm hoping this helps replicating accounts that are otherwise difficult to discover.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4558 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 14:37:24 +00:00
6dae2f0749 Expose the server's public key. Going to use this to make local accounts visible externally and also to make it easy to show the room link.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4557 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 12:55:05 +00:00
dc87c26b99 Missing files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4556 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 01:40:58 +00:00
234d597083 Bump some android SDK versions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4555 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 01:10:58 +00:00
b74c347c7c Fix some issues with multiple supported android architectures.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4554 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 00:54:55 +00:00
996996e609 Mention some other platforms in the README.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4553 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 00:25:51 +00:00
cd9050f61f Quiet zsign, and simplify an ifdef chain.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4552 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 00:16:01 +00:00
b70b309977 Fix the windows build, and update its OpenSSL to 3.1.3 like the rest.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4551 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-20 00:13:00 +00:00
ee510f3f3f Got the APK sizes down again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4550 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 20:21:17 +00:00
8a70b8ea3e Trying to bring the APK size down again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4549 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 19:47:55 +00:00
27ee73bb89 jshint.js -> jshint.min.js.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4548 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 19:46:48 +00:00
3aeb47e447 Set the iOS app icon.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4547 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 19:21:13 +00:00
b9ceb30ecf Sign when we're building the .app, but only on Linux. Support building .ipa files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4546 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 19:18:16 +00:00
5b6ee20b2d To make the black bars go away, you have to specify a launch image. Should be a storyboard, but not now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4545 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 18:52:56 +00:00
d062ec0dfe Helper for building and installing on iOS, because I keep forgetting.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4544 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 18:21:36 +00:00
d5a0daa0d3 Target an old enough iOS version to ignore deprecation issues for now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4543 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 18:06:32 +00:00
8c4ec71e26 Retry the webkit load until we've connected to the server.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4542 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 18:05:34 +00:00
1e5aa0ba93 Same iOS version min.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4541 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 13:10:34 +00:00
0326a1f8cc Quash these warnings on macos, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4540 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 12:41:43 +00:00
8311404a09 More layout and wordsmith-ing of welcome.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4539 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-19 00:53:14 +00:00
c81111c2cf More welcome tweaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4538 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 20:57:41 +00:00
e499be12ae Welcome updates.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4537 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 20:49:53 +00:00
e785f7f10a A welcome app?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4536 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 18:54:37 +00:00
c3da10bef6 Saving non-UTF8 sort of works.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4535 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 17:51:26 +00:00
c8c8cb305e Fix an android startup crash.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4534 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 16:58:11 +00:00
efdd046ef8 Silence some warnings.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4533 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 14:46:58 +00:00
496eefd2ee Whoops. Fix android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4532 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 14:39:20 +00:00
9da79b3a21 I think I made all build types conditional on having the appropriate build tools available, and make all make everything currently possible.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4531 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-18 14:24:44 +00:00
1b2b0970fb Give android its own main, like ios, so we can deadstrip some things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4530 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-17 22:43:13 +00:00
0bb45a7fa8 Whoa. Allow building the ios executable on Linux.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4529 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-17 22:25:31 +00:00
15a25a41aa Add some deps I apparently missed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4528 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-17 22:06:41 +00:00
76b6ff78cd File drag and drop, sort of.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4527 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-17 21:37:42 +00:00
5285b3f222 Fix the build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4526 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-17 01:30:38 +00:00
0c993c251b Implement prompt, confirm, and query for ios.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4525 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-16 14:16:21 +00:00
b3a1f17452 Add apple.py, fix some global initialization on iOS, and add some missing bundle-related files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4524 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-16 13:57:40 +00:00
11929e8c68 iOS makefile tweaks to build more .app bundles.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4523 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-15 18:06:31 +00:00
fc9a081250 Need to find an alternative to uv_process_kill when using one process.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4522 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-15 17:43:08 +00:00
2583221117 I guess this works? Not sure what's wrong with AF_UNIX on iOS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4521 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-15 17:42:04 +00:00
a69e551968 Added some questionable support for running everything in one process, because iOS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4520 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-15 17:33:36 +00:00
8bd0027e71 Enough glue to load a web page from our web server in the iOS simulator. Next challenge is uv_spawn: permission denied.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4519 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-15 16:55:25 +00:00
84eaa3e2fd Now it builds for ios with some objective-c.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4518 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-14 02:11:20 +00:00
a57916b3db Link something for iossim.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4517 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-14 01:56:40 +00:00
87e769786a Forgotten file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4516 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-14 01:37:34 +00:00
05a7e941cf More starting diagnostics on android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4515 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-13 01:14:13 +00:00
ed307e6b3b Oops, don't call xcrun on linux.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4514 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-13 01:13:35 +00:00
e8aa957209 :O This builds an app which brings up the web site in the simulator.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4513 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-13 01:09:15 +00:00
a39f820ff1 Oops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4512 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-12 01:33:49 +00:00
1c621a602f This builds an executable for ios.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4511 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-12 00:29:17 +00:00
7169f4a6cb ios64-xcrun openssl build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4510 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-12 00:19:16 +00:00
e202c1a40e Make some buttons bigger.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4509 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-11 19:26:52 +00:00
0f4b4da0aa OpenSSL 3.1.3 built for android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4508 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-11 18:44:50 +00:00
1f96413bd3 A few places I missed tracking busy worker threads.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4507 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-11 16:43:48 +00:00
9695621c91 Lit 3.0.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4506 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-11 16:00:38 +00:00
2d67f5ead6 sqlite-amalgamation-3430200.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4505 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-11 15:52:41 +00:00
29d2a45abc Move reading settings from the database off of the main thread. It now happens periodically in a worker, which means I don't think there's anything blocking the main thread anymore.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4504 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-11 15:44:40 +00:00
13c8b05f9a Moved connections DB access to worker threads. I think global settings access is the only remaining thing on the main thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4503 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-10 01:11:32 +00:00
2c1a5359c6 Show more context in the Android app when starting the server.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4502 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-10 00:46:17 +00:00
d8530f228e EBT replicate to the worker threads. Almost there.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4501 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-08 16:17:56 +00:00
575f6c2f0a Move blob wants to the worker threads.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4500 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-08 15:40:20 +00:00
62cdc592c0 Move sending history streams to the worker threads.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4499 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-08 15:14:42 +00:00
11373faf23 Log during -t=bench every database access from the main thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4498 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-08 14:25:22 +00:00
0473eec0a2 Remove DB work from tf_ssb_notify_message_added, which runs on the main thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4497 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-08 13:52:49 +00:00
7fc23dc085 Try all supported ABIs for the executable on Android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4496 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-07 13:01:21 +00:00
c741cc06b2 Exclude the 32-bit executables from the APK for now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4495 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-07 12:45:45 +00:00
39dbfdec82 If we can't parse the port file, try again. Maybe we are catching it between create and write?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4494 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-07 12:38:30 +00:00
0e5d6056e4 codemirror 5.65.15.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4493 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-05 00:56:26 +00:00
d711993b3b I need to configure libsodium better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4492 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-05 00:52:59 +00:00
615bf7fe43 Fix the build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4491 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-05 00:39:57 +00:00
424b9b5a2f libsodium-1.0.19-stable.tar.gz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4490 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-05 00:32:37 +00:00
d1e494b730 More docs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4489 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-05 00:24:33 +00:00
623e4b8fff Oh yeah, we're working on 0.0.12.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4488 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-05 00:14:36 +00:00
b5dd1f2f86 Fix macos build again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4487 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-04 23:41:30 +00:00
ec83f9c747 Fix things building on linux again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4486 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-04 23:38:42 +00:00
31af27529e This compiles on macos for x86_64, at least.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4485 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-04 23:20:57 +00:00
6302565942 Store app blob history.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4484 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-10-04 22:57:39 +00:00
cda724b2da Some gg snapping fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4483 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-29 02:27:41 +00:00
c2e2ba2a40 Actually include the 32-bit executables.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4482 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-29 00:32:22 +00:00
b5d3f5faa7 This builds for 32-bit android. Untested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4481 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-29 00:07:34 +00:00
71f3910055 More deadstripping.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4480 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-28 00:32:52 +00:00
70ed8c3b32 How did these get removed?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4479 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-27 22:39:01 +00:00
af13bfc920 Let's release 0.0.11.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4478 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-27 22:26:19 +00:00
e24fd92f85 OpenSSL 1.1.1w for Android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4477 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-27 22:23:52 +00:00
7e27cefe6a This made 32-bit happier.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4476 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-25 16:43:56 +00:00
450cf6424e Oops! Passwords go in password fields.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4475 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-23 21:29:01 +00:00
54898d3dbb More thorough checkpoint.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4474 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-23 18:49:24 +00:00
dd851a2b25 Let's try some wal truncating.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4473 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-23 18:41:58 +00:00
4c6b44eb30 Implemented password changing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4472 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-22 22:59:26 +00:00
74a3efe78d Let's restrict valid usernames.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4471 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-22 22:41:47 +00:00
51301fc49e More room robustifying?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4470 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-22 22:20:25 +00:00
02dd8c3dd0 Try to isolate my instability with go-ssb-room. I guess I did? Haven't found a resolution.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4469 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-21 23:38:55 +00:00
26a778c3b2 Might as well make the case consistent.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4468 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-21 00:40:47 +00:00
9fecbd97e8 Autocomplete blob refs. That's too cool.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4467 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-21 00:26:29 +00:00
e1383e3903 Move the HTTP timeout into C where we can manage it better as writes are active. Fixes an accidental 45 second GET timeout from httpd.js.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4466 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-20 23:30:29 +00:00
47532b8512 Snapping to grid.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4465 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-17 20:52:12 +00:00
3c4959433a Proof of concept of building emojis.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4464 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-17 13:22:29 +00:00
e921b4a86a Actually serialize doubles. Yikes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4463 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-17 00:13:31 +00:00
b23b0ca239 Some include-what-you-use progress.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4462 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-13 23:39:52 +00:00
191b45f054 Better map link.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4461 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-13 23:01:15 +00:00
15d0383349 api docs work in progress.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4460 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-13 23:00:47 +00:00
d2485583fd sqlite-amalgamation-3430100.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4459 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-13 21:19:37 +00:00
2b94704916 If a user visiting /login is already authenticated, bounce them away. This is me trying to avoid hassle for people who bookmarked the login page.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4458 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-11 16:52:17 +00:00
85ac6c215a Populate host and port for incoming SSB connections, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4457 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-09 14:45:55 +00:00
e83e665db9 Try harder to not reply to errors. Dunno.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4456 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-09 14:28:06 +00:00
645aafef16 zlib 1.3.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4455 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-07 22:44:49 +00:00
152c893a6f Fix wrong argument count on ssb.blobStore.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4454 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-07 22:44:18 +00:00
7c130dda56 Beef up the API docs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4453 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-07 00:40:43 +00:00
2d82dad806 Restore the connections tab.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4452 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-06 22:48:06 +00:00
e8ac5b759d Fix emoji search case again, and render issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4451 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-06 22:35:20 +00:00
4833d18968 Fix android app version.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4450 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-05 16:21:28 +00:00
6eafded1f6 Added the memory sparkline and tried to CSS them differently.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4449 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 20:13:17 +00:00
7b440b720e Set issues app icon.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4448 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 19:47:07 +00:00
e20ba7384f Put the latlng popup on the contextmenu event.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4447 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 19:26:48 +00:00
45231c6ede Add some GPS game tabs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4446 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 19:21:00 +00:00
35475defb5 Faster activity load through concurrency.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4445 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 18:01:06 +00:00
8741841f27 Add the missing leaflet .js.map file. Link to Google Maps from clicked map locations. Allow poup from the sandbox to support target="_blank" links, though that does not work here.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4444 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 17:44:05 +00:00
5282d19b55 Structure replies to issues as replies so that their posts don't appear so unusual.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4443 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-04 17:12:32 +00:00
d9782aa0fb Automatically reply encrypted to the same recipients.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4442 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-02 13:37:50 +00:00
9751facfb4 Add recps field to encrypted messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4441 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-02 13:25:31 +00:00
e0110203e7 More reliable addition of encrypted messages. There's something I'm not understanding with lit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4440 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-02 02:06:29 +00:00
088b44cc2c Fix the admin app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4439 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-01 16:26:24 +00:00
8f63bcbfbf Sending encrypted messages. Revealing some weird behavior, but it's working.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4438 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-09-01 01:34:01 +00:00
c8029388c9 Blockquote and connections tab tweaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4437 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-31 16:46:40 +00:00
d9c4d847a1 Fix Strava account linking.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4436 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-31 16:31:24 +00:00
df9d9425ec Add issues app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4435 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-31 00:12:18 +00:00
90bb3c684e OK, no -fanalyzer on raspi, yet.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4434 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-30 23:58:01 +00:00
9c81b6de8a This should have gone away in a previous change.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4433 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-30 23:50:28 +00:00
6383498041 Oops. Makefile debugging.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4432 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-30 21:38:59 +00:00
daeb88785d Let's try -fanalyzer.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4431 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 20:57:55 +00:00
dcea08f73b Enforce a timeout on user SQL queries.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4430 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 20:23:40 +00:00
b252b921f8 Call out restricted DB access when we acquire the reader.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4429 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 19:41:54 +00:00
172826bf13 Use the right default port now that I'm not always running two different clients side-by-side.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4428 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 18:51:14 +00:00
060f1980f5 A little more paranoia around the file watcher.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4427 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 18:27:19 +00:00
e223d35252 Make the connections tab know more about tunnels and such.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4426 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 18:22:09 +00:00
99dba1a4c6 svn didn't notice that these files changed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4425 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 17:19:59 +00:00
b52026c81f Give quoted text a bar on the side, like I'm used to.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4424 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 17:06:32 +00:00
47b8c86426 sqlite-amalgamation-3430000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4423 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-25 16:20:32 +00:00
2e55c68648 Get ready for 0.0.11.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4422 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-23 22:40:00 +00:00
b7362dd84d 0.0.10.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4421 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-23 22:37:15 +00:00
01637b31e1 Let's release 0.0.10.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4420 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-23 21:55:22 +00:00
0e9a39608a Exclude gg from the release.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4419 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-23 21:54:43 +00:00
79404e4d41 Set android min sdk version and api version all to 28. That's all we need. Should fix reported crashes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4418 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-23 21:37:23 +00:00
35c21fbdaf No really, specify the API version for android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4417 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-23 02:16:22 +00:00
8c7bd7dc11 Fix windows build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4416 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-22 16:49:42 +00:00
09ad4f0320 More callstacks on android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4415 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-22 16:48:12 +00:00
d96b836bef Better lifetimes still in the Java code, and turn on some strict vm policy messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4414 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-22 16:43:04 +00:00
59b2ffaf95 Ohh, Java does scoped resources.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4413 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-22 02:45:22 +00:00
f1b55ddd64 Attempt to track requests better. New requests need to be flagged as such. Still trying to chase tunnel instability.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4412 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-20 19:55:59 +00:00
85acac3a30 Save more context about closed connections, and include the timestamp.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4411 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-20 18:36:46 +00:00
befff5c1e5 Apps are not allowed to read directly from the blobs table.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4410 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-20 18:26:26 +00:00
d72ba81a67 Try to respond to tunnel errors I'm seeing instead of forwarding them over the tunnel, which obviously won't work. Allow creating multiple connections to the same ID if it's for the sake of a tunnel. I think this explains timeouts I'm seeing with tunnels. More error handling, too. C'mon, fix tunnels.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4409 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-20 18:25:15 +00:00
fef88e2032 Prevent the watcher's finalizer from being called before we're done with it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4408 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-20 11:25:49 +00:00
20557e8ce4 Respond better when somebody disconnects from us with a tunnel. Trying to robustify tunnels. This is largely untested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4407 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-17 16:54:33 +00:00
99c905e908 Fix build with the removal of split.js.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4406 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-17 00:50:22 +00:00
d7b58ee2c5 Support an edit-only mode, which brings up the editor without running the app. Helpful if the app hangs the client. Also on mobile, where both don't fit side-by-side.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4405 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-17 00:49:02 +00:00
faca2d387b Calculate thread busyness as the current concurrent running threads vs. the max number of threads ever seen running concurrently.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4404 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-17 00:01:59 +00:00
358d02d97f Another index I've wanted, and better error display for queries in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4403 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-16 22:57:16 +00:00
b66dac7465 Add an SQL query tab.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4402 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-16 22:48:59 +00:00
f7d201859a Use the sqlite authorizer for async requests, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4401 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-16 22:43:08 +00:00
61d2ef5469 Yeah, the ping comes in a later message. Whoops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4400 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-15 23:56:58 +00:00
ac994b9c62 Were we not responding to ping?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4399 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-14 16:26:06 +00:00
264dcbc331 codemirror 5.65.14.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4398 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-13 01:11:14 +00:00
e5425c0ffb Apparently the MUXRPC maximum segment size is 4096: bd350c6f9e/boxstream/box.go (L23). Reducing the send size seems to keep me connected to/through rooms longer.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4397 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-12 19:57:00 +00:00
e10803de68 Fix GPX upload.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4396 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-12 18:37:15 +00:00
07b1a0e403 Fiddling with login CSS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4395 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-12 11:54:27 +00:00
6ed2c702d8 Hide too-new messages, and cycle between message, raw, and markdown views of messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4394 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-09 23:39:17 +00:00
5c1c33d33e Put the release process in the makefile, and including building the tarball contents to avoid another snafu.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4393 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-09 23:14:16 +00:00
70d37c88b5 Redo auth flow with lit. Beef up the test a bit, accordingly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4392 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-09 22:38:41 +00:00
1ba37d95b5 More concise wait.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4391 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-07 16:13:02 +00:00
0d82198849 Remove old, broken drag+drop code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4390 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-06 12:03:37 +00:00
39927e75f2 Attempt to support .gpx files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4389 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-06 12:03:22 +00:00
e6fd33b969 Sure, let's add GPS game.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4388 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-06 00:26:56 +00:00
e8fe32d5af Fix a crash on android three different ways?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4387 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-05 03:10:24 +00:00
bfc8bb864d I suspect this is necessary to prevent sending an error when we get the final response to blobs.get.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4386 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-05 02:30:45 +00:00
9179746763 Freaking CSS. Trying to make the admin page...work.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4385 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-05 01:22:27 +00:00
d0177d24cb Clean up some test cruft.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4384 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-04 23:44:48 +00:00
0573008c9c Set some blob auto-delete option defaults on android only.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4383 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-04 23:35:02 +00:00
9506f518c2 +x and shebang
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4382 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-04 23:33:57 +00:00
0f0ae9153b lit-html 2.8.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4381 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-04 23:10:53 +00:00
09c7c8ac64 GPS game.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4380 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-04 23:08:16 +00:00
5e2dfff148 Remembering permissions never worked???
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4379 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-04 00:50:13 +00:00
958b47548d There, I can wait for a thing in a shadow root like I want.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4378 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-03 00:44:35 +00:00
16155ef746 Automated enough with selenium to be able to create a Tilde Friends account, create an SSB identity, and post a first message. I'm still confused on some things, but this is progress, and I fixed a longstanding issue creating the first identity.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4377 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-03 00:30:48 +00:00
5755b61ea6 Oops, one more reference to smoothie.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4376 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-08-02 16:25:41 +00:00
353847a77f Remove the smoothie graphs. The sparklines are too good. I will rebuild whatever I'm missing with these.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4375 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-31 16:32:21 +00:00
bdf64edeb8 Expose the client's requesting URL to apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4374 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-31 00:26:09 +00:00
b5768dd927 Capture (almost) all worker thread time.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4373 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-29 22:29:09 +00:00
3e5abf3a4d Enable auto vacuum.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4372 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 12:22:37 +00:00
d3029639de We can't exclude libsodium's version.h!
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4371 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 12:22:16 +00:00
d21d7e4add Delete more aggressively.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4370 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 03:04:49 +00:00
afde69b5d9 Took a whack at cleaning up old blobs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4369 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 02:51:42 +00:00
3319df3df0 Oh yeah, I was playing with the follow app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4368 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 01:47:50 +00:00
1102feaac3 speedscope 1.16.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4367 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 00:42:51 +00:00
deede728be Now we're 0.0.10-wip.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4366 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 00:37:09 +00:00
fc3dd84122 Let's release 0.0.9.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4365 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-27 00:00:53 +00:00
9239441d73 Fixed duplicate tags.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4364 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-26 23:56:40 +00:00
b984811851 Don't shutdown the client side of an HTTP request after sending it. Some servers don't like that.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4363 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-23 01:23:44 +00:00
1c52446331 Use picohttpparser for responses, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4362 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-23 01:12:11 +00:00
b6dffa8e66 Actually return the blob ID from store.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4361 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-22 01:33:28 +00:00
315d650d27 Same bug twice.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4360 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-22 01:33:06 +00:00
07c121044a Fix a crash uploading blobs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4359 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-22 01:24:58 +00:00
f3169afcf5 Do a silly thing to show dependency versions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4358 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-20 05:15:44 +00:00
c371fc2a8e Fixed multiple trace problems.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4357 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-20 05:06:15 +00:00
6889e11fd1 Minor cleanup. Missing traces.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4356 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-20 02:20:38 +00:00
fb73fd0afc Make storing messages async. Phew.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4355 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-20 01:02:50 +00:00
6fcebd7a08 Nope, do the thing from the right thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4354 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-19 00:58:20 +00:00
15ea62a546 Trace all the async things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4353 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-18 23:56:20 +00:00
b0cd58f5aa Make blob store actually not block the main thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4352 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-18 23:46:15 +00:00
7fe8f66fd3 Yikes. I broke appending?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4351 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-18 00:59:25 +00:00
68ca99e9d9 Remove some unnecessary code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4350 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-18 00:52:08 +00:00
a2542c658b Better tag enumerating.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4349 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-16 23:41:41 +00:00
eb203c7e62 Don't put a JWT in core.user.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4348 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-16 22:03:47 +00:00
6ef466f3ed Fixed enough thing sto be able to authenticate and get data from Strava.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4347 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-16 21:04:48 +00:00
5074246462 Listening on IPv6 + IPv4 by default.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4346 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-16 14:04:45 +00:00
73bbcebddb Brushing off enough dust to be able to initiate HTTP requests from the server.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4345 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-15 01:48:36 +00:00
18128303b6 Appending a message produces the ID. And bump the version.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4344 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-13 00:20:12 +00:00
c4a2d790a3 Expose creds to request handlers.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4343 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-13 00:00:41 +00:00
c1ec150696 SHA256 was sticking out on a profile, so don't unnecessarily hold the DB writer while we're doing that.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4342 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-08 13:43:44 +00:00
f4b856df15 Expose parsed query args to request handlers.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4341 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-08 13:33:34 +00:00
85b87553dd Avoid SQL logic error in blob replication.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4340 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-07 12:08:14 +00:00
5decdf3afa Better tags query.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4339 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-06 00:37:16 +00:00
a4acee4939 Fix a stall where we would process one scheduled task and then leave the rest until we wake up again from network traffic.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4338 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-06 00:35:39 +00:00
d06aea2831 Expose versions of dependencies.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4337 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-05 01:06:59 +00:00
ae0a8b0a33 libuv 1.46.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4336 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-07-04 00:24:48 +00:00
f0452704a1 speedscope-1.15.2.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4335 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-29 00:25:25 +00:00
b8b1f1ba80 Confused by this message. Add more context.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4334 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-29 00:17:32 +00:00
caf7478da4 Ugg, release .apk pls.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4333 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-28 23:29:56 +00:00
0e40ba78a4 Update lit to 2.7.5, and make building the .apk part of the release.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4332 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-28 23:28:59 +00:00
d1eac6c9eb Hook up android version numbers, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4331 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-28 23:23:29 +00:00
8f5201b2bc Show a version number in the UI. Automate things so that the version number originates from the Makefile. Get ready for 0.0.8.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4330 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-28 23:00:34 +00:00
6022001d66 Primitive display of recent channels/tags and the same on messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4329 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-22 00:27:27 +00:00
f018c367ed Don't automatically add mentions for incomplete &/@/% links.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4328 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-17 14:30:17 +00:00
48c47f097a This seems to fix losing sizes when attaching files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4327 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-17 14:23:32 +00:00
39ac215b5a Store blobs from the worker threads. Let's see if this is a good idea.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4326 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-17 14:05:23 +00:00
7d562ce85c Allow the DB writer to be used from a worker thread. Not well tested, just still trying to charge forward on moving all blocking work off the main thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4325 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-15 00:27:49 +00:00
51b317233a First rough-out of a mentions tab in the SSB app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4324 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-14 22:51:58 +00:00
87ce715011 This appears to let me shrink the sparkline graphs. Freaking CSS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4323 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-14 22:23:22 +00:00
ef5afc1e23 Minor cleanup while pondering syncing faster.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4322 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-14 21:59:04 +00:00
486212f22a Fix expanding messages on the search tab. Maybe this should happen at another level.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4321 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-14 16:39:08 +00:00
0e8867dd6e Attempt to tie subprocess lifetime to the android activity.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4320 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-08 00:51:34 +00:00
ca28b5ca82 Delete some code that doesn't need to exist.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4319 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-01 22:53:44 +00:00
19e26c1759 Support setting publicWebHosting, and kill some unused code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4318 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-06-01 22:21:14 +00:00
790f6643a4 Mostly fumbling with error handling.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4317 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-27 16:51:56 +00:00
2158ad3c0b sqlStream => sqlAsync
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4316 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-24 00:10:05 +00:00
d904d8922f Oops, no verbose.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4315 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-23 23:36:21 +00:00
da50792500 Avoid chunked content encoding. Some WebViewClient debugging. Doesn't go to a blank screen on android so much.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4314 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-23 23:26:07 +00:00
b4629acc48 Ugg. libuv and io_uring and android: https://github.com/libuv/libuv/issues/4010.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4313 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-23 23:06:59 +00:00
0cf4118330 Remove Socket.info.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4312 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-23 22:47:25 +00:00
dd61a6ecc3 Report which method was not found.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4311 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-23 22:16:07 +00:00
8e6f1284e1 Show the edit pane before it finishes loading so that it's more clear it's working.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4310 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-23 22:03:17 +00:00
813d3cd492 Lit Element 2.7.4.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4309 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-21 21:46:32 +00:00
f421606e21 libuv 1.45.0, #include cleanup, probably something else.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4308 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-21 21:36:51 +00:00
1ccb9183b4 Don't mess with websockets when we're returning a document from an app's handler.js.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4307 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-19 19:57:40 +00:00
7d9b627f37 Report attempts to call tfrpc methods that aren't registered.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4306 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-19 19:47:33 +00:00
3038138909 This is a sketch of a setup that allows apps to produce sandboxed dynamic content without all the iframe/websocket business.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4305 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 20:22:13 +00:00
2ca08d21e4 I broke magic byte detection, and missed some Content-Security-Policy opportunities.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4304 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 18:57:56 +00:00
478e96fc5f Just moving HTTP code around.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4303 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 18:35:58 +00:00
e237c7ea1d Remove valgrind hooks. In this house, we use asan and custom allocators. Smaller.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4302 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 18:24:10 +00:00
bf9ff088fd Handle unsuccessfully decrypted messages, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4301 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 16:57:43 +00:00
e073ebedd1 sqlite-amalgamation-3420000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4300 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 14:15:29 +00:00
10d4ae7dcc Decrypt messages in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4299 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-17 14:10:49 +00:00
5b8bdbb3e4 Today I discovered the "Content-Security-Policy: sandbox" header.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4298 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-14 19:46:01 +00:00
c807e21c6b Don't let browsers render untrusted HTML or SVG outside of the iframe. Do let them fetch JS and such.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4297 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-14 19:31:45 +00:00
cc92d0e316 Simplify magic bytes lookup slightly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4296 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-14 18:47:19 +00:00
09c396d5a3 Default the files panel to expanded.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4295 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-14 18:05:28 +00:00
bc5bbca951 Remove importing and export from the ssb app. I like it better as the separate sneaker app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4294 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-14 18:02:56 +00:00
ed4faedcd7 Report some information when importing messages and discover an old verification bug.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4293 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-11 00:22:42 +00:00
251556ebed Sneakernet, here we come.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4292 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-10 23:52:46 +00:00
1324afb459 Zip export still had stringified content.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4291 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-10 01:52:34 +00:00
1119804fc2 Whitespace.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4290 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-10 01:47:58 +00:00
cdf6440197 Uncommit unintended part of previous change.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4289 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-10 01:47:20 +00:00
8727fe00af Return something from ssb.storeMessage.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4288 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-10 01:45:37 +00:00
7da7890bb6 Work in progress zip import/export.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4287 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-10 01:30:15 +00:00
706bd2c51f Save some space + more deterministic with relative paths for debug info.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4286 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-04 00:44:32 +00:00
acabec940e Make emojis.json much smaller.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4285 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-04 00:32:50 +00:00
470b998b61 Add a vector launcher icon. Currently the smiling face with sunglasses emoji from openmoji.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4284 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-04 00:04:43 +00:00
80fad05f23 Show latest value on the spark line graphs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4283 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-03 23:37:02 +00:00
07a912fb9a Files pane => lit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4282 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-03 23:12:34 +00:00
e9d83262c4 Sparkline graph tweaks. Minor cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4281 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-03 22:47:00 +00:00
74323c22f9 I think this lets me load more pages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4280 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-03 22:32:21 +00:00
2614e89b1b Actually update to lit 2.7.3.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4279 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-02 16:50:26 +00:00
e092fe1399 Updated lit, starting to improve the display of mentions during editing, . to refresh, and probably some other things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4278 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-05-02 16:47:27 +00:00
9cbe895cb8 Exclude .map files from the APK to squeeze them under the blob size limit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4277 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 13:24:01 +00:00
b0b0f74e83 Eek out a little more space on Android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4276 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 12:17:13 +00:00
d9eaa92c37 Messing with graph sizing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4275 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 12:00:50 +00:00
566d07117e Fix the android build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4274 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 11:48:16 +00:00
2bffdb1168 Thought I had a fundamental UDP broadcast problem, but it was just bad setup in the test.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4273 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 03:18:12 +00:00
1359b48c9f Turn on -Wdouble-promotion. Why not.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4272 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 03:00:57 +00:00
a69fb5eeac I think this fixes posting.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4271 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-30 00:56:59 +00:00
38e313350e Trying to make the navigation bar resize right, but CSS doesn't like me.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4270 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-29 20:49:06 +00:00
5052dc04f2 Added spark line emojis and fixed some things about their rendering.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4269 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-29 19:46:33 +00:00
9ef3a3aca0 An experiment: Always show some stats as little sparklines at the top of the screen.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4268 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-29 19:27:00 +00:00
7b91a2ec37 Navigation bar => lit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4267 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-29 18:23:08 +00:00
2926f855a1 Start using lit element in the main web interface. It's getting out of control, and if I can finish a refactor, it will reel it in.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4266 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-29 16:52:35 +00:00
639419db60 Oh freaking heck. This fixes the black bar at the bottom of the screen on Android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4265 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-20 00:24:12 +00:00
54747c127c Ugg. Android needs File.write.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4264 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-20 00:11:38 +00:00
791c3dd787 Remove unused file operations.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4263 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-19 23:53:52 +00:00
b00d75ab7c Fine. Fix windows.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4262 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-19 23:06:37 +00:00
956ea0df56 Track and expose hitches in some suspect callbacks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4261 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-19 23:05:59 +00:00
30014040e7 Update lit-all.min.js for ssb.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4260 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-16 21:36:17 +00:00
ab055c3394 I see what happened. codemirror 6.57.7 was really a misnumbered codemirror5 release. Let's go back to the latest codemirror5.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4259 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-16 13:07:02 +00:00
1e37eeea05 Experimenting with collapsing images.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4258 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-13 00:03:22 +00:00
84aec0278d Free earlier.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4257 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-12 23:28:58 +00:00
06642f58c5 One less blocking thing on the main thread: _tf_ssb_connection_send_history_stream.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4256 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-12 23:22:33 +00:00
e6d44b32f4 Seems we no longer need _tf_ssb_followingDeep.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4255 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-12 23:06:56 +00:00
1f3f6e2b92 Show audio: references inline, too, and now we don't have to show audio: and video: in the references section.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4254 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-12 00:32:14 +00:00
8f2d3e3bcd Show videos in messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4253 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-04-08 20:06:45 +00:00
2df2fc5792 This appears to avoid webview state loss when rotating.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4252 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-29 22:43:41 +00:00
20b0337e0a Hook up backtraces on android.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4251 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-29 22:25:17 +00:00
e86b9dae48 Lint cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4250 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-29 22:02:12 +00:00
71de897419 Missing icon.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4249 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-25 14:33:52 +00:00
3edfaf9137 Add/enable codemirror's javascript-lint using jshint, and fix a few things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4248 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-25 00:46:40 +00:00
19c1784864 sqlite-amalgamation-3410200.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4247 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-25 00:13:39 +00:00
0d9fac7363 Support ?filename= to download a blob with a given filename.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4246 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-22 23:02:36 +00:00
2fb91fccc0 Extra /.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4245 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-22 01:21:22 +00:00
24e1ab12ab Maybe you're not signed in.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4244 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-22 01:20:57 +00:00
10ea885d8d Show the username in the apps list.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4243 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-22 01:19:53 +00:00
ec65faa12d Assign all stock apps an emoji, show them in the app list, and let the editor set them.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4242 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-21 23:08:04 +00:00
53692a1ea8 Trying to make the apps like work better on a phone.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4241 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-21 16:54:06 +00:00
ebef51b4ea Continue trying to make the android build smaller.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4240 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-20 00:29:46 +00:00
a94d6f9271 Actually bind to whichever port.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4239 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-20 00:24:47 +00:00
3d2c88c201 Group contact messages, and try to fix some messages overflowing width.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4238 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-19 23:31:08 +00:00
bdeee7fc0e Trying mostly ineffectively to make android executables smaller.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4237 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-19 20:25:50 +00:00
33a037e0ea Move executables out of the way where android expects native libraries to be.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4236 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-19 13:12:51 +00:00
2dc2d9ebf6 Add appstore, so I can get apps more easily to my phone.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4235 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-19 13:07:33 +00:00
9748f0ed8b Clean up out slightly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4234 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-18 12:31:58 +00:00
d6be2f7d54 Bind tildefriends HTTP to an arbitrary port, write it to a file, and have the Android activity notice that file write and load the correct URL.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4233 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-18 12:28:48 +00:00
63615747a7 Fix executable choosing for my phone, and fix broadcasting to each interface.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4232 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-18 01:26:34 +00:00
fbb657a85c Ugg, no actual change but I had to touch everything to get it working in the emulator again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4231 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-17 23:48:54 +00:00
bdac0c7879 Whitespace.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4230 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-17 22:57:18 +00:00
54dde76a8a Optimize for size sometimes. APKs are part of all.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4229 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-16 00:44:22 +00:00
2bbe22bc7a Exclude some docs and things to get the release tar.xz back under 5MB.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4228 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-16 00:23:40 +00:00
ad8532f7ac Now actually include the code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4227 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-15 23:57:35 +00:00
602941104e Support building both debug and release APKs. Release is too big.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4226 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-15 23:55:22 +00:00
d38b41687c Throw in the towel on swipe refresh and add a refresh button.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4225 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-15 23:08:57 +00:00
08125cd1e8 Fix the android code build again. Meh.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4224 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-15 22:14:21 +00:00
2ce2097a3f This works in the emulator.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4223 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-15 21:58:21 +00:00
a5da17e1b1 Use updated android tools? I don't know. Ugg.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4222 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-15 03:21:20 +00:00
2b0962f087 Add openssl for android x86_64, and build that executable into the APK as well. Not used yet.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4221 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-14 03:17:01 +00:00
37173cce4c Cut some things to make the APK smaller.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4220 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-14 02:39:25 +00:00
37edbd9824 Get forward and back gestures working, and hide the title bar. Hiding the action bar still eludes me.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4219 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-14 02:38:56 +00:00
a32bb02223 Various fixes I've accrued. Minor cleanups and more tracing in serialize. Turn off memory tracking. Fix Let's Encrypt.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4218 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-12 22:16:18 +00:00
2ab1b84432 sqlite-amalgamation-3410100.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4217 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-11 22:29:20 +00:00
52ae19220c Enable WebView prompts and localStorage and stuff.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4216 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-11 15:24:05 +00:00
10bfa65a4e Fixed apps not working most of the time. Ultimately, storing a pointer to the database using JS_NewInt64 was lossy and a bad idea. Also, remove use of JNI since we're only starting tildefriends as its own process now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4215 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-11 13:57:17 +00:00
2a3b1a1e33 So close. We can do it without the .so.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4214 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-11 03:47:01 +00:00
f74f4f6da9 First signs of WebView working.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4213 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-11 02:37:27 +00:00
12a8b7a058 Fix other platforms.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4212 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-10 02:06:23 +00:00
400f07660f Whoa. Apps are running on android. Switched to a static build of OpenSSL 1.1.1t for simplicity.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4211 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-10 02:02:24 +00:00
d532795b7f Import stock apps from the apk.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4210 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-09 01:39:48 +00:00
6064ed6a3a Don't use Secure cookies if we're not using TLS.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4209 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-09 01:39:15 +00:00
2c1a43df2e Implement enough of the File JS API to serve some web pages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4208 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-09 01:03:35 +00:00
bf72782c9f Now we're running enough code to respond (incorrectly) to http requests.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4207 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-09 00:32:42 +00:00
63dcab30c3 Now we can run scripts from a .zip.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4206 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-08 23:59:11 +00:00
50e48af7c4 Add all the files I think I need to the .apk, and add zlib, so I can attempt to access them using minizip.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4205 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-08 17:46:19 +00:00
9127a18ff0 With approximately this code, I was able to establish an SHS connection with my phone.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4204 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-08 02:49:41 +00:00
61ff466908 Replace all printfs with tf_printf, which redirects to android logging. Change into the files directory so that sqlite can do its thing. Getting closer.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4203 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-07 17:50:17 +00:00
1c10768aa4 Fix overbuild in android deps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4202 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-07 03:02:16 +00:00
992b123853 Didn't end up using this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4201 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-05 02:54:29 +00:00
f736756b20 Make a JNI call.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4200 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-05 02:54:04 +00:00
28d73f5b37 Minimal build support for an android app. Written while the power was out.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4199 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-04 19:10:05 +00:00
262b0e5e52 Attempt to track CPU usage of libuv worker threads.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4198 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-03-01 01:36:26 +00:00
1e3807bcb9 Exposed functions to encrypt and decrypt private messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4197 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-26 19:51:54 +00:00
2ed3295f77 sqlite-amalgamation-3410000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4196 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-26 03:12:14 +00:00
8c9d687d50 Variety of minor fixes I've been running with. SSB web interface changes. calloc overallocation fix. Use sqlAsync. Probably some other things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4195 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-23 01:29:54 +00:00
b8b694864e Whoops, overallocated.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4194 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-20 02:42:11 +00:00
961109635b Latest libsodium-1.0.18-stable.tar.gz.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4193 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-19 23:23:53 +00:00
86bc46a11e Track memory allocations with a linked list. This is only about 3x slower than without tracking instead of 5x and growing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4192 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-19 22:28:36 +00:00
a6a6fe75ec Aha, one more leak in sqlAsync.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4191 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-19 13:51:06 +00:00
f55f863867 Some unused global variables.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4190 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-19 13:16:55 +00:00
4ce988d00b Memory leak in maskBytes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4189 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-19 02:01:59 +00:00
1548a8a852 One less alloc for setTimeout.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4188 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-19 01:28:14 +00:00
a9551b057b Trace more things. Add a CORS header for /mem so I can make an app to examine it. Fix a memory leak. Fix tf_realloc(NULL, 0).
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4187 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-18 23:43:00 +00:00
88c7d91858 Brute force memory tracking.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4186 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-18 21:00:39 +00:00
53cb80ebf7 Replace the sqlite allocator, and use our own tracking for stats. Want to use this to collect callstacks for all allocations.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4185 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-18 19:14:06 +00:00
1f67343d75 Make traces work with multiple threads, I think.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4184 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-18 00:51:22 +00:00
4bea8bb6ba sqlite thread safety and extended result codes, mainly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4183 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-17 22:43:19 +00:00
8e1461b3f1 Catch more sqlite errors.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4182 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-17 02:04:48 +00:00
90b513d070 Fix syntax errors not propagating.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4181 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-17 01:42:56 +00:00
8a2d3d4669 Pass around SQL errors slightly better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4180 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-16 00:06:45 +00:00
1741403206 More memory leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4179 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-15 02:59:46 +00:00
980db880cc Memory leak.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4178 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-15 02:56:01 +00:00
507a62539d Fix exporting.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4177 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-15 02:43:08 +00:00
6b5d73ed5c Vague attempt at some more cleanup, and stick pthread_self() in the traces.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4176 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-15 02:34:46 +00:00
1f77df7a90 Remove dependency on base64c. Use libsodium's. Also consolidate the calls, as the usage is quite special.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4175 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-14 03:15:24 +00:00
fa87462405 Finish writing this code. Yep.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4174 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-14 02:13:08 +00:00
a5f9f927e6 Fix some memory leaks I just introduced.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4173 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-08 01:50:47 +00:00
b35d74ce36 Allow running read-only sqlite queries from libuv worker threads. Needs so much more testing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4172 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-08 01:29:44 +00:00
ac60be14a5 Sure, we can identify SVG files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4171 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-07 23:39:04 +00:00
beda047eb0 Disable Nagle's algorithm before we start the TLS handshake. Just speculation that it will help with some responsiveness.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4170 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-06 02:29:00 +00:00
f6742bebf3 Tracing will continue until performance improves.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4169 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-03 15:06:18 +00:00
7f334ad783 Fine, only malloc_trim if it looks like we have it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4168 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-03 14:20:26 +00:00
ffda896308 Finish import.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4167 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-03 14:09:53 +00:00
b2fbe9dfac Stale doc file. Fix hashtag links. Trace some GC stuff and try malloc_trim, whynot.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4166 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-03 14:01:05 +00:00
6d6c41bffa Oops. Cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4165 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-02 02:48:07 +00:00
e04d137af5 Refactored import and export. No user on disk.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4164 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-02 02:09:05 +00:00
ec52e62908 Move apps/cory/ => apps/. Going to change import and export to support this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4163 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-02 00:18:22 +00:00
6104af0d70 Smaller docker image. Why not.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4162 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-01 23:47:07 +00:00
0ca05e297d No more global settings file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4161 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-01 23:40:21 +00:00
e0dcec074c Add process name to trace.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4160 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-01 23:20:16 +00:00
a8cecb5c64 Fix trace producing invalid JSON.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4159 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-02-01 03:15:22 +00:00
582ee0e4d7 var => let
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4158 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-31 02:48:56 +00:00
0ba54c2b7b Update lit element. Better drafts. Compose content warnings.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4157 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-30 01:45:23 +00:00
3c288f7f68 Remove duplicate apps entries on import.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4156 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-29 01:58:57 +00:00
c692b1b1f8 Modernize. All core JS is modules. var => let.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4155 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-28 22:44:45 +00:00
7091b6e6a5 Move some things to C that probably should have never been in JS, especially sha1. Minor refactors, cleanup, and deletes along the way.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4154 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-28 21:59:36 +00:00
48cd08e095 Some emoji picker and drafts tweaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4152 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-28 19:39:41 +00:00
ef7f9db9c4 Fix stats with multiple clients.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4151 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-28 00:14:56 +00:00
0092f24fb9 Fix votes multiplying, and make everything expand through the one true state.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4150 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-26 02:08:14 +00:00
f9db1a7acf Hoisting expanded state so that it plays better with stored drafts. Still learning to Lit Element.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4149 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-25 00:56:10 +00:00
da75ad9337 Fix buffer overflow.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4148 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-24 17:38:45 +00:00
7318ddd70e This might fix one disconnect issue, when a tunnel.connect error can't be forwarded?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4147 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-22 23:34:32 +00:00
ab75ec07f8 Added some storage+debugging to track what happens before we disconnect. Maybe I'll learn something.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4146 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-22 20:37:19 +00:00
0a6b842179 Fix linkifying urls with #fragments in them. Show when an about message is not about the author.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4145 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-22 17:25:37 +00:00
5d5ff121f9 Socket leak on accept.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4144 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 20:12:41 +00:00
adefa76dfd Fixed blocked users slipping through.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4143 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 19:30:00 +00:00
2420869e7f Some fixes for drafts on threads.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4142 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 19:12:55 +00:00
f841ca4399 Always bugged me that I don't show the total number of child messages, just the direct number.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4141 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 18:58:49 +00:00
433db904cd Some draft fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4140 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 01:39:00 +00:00
c067623740 Profile image update fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4139 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 00:21:26 +00:00
dab7050899 Experimenting with storing drafts. Fixed an old scary tfrpc bug which resulted in localStorageGet returning wrong values on subsequent calls.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4138 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-21 00:16:18 +00:00
77df158178 Don't create tunnel connections to targets we're already talking to. Policy is only one connection per id.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4137 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-19 00:02:31 +00:00
0af1bcf110 Audited message flags?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4136 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 23:43:49 +00:00
e05302ac99 Oops. This caused a double-reject.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4135 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 23:14:44 +00:00
ce6cc82d64 Some socket fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4134 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 23:03:17 +00:00
85a2bc3f0f Add a stat for blobs stored.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4133 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 22:52:54 +00:00
3285d93576 Expose stored connections on the connections tab. Still half-baked, but I'm going to use this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4132 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 00:57:54 +00:00
0f11f497ed Expose stored connections to script, and only store connections that were explicitly requested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4131 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 00:37:45 +00:00
45a5202456 Spelled this argument wrong.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4130 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-18 00:07:02 +00:00
ce0b4de5a1 Fix one lingering call to ssb.connectionSendJson.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4129 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-17 23:10:17 +00:00
134b2556ad Oh yeah, OpenSSL on windows, too, these days.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4128 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-17 22:56:36 +00:00
67d34bf70e Send history streams in batches. Should block the main thread less.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4127 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-17 02:17:29 +00:00
73863f9418 Minor error-sending cleanup. Produce callstacks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4126 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-15 21:23:28 +00:00
0cbc1a650b Change blob_wants from a table to a view. We can discover the information pretty fast, so let's not store extra data.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4125 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 23:25:56 +00:00
9248dfd97e Docs and emoji picker and probably some other random app updates.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4124 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 22:27:35 +00:00
b8f54f324f Avoid sending a superfluous response, I think?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4123 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 19:49:43 +00:00
3269c7ca45 Use tf_ssb_connection_rpc_send_json everywhere I can. Less code, and fixes some leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4122 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 19:32:36 +00:00
8a1b4cceec Memory leak.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4121 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 14:05:31 +00:00
7cd925feca More message size fixing. Need to find the end of it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4120 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 13:27:19 +00:00
f6ae15c4dc A variety of potential protocol/rpc fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4119 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-14 00:55:51 +00:00
6ed057089b Remove the pull/push/revert buttons that I haven't used in ages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4118 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-12 00:57:56 +00:00
a5ba014736 401 Unauthorized is an error response we send.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4117 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-12 00:01:47 +00:00
4d4cc92150 Optionally enforce an HTTP => HTTPS redirect.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4116 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-11 23:39:42 +00:00
3b00b31e87 Fix ping units, and don't spam it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4115 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-11 02:30:07 +00:00
3c687dc780 A room.attendants left message with no id crashes some other clients. :/
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4114 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-11 01:55:23 +00:00
987b2d539a Trying to understand what's up with rooms. Various minor fixes and improvements.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4113 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-11 01:43:35 +00:00
80a1e94da4 Simplify and fix ebt.replicate.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4112 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-09 22:37:34 +00:00
69253432b8 ssb.js is now entirely in C. Usual disclaimers about it not being amazingly well tested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4111 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-08 20:01:35 +00:00
53e4f4341c createHistoryStream JS -> C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4110 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-08 17:45:15 +00:00
6ff33191bb Try to make the tests not mingle with other instances.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4109 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-08 13:48:28 +00:00
513eb88a53 -t rooms cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4108 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-08 00:44:36 +00:00
3506d9dec1 Rooms JS => C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4107 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-08 00:25:38 +00:00
c09e043812 blob wants from JS -> C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4106 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-05 00:52:23 +00:00
4c01f23ee8 blobs.createWants again without setTimeout to fix the test.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4105 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-04 23:11:49 +00:00
ff06e91ac8 Fix feed replication. Ugh, Cory.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4104 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-04 02:59:35 +00:00
8ed359327c Appease clang.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4103 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-03 00:49:21 +00:00
a66a70324d More blobs.get. Finally replicated again to manyverse.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4102 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-02 02:11:21 +00:00
67fbbd4a8d More generous receive buffer. Max RPC size is stored in two bytes. Double so that we have overhead for the header itself and another RPC.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4101 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-02 00:58:15 +00:00
235fc9b8f9 Oops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4100 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-02 00:35:37 +00:00
f257cccded I think this fixes some blob replication bugs. Going to test more.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4099 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-02 00:33:11 +00:00
5342ddb2bd Fix an RPC stall? How did this ever work? How is it supposed to work?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4098 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-01 22:42:31 +00:00
7cba1b21ad Fix HTTP request breakage.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4097 ed5197a5-7fde-0310-b194-c3ffbd925b24
2023-01-01 18:12:42 +00:00
120ed36552 Continuing to chip away at moving ssb.js to C. This time, following.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4096 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-31 21:44:48 +00:00
a9f6593979 Add replication to what -t bench measures. Add a bool to control printing RPC messages. Respond to ebt.replicate with messages that weren't requested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4095 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-31 18:59:29 +00:00
ca6d042ed6 Use picohttpparser. No more messing around.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4094 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-31 16:47:10 +00:00
ae4c2aef69 + webp magic bytes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4093 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-30 14:51:43 +00:00
ed1c85288c Exclude openssl binaries from the release .tar.xz.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4092 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-30 14:32:19 +00:00
71151a511d sqlite introduced an unused function, apparently. Ignore it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4091 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-30 14:22:04 +00:00
7f35f01b88 sqlite-amalgamation-3400100.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4090 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-30 13:59:05 +00:00
1d13c25ded tunnel.isRoom => C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4089 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-30 01:23:44 +00:00
09ddfffa6b Add prebuild OpenSSL, and remove SCHANNEL code and whatever it was on MacOS. Build mingw for 64-bit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4088 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-29 23:55:49 +00:00
d9aee6d05f Compile for android. Probably needs a bunch of work to run, but it's a step in a direction.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4087 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-29 21:58:54 +00:00
94d7d2e3e0 Formatting.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4086 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-29 17:01:27 +00:00
f748fcf1f7 Missing include for mingw.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4085 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 21:03:23 +00:00
9c89c2f717 How did downloads ever work?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4084 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 18:23:52 +00:00
d88752d840 Fix full text search?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4083 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 17:27:31 +00:00
bb565aeb23 Missed a change.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4082 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 17:17:44 +00:00
c1015a8bdd Missed a file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4081 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 17:17:18 +00:00
181b21080c ssblit -> ssb. Let's finally get rid of the old thing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4080 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 17:16:50 +00:00
577efb6b7a Adjust some old text on the login page.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4079 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-28 17:05:56 +00:00
1a45113e0c Place to show a code of conduct.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4078 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-24 19:25:21 +00:00
c49da3db07 Format about messages. Todo fixes. Add a collapse button to complement more.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4077 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-24 18:50:01 +00:00
b406501263 Start of a benchmark.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4076 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-12 03:11:32 +00:00
c30b3bbb64 Enable CONFIG_BIGNUM for quickjs. I like big numbers, and I cannot fabricate the truth.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4075 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-11 14:36:14 +00:00
82f9859c57 lit 2.5.0, and cap image max dimentions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4074 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-10 00:35:53 +00:00
4080266fa3 Channel messages, and show some more things based on refs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4073 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-07 23:37:06 +00:00
210149d6be Fixed tests. Hmm.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4072 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-07 23:29:10 +00:00
c2eb439574 Fix messages_refs. Oops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4071 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-07 23:24:31 +00:00
23a6a24288 Start blog posts collapsed by default.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4070 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-03 14:58:44 +00:00
932989ee9c Some TODO updates.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4069 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-03 14:50:10 +00:00
1a91b56a1d Now I can render blog messages, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4068 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-03 02:18:48 +00:00
8115881c08 Oops. ssb.createTunnel is necessary.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4067 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-01 01:19:35 +00:00
7fe3bddeba Updated the readme.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4066 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-01 01:07:06 +00:00
376094452e At least some feedback if we can't save an app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4065 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-01 00:50:06 +00:00
cd8b32b3ca Update the TODO and maybe fix dupes in the news feed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4064 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-01 00:43:54 +00:00
2251406bd1 Lost an admin app change.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4063 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-01 00:39:05 +00:00
d8fb956c14 A slightly dynamic administration page. As always, uncertain if this is a good direction.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4062 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-12-01 00:26:51 +00:00
b1ff215ad7 Fix message sorting with placeholders, and add mime magic for another kind of mp4 that handbrake just gave me.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4061 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-30 03:07:30 +00:00
f9b4ab91c0 Marginal success on uploading and showing videos.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4060 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-30 02:37:27 +00:00
72952e0c39 + mp4 mime magic.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4059 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-30 02:36:52 +00:00
acc14f7318 +todo
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4058 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-28 02:19:36 +00:00
d48b8b0ae1 Export todo, and weird spacing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4057 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-28 02:18:58 +00:00
7ff09ed005 Get rid of the JS bits of tunnels.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4056 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-27 03:12:24 +00:00
672fb8fcf4 Extra ;
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4055 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-27 02:19:40 +00:00
fe6d492347 Poking at connections.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4054 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-20 02:09:52 +00:00
b65706ffc4 Don't close the parent connection when a tunnel closes. Just clean up the request through it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4053 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-19 21:42:54 +00:00
cb44d408cd Show content warnings.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4052 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-19 02:06:23 +00:00
880ab7fdde blobs.has
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4051 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-17 01:49:34 +00:00
be6f24b3ee Get my foot in the door converting ssb.js to C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4050 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-17 01:36:24 +00:00
902287292d Making tabs less button-y.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4049 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-17 00:56:09 +00:00
c4b4103802 sqlite-amalgamation-3400000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4048 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-17 00:37:43 +00:00
c664f7808f Better wording?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4047 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-17 00:35:25 +00:00
6b267e472e Fighting with load. Not what I expected to be doing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4046 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-17 00:30:58 +00:00
dae66424dc Exclude some dependency test files and such to make sure I can build a .tar.xz that is below 5MB.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4045 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-16 03:23:23 +00:00
170d5a9621 Stale file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4044 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-16 03:16:30 +00:00
179da40a4b codemirror 6.65.7. I don't think this upgrade is supposed to just work like this. I am probably missing something.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4043 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-16 03:00:24 +00:00
9b696503de Remove the old SSB client interface.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4042 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-16 00:18:54 +00:00
efdecc6017 Oh yeah, Manyverse didn't like when I sent room notifications with missing ids.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4041 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-16 00:11:03 +00:00
1a35a6a161 Clear up some cruft.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4040 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-14 02:58:49 +00:00
041e63ac70 First actual successful communication through a room.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4039 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-13 22:30:09 +00:00
046bf7e2a9 Fixing various badness as I still can't get rooms to work.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4038 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-13 22:02:54 +00:00
20ebdea9d1 Eh?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4037 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-13 03:36:48 +00:00
1e84b74ced Can actually attempt to connect to a room from the web interface, now. No actual success yet.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4036 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-13 03:24:30 +00:00
cdbc2d48f7 Don't collapse any audio mentions, since we don't show them properly inline.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4035 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-12 03:11:46 +00:00
1140c5ddc7 Docs tweaks. Linkify hashtags.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4034 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-12 03:06:29 +00:00
0d23294d42 Remove promiseTest.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4033 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-12 02:32:20 +00:00
2dc7f58c80 Fixed some plumbing so that I can actually stay connected to a go-ssb-room.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4032 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-12 02:00:49 +00:00
de59a7f338 Perfetto UI => speedscope. I'm not going to switch away from JSON traces like Perfetto UI wants me to, and this is light, fast, and sufficient.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4031 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-10 02:39:00 +00:00
205f0df1b4 Slightly better initial experience. When you create your first identity, it becomes selected.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4030 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-10 02:16:26 +00:00
5ed9a77d38 Make the id picker refresh when you create an identity.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4029 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-10 00:03:39 +00:00
ae545e7b2b Minor cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4028 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 23:25:22 +00:00
e49b54207a Show potential room connections differently.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4027 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 03:51:31 +00:00
c1df77bb96 Oops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4026 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 02:57:14 +00:00
98a7753a55 Test that blobs actually round trip data. I want to rewrite a thing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4025 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 02:56:41 +00:00
d3d4b1a13c Placeholders no longer necessary.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4024 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 02:49:32 +00:00
241dfdb90e Connect from the web page sort of works again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4023 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 02:15:33 +00:00
6ba41f03da Don't assume we don't have to DNS lookup broadcasts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4022 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 02:15:07 +00:00
9ef9dadbb8 Mostly fiddling with the connections tab.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4021 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 01:47:47 +00:00
06529fddfb Trying to make connections more robust.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4020 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 01:31:18 +00:00
f015c8727d Don't expire tunnel connection broadcasts. They go away when either connection goes away.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4019 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-09 00:37:51 +00:00
3a5ae4c228 Attempt to clean up requests for tunnel connections that are going away.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4018 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-07 02:57:29 +00:00
b12f8f9da8 First go at implementing rooms. A test passes that appears to exercise them.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4017 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-11-02 23:34:44 +00:00
1abc611e54 Trying to do mentions and refs betters. Questionable success.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4016 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-21 23:31:32 +00:00
6a4559c580 Trying to understand / work around sql logic errors.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4015 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-21 23:30:22 +00:00
54ebd0e643 Bring back buttons to attach apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4014 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-18 23:00:57 +00:00
60d1ea9d39 An experiment in collapsing messages, and link placeholders.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4013 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-18 22:31:54 +00:00
16dbc7617c Convert images to webp when uploading.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4012 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-16 20:31:32 +00:00
a37ad69c8b Update mentions whenever attaching images or updating markdown. Also show them.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4011 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-16 19:05:22 +00:00
3bbeec8ece Display links to tildefriends apps again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4010 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-16 00:54:16 +00:00
de398786be So far I've gotten the triggers all wrong.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4009 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-15 19:28:57 +00:00
b8fa59d3ec Auto-detect @mentions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4008 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-15 19:02:09 +00:00
704ed737a9 Auto-complete @mentions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4007 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-15 18:22:13 +00:00
04ae7a2540 Use messages_refs to show more context when looking at a post.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4006 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-15 13:39:45 +00:00
954e0227d4 When checking database integrity, delete messages after a gap.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4005 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-14 17:39:08 +00:00
1ab79adb27 Ugg. Botched this trigger.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4004 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-14 16:42:31 +00:00
c7ee998b21 I should probably fill in all of the HTTP status codes here.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4003 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-14 16:26:08 +00:00
f53ce584e3 No more secrets in ~/.config, and speed up some tests.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4002 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-14 12:27:34 +00:00
70866e03c8 Slightly more honest startup messaging.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4001 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-12 13:04:45 +00:00
656ab7beb6 Fix app 404s.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4000 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-12 12:38:33 +00:00
1dec53821e Fixing some stock experience issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3999 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-12 12:27:32 +00:00
c0a14a738e Let's try keeping a table of message refs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3998 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-09 12:53:59 +00:00
d9c5f74d62 More overflow. #beach
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3997 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-09 12:23:25 +00:00
e5dcff0200 Wrapping issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3996 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-05 02:11:46 +00:00
25cc3d7c3a I'm not sure why I ever constrained this.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3995 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-05 01:53:16 +00:00
1cffc5ec24 Image paste.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3994 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-05 01:40:21 +00:00
5e72b111d9 Refresh the JWT on websocket connect.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3993 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-05 01:20:47 +00:00
3cdfc7af2b Make the auth tokens last longer.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3992 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-10-02 00:11:57 +00:00
113a82b382 Make auth use JWTs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3991 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-28 23:52:44 +00:00
5b3ae3f006 Attempt to clean up promises owned by subtasks that have gone away.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3990 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-27 23:01:59 +00:00
c0ecdaae12 Experimenting with ordering. Handful of small fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3989 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-25 12:33:54 +00:00
828f61c4e9 Warnings.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3988 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-24 21:13:14 +00:00
775f00c69c Build fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3987 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-24 21:10:23 +00:00
eadda41518 Use libbacktrace to generate better leak callstacks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3986 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-24 20:54:54 +00:00
8279ec5e9e Debug features for leaked promises. And then chased down some subsequent use after free issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3985 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-22 00:38:26 +00:00
ab1f47ee9a Did some routing for the search tab.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3984 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-15 00:16:37 +00:00
d216d96144 Expandable image mentions. Do a faster fts validation at startup. Hide the news test button.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3983 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-14 23:49:25 +00:00
88592886ca Accrued fixes, most recently making an effort to show all mentions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3982 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-14 23:33:57 +00:00
7077e69bf7 Fix caching for all of the requests. The free wifi I get at Bacchus from Angela's Bridal isn't great.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3981 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-14 23:18:55 +00:00
f983c3d987 Trying to organize ssblit better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3980 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-11 17:42:41 +00:00
26691051a5 Fix more error plumbing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3979 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-11 01:56:29 +00:00
fe33903e2e Proof of concept full text search.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3978 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-10 18:23:58 +00:00
6ea6ae2322 Oof. That's needed for json_each.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3977 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-10 18:09:10 +00:00
bb0a840dc6 Expose fts5.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3976 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-10 17:56:54 +00:00
52f5bb408f I think this added following and blocking.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3975 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-10 02:56:15 +00:00
ee1e1b11af sqlite-amalgamation-3390300.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3974 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-10 01:51:32 +00:00
56db6a8e4d Fix exciting new gcc 11 compiler warnings.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3973 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-10 01:42:15 +00:00
3b676d967e Add ssblit to version control. It's coming along too well to risk losing it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3972 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-06 23:26:43 +00:00
97b7643049 Propagate better sqlite errors.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3971 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-04 01:58:11 +00:00
c3fb80a1c8 Allow enough things for json_each to work.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3970 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-04 01:36:55 +00:00
7c29c1e18e Fix some of the error handling.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3969 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-09-04 01:25:16 +00:00
4c0dc6ad04 Tried to take a few pointers from https://tech.davis-hansson.com/p/make/.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3968 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-21 17:17:23 +00:00
6cfe0ca4fb Slight emoji picker improvements, and fix a problem with showing doubled votes. Though this revealed that loading needs serious work.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3967 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-18 00:23:56 +00:00
46d3e8f567 Exposing setting the index page in the admin app and added a crude emoji picker, finally.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3966 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-17 00:29:57 +00:00
3729346961 I decrypted a private message.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3965 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-16 02:38:25 +00:00
357d944a8d Show local identities in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3964 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-15 02:23:45 +00:00
69991abbb4 Append SSB messages by RPC so that we know if it succeeded.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3963 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-14 19:14:13 +00:00
0518c5dd21 This is not a test.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3962 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-14 18:25:05 +00:00
e4c182a6fa Rigged up some UI to show and allow removing permissions that have been granted or denied by the user to an app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3961 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-14 18:24:41 +00:00
8edc9aaa63 Make permissionTest() throw an error on fail. Having to remember to check the value scares me too much.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3960 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-14 17:34:27 +00:00
4525ee9cca Make print more of a standard RPC thing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3959 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-14 16:58:26 +00:00
3464f1d189 Took another whack at permissions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3958 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-14 01:46:11 +00:00
fc9c3982c2 Fix some obvious things now that the RPC is slightly better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3957 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-13 19:39:29 +00:00
d70dba021a Do app -> client communication more like tfrpc so that it's easier to get responses.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3956 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-13 18:58:06 +00:00
41590921c3 Expose a thing so that the admin app can show permissions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3955 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-13 18:06:30 +00:00
4d629c45eb Making things slightly more compact.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3954 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-11 02:04:55 +00:00
39f05b6bf5 Fix an ancient reconnect bug.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3953 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-08 01:48:23 +00:00
58196c4ac0 Make requesting permissions appear less terrible.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3952 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-07 22:39:58 +00:00
eca3696740 A weak attempt at reducing docker image size.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3951 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-04 01:15:39 +00:00
fbfbd6a6b4 Exposed deleting users, mostly for my own testing, and used it to make a primitive admin app. Add a handful of apps I've been kicking around without version control, while I'm at it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3950 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-04 00:57:56 +00:00
353f2ccc13 Track / expose a list of registered users.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3949 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-04 00:07:12 +00:00
6628a5c420 What's the point of creating an identity if you don't return it?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3948 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-03 23:52:13 +00:00
1973030774 Some selection-related fixes. There are still bugs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3947 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-03 23:39:23 +00:00
787e439524 Work in progress making the account picker actually work.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3946 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-08-03 23:26:41 +00:00
fab2c17b43 Remove the administrator requirement and allow creating new SSB accounts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3945 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-31 20:32:48 +00:00
1775fdd6b5 Also unnecessary. Whoops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3944 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-31 20:04:58 +00:00
5cc7641788 This is a dupe of ssb.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3943 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-31 20:01:41 +00:00
6c2fd6d90f This doesn't need to be exposed.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3942 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-31 19:45:28 +00:00
24530e1158 First glimpse of multiple SSB identities per Tilde Friends user.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3941 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-31 19:01:08 +00:00
0bd1463a6b Missing files.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3940 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-28 01:26:28 +00:00
6728727e89 Looks like a reply fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3939 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-28 01:20:09 +00:00
ac960a98bf Clean up apps list.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3938 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-28 00:45:34 +00:00
f787eb077b An experiment in requesting permissions and some related fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3937 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-27 00:27:10 +00:00
b2ecc24e85 sqlite-amalgamation-3390200.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3936 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-24 21:31:33 +00:00
3c82a87968 libuv deletes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3935 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-24 21:26:02 +00:00
f06753b56e libuv 1.44.2
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3934 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-24 21:25:38 +00:00
41afc3bdd6 Ugg, my print() was destructive to its arguments.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3933 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-24 21:05:23 +00:00
f764007fc6 Tiny steps toward getting away from one global identity.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3932 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-14 01:01:14 +00:00
ae5560f33a Is this a thing? Ref a value while we call it?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3931 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-12 02:12:03 +00:00
e6532979aa codemirror 5.65.6.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3930 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-12 02:11:37 +00:00
3078536245 Latest libsodium-1.0.18-stable.tar.gz.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3929 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-12 02:00:25 +00:00
1efc0fd73b Another linked list bites the dust.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3928 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-12 01:51:15 +00:00
aee99af953 Track request counts?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3927 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 22:00:33 +00:00
a154b1c2f6 Fix the windows build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3926 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 20:46:24 +00:00
7f350a3d87 Add a helper for getting array length: tf_util_get_length.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3925 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 15:13:35 +00:00
982b5817a2 Fix the docker build. Add the valgrind headers to deps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3924 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 14:50:27 +00:00
52f744e106 Test output cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3923 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 14:38:00 +00:00
7f9c01a9bb Fix a test leak.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3922 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 14:33:38 +00:00
fb3ad0d95d Slight cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3921 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 14:23:58 +00:00
fe5a6033ef Close / clean up a socket if connect fails.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3920 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-07-09 14:14:48 +00:00
ff2a0f0c3f All the leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3919 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-26 18:25:31 +00:00
66ea0dadd0 Oops all leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3918 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-21 23:09:13 +00:00
474ff9cd74 Decrease the bad request timeout, as I've tripped it myself occasionally. And let the iframe hit the WebSerial interface. I might have a fun use for that.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3917 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-20 19:50:03 +00:00
718383205b Add a thing to remove apps from your app list. Should I have called in 'uninstall'?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3916 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-20 18:13:19 +00:00
c9e01f220d Track our own quickjs memory usage so that we can avoid expensive calls to JS_ComputeMemoryUsage.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3915 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-20 17:57:07 +00:00
f69e74ce53 Another leak. Sheesh.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3914 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-20 14:41:08 +00:00
b5c6cac048 Another leak.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3913 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-20 14:30:00 +00:00
515999e570 Use tfrpc fairly thoroughly in the ssb app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3912 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-20 01:34:32 +00:00
ab58f42f0c Module-ified the ssb app and started to integrate tfrpc.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3911 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-19 22:08:15 +00:00
af3e96c7e8 Cleanup this state, maybe.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3910 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-19 21:09:22 +00:00
782b5593d5 Audio controls height?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3909 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-19 21:05:34 +00:00
d892c9e734 Add a helper for app <-> browser communication.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3908 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-19 18:01:21 +00:00
d3e9041b15 var -> let, and standardize these calls.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3907 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-18 21:12:38 +00:00
3a40722c89 Emoji-ify status messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3906 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-18 20:51:22 +00:00
b42b5d11fa Remove require. There is only import+export.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3905 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-18 17:50:22 +00:00
2d8a956c14 require -> import
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3904 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-18 17:39:08 +00:00
ed6550a4cd Move some deps to deps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3903 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-18 17:07:36 +00:00
e1ca715c64 Add some helpers for resizing dynamic arrays to allow them to both not grow if they're at capacity or shrink if significantly below capacity.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3902 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-17 21:18:10 +00:00
4e3bf99327 More socket leak debugging.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3901 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-17 19:58:50 +00:00
b5b6ed8ba5 Trying harder still to curb stale connections.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3900 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-17 18:51:24 +00:00
4293e75082 Add some mp4 file magic.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3899 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-16 15:53:13 +00:00
927e2b7060 Expose some information about active sockets to try to track down leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3898 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-09 02:45:34 +00:00
83bdbbb4dc Fixed some socket leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3897 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-07 02:41:44 +00:00
1dc6084d2d Time out idle connections.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3896 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-07 02:08:06 +00:00
ae894eaa9d Time out connections that don't send a request in time.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3895 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-07 01:00:50 +00:00
a8ced8757c Disable all the warnings I see in external code.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3894 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 17:22:55 +00:00
653e16b059 Don't support OpenSSL on windows. Yet?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3893 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 17:14:39 +00:00
9c90b2bc1d Use a custom allocator for everything.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3892 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 17:04:51 +00:00
cf61e68713 Spruced up the graphs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3891 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 16:38:45 +00:00
7b53c95832 Track OpenSSL memory usage.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3890 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 15:59:58 +00:00
c8e09d8637 Start closing the socket if TLS ends. Don't import apps if we're not running the SSB server (cleans up test output).
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3889 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 15:43:35 +00:00
cb9edaacd4 Leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3888 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 03:36:36 +00:00
2992b7e955 Attempting to learn about a slow memory leak.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3887 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-04 03:01:12 +00:00
5622db92a7 Trying to fix socket lifetime issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3886 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-02 10:58:22 +00:00
58f459fb3b Fix file read leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3885 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-06-02 09:40:19 +00:00
3bc428a83e libuv 1.44.1
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3884 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-30 21:10:43 +00:00
0556af3e07 Socket was missing a GC mark function?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3883 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-30 19:32:54 +00:00
2882af1c05 Consolidated the makefile further. Phew.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3882 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-30 17:24:42 +00:00
b06c657ef0 Remove some of the repetition in the Makefile.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3881 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-26 00:47:36 +00:00
04ec425c9c Been a while since I exported these apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3880 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-26 00:03:46 +00:00
842633f6d1 Exposed some ways to explore databases.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3879 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-25 23:45:52 +00:00
e5160b9d2c Remove stray "imports" cruft?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3878 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-25 22:45:24 +00:00
e8fb73fdf9 libsodium is in-tree now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3877 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-25 22:10:22 +00:00
939e13c3c8 Fix release tests.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3876 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-21 01:38:13 +00:00
787e929747 sqlite-amalgamation-3380500.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3875 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-21 01:36:16 +00:00
b688a89b66 Multiple test fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3874 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-21 00:06:01 +00:00
7848b5e560 Merge in mingw changes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3873 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-05-16 22:30:14 +00:00
87224d2bb6 Add some protection against bad requests. Also bail if we can't start properly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3870 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-04-26 23:05:02 +00:00
2826efea56 Fix stats.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3869 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-04-20 23:45:17 +00:00
0d1b231344 Try showing the last day's worth of posts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3868 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-04-18 00:46:46 +00:00
804359d12e Made sure that SQL errors make it to the client.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3867 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-04-18 00:24:00 +00:00
11ad344e52 Made it possible to set a profile photo. Not well tested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3866 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-04-14 23:47:41 +00:00
d802c0023b Added a database exchange operation, and some context when uploading a file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3865 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-04-14 23:47:06 +00:00
42fcfee042 Some plumbing for local storage for apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3864 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-27 19:53:02 +00:00
a1d244567a Ugg, modules and CORS??
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3863 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-20 01:17:20 +00:00
00bdf1df4a Use proper js modules for apps. Kludge enough things to make things seem to work. Need to apply this to core still.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3862 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-18 01:24:29 +00:00
9b2d4b393d Add a new database exchange function, because get and set aren't atomic enough.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3861 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-16 00:34:45 +00:00
5e0c20e432 Expose shared_database(), which provides access to data that is specific to the app owner and app and can be written for any visitor.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3860 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-16 00:23:14 +00:00
352f33f5a1 Add libsodium to the tree and build what's needed from source.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3859 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-08 03:42:47 +00:00
efc5eb2aff Whoa. There's a leak.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3858 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-08 02:33:32 +00:00
7e9460f47c Fix one possible but not actually relevant leak around files, and remove an unused value from promises.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3857 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-07 21:57:52 +00:00
41cabad264 libuv 1.44.0
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3856 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-07 21:34:07 +00:00
b488db9137 Make some attempt to restore some editor/stats/... state using localStorage.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3855 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-07 21:06:20 +00:00
cb315c717b Appease some Chrome cookie-related warnings.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3854 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-07 18:39:52 +00:00
3381b588a1 sqlite-amalgamation-3380000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3853 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-03-07 18:24:54 +00:00
7c2962afcf Oof. I couldn't have an app with its own style.css.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3852 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-27 21:15:36 +00:00
498a093cde Some possible leaks?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3851 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-27 19:38:48 +00:00
07a87ff9de Fix editing missing apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3850 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-27 02:35:51 +00:00
c138582638 index => ssb
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3849 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-27 02:30:11 +00:00
011038a38a Make the files pane collapsible. This is the limit of my CSS ability.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3848 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-26 22:51:35 +00:00
1bfa18b8d7 Minor cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3847 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-26 21:25:40 +00:00
95f0b91a0e Only send stats to clients if there is a client watching them.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3846 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-26 21:17:15 +00:00
ffaaec5b37 Experiments in updating faster.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3845 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-25 18:52:01 +00:00
ac0482d7f5 Show images inline.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3844 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-25 18:24:48 +00:00
f4b46cc3a0 Blocking and some random attempts to make things faster.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3843 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-21 02:28:53 +00:00
4bb095e81f Got rid of all of the XMLHttpRequests in favor of fetch().
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3842 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-17 02:29:04 +00:00
5e92e2ffe1 Minor HTML tweaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3841 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-14 00:28:30 +00:00
a4a0745385 Send prints to the browser console. Obvious in retrospect.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3840 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-13 22:39:22 +00:00
eb191254b0 More use strict. Less Notification.requestPermission().
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3839 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-13 22:06:35 +00:00
e4e763b7a0 Delete some old things from core, mostly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3838 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-13 22:03:12 +00:00
5ffc505ce2 Minor colleted changes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3837 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-13 21:49:53 +00:00
1bdd67d659 Migration fixes, and make 'check' delete invalid data.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3836 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-12 02:51:43 +00:00
483638a7e6 I guess we support sub-millisecond timestamps. Who knew?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3835 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-12 01:44:11 +00:00
50bef73200 To calculate an ID, take the utf-8 message, convert it to utf-16, and then throw away the high bytes. Of course.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3834 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-11 02:44:27 +00:00
d4135f7133 Message IDs are apparently generated from the latin1 encoding of a message. Added a command to check/fix that.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3833 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-10 03:58:33 +00:00
557ae6ee5a Oops, one more leak fix that was sitting on this machine.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3832 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-08 03:04:57 +00:00
07b4f2b08f I think I imagined this message size limit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3831 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-08 02:07:23 +00:00
9a75af8146 Don't add a message until its previous message exists.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3830 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-06 03:51:25 +00:00
5b3c7dcecc Oops, this broke everything.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3829 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-06 03:49:47 +00:00
6b20d69976 Tweaking memory stats and trying to figure out why startup got so much slower.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3828 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-06 03:28:29 +00:00
fbb61581c6 Messing with layout in the ui.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3827 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-06 01:17:32 +00:00
25d793e9e8 Allow clicking on existing votes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3826 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-06 01:03:40 +00:00
8f35004a01 Reduce packetstream allocation frequency.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3825 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-06 00:46:34 +00:00
e59eb66c1d sqlite memory usage, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3824 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 23:57:15 +00:00
412dce0a47 Fill in some accesskeys and tooltips.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3823 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 23:04:04 +00:00
1aa4b0e590 Hook up some stats from the SSB side.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3822 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 20:18:58 +00:00
ef9e42e030 malloc and leak fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3821 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 19:58:22 +00:00
059024452c Add some CPU and memory info to stats.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3820 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 17:52:37 +00:00
39a1acaf38 Unused function.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3819 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 17:08:38 +00:00
8ecc07452e Fix socket leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3818 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-05 17:06:51 +00:00
e85ee5766b Oops, this doesn't exist in Chrome.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3817 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-04 02:32:00 +00:00
91339dc8a7 Add some tooltips.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3816 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-03 23:57:47 +00:00
7733cb2604 Maybe don't destroy the signature if we're going to try to validate again.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3815 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-03 02:38:05 +00:00
157209e9b5 Debugging a thing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3814 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-03 02:14:50 +00:00
cd51edcd8f I think this fixes the questionable archaic sequence / author order issue.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3813 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-03 02:00:05 +00:00
a98a848bb7 A crash fix, and try to fill in gaps?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3812 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-02 02:13:38 +00:00
c57b0a2f2f Fixed some problems linking messages with their threads in the UI.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3811 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-02-01 01:47:18 +00:00
bf7d5c34f6 Tooling around with docs. Show timestamps as relative ('3 hours ago').
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3810 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-30 21:44:27 +00:00
ea92fbdcea Give a filename instead of blob id in errors when possible.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3809 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-30 21:09:32 +00:00
9f75346dd8 Fix jpeg mime type determination.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3808 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-30 20:23:55 +00:00
b5111efc29 Oops. Fix votes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3807 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-30 20:20:19 +00:00
0278aceb62 Fiddled with saving and loading so that admin users can push and pull to parent apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3806 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-30 14:51:09 +00:00
ec5d7c1a01 Click to expand images. Long overdue.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3805 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-29 21:14:16 +00:00
40216377f9 Websocket error messages and misc.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3804 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-29 20:43:19 +00:00
d062db2ba8 sqlite-amalgamation-3370200.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3803 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-29 20:24:26 +00:00
d3875cf738 Pasting images basically works.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3802 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-29 19:49:01 +00:00
fefb0f92bc Fix login.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3801 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-29 19:05:57 +00:00
0ddb86b5a8 These indexes weren't helping in practice, so remove them. Avoid some queries during a full refresh to load in maybe 1/3rd the time.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3800 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-29 19:00:44 +00:00
d77c452120 Attaching files to posts sort of works. Whew.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3799 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-28 03:11:09 +00:00
e84ced6f79 Add some useful indexes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3798 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-27 01:42:48 +00:00
e4d77679dc Show a breakdown of timing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3797 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-27 01:17:22 +00:00
9fd4be0e4a Wow, load was slow because websocket sends were slow, because TextEcoder was slow. Do it in C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3796 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-27 01:15:54 +00:00
7b32067b07 Make the 'apps' app list core apps, and populate apps lists when importing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3795 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-26 02:49:45 +00:00
e1167b6854 One more perfetto update. This passed the linter.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3794 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-26 01:51:02 +00:00
25ee0a3561 Trying to sort out connection cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3793 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-26 01:15:04 +00:00
4771810d6b Add a link to the stock apps app. Useful.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3792 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-23 21:42:27 +00:00
ae10d3fa6f Link conversations, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3791 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-23 20:49:36 +00:00
ac92b5f8de Make the client figure out followers rather than going back to the database. Faster loads.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3790 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-23 19:15:18 +00:00
d0c89991be Allow exporting from a non-default db location. I'm running over NFS on this instance.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3789 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-23 19:14:43 +00:00
0a580b60b1 Safer?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3788 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-23 12:52:55 +00:00
24116f498f Null check?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3787 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-22 22:26:39 +00:00
5623cba7c3 Fix a buffer size / disconnect issue.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3786 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-22 21:20:43 +00:00
bd81b2acf5 More bugs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3785 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-22 20:47:10 +00:00
6c28ca738e Fixed the makefile conditional.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3784 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-22 20:20:21 +00:00
b2a552b3e0 Needs more work, but several experiments that make things more responsive under load.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3783 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-22 20:13:14 +00:00
0f03701043 Fixed loads of memory leaks and related issues.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3782 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-22 18:50:29 +00:00
d470d6c398 Now one graph per stat.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3781 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-21 03:09:23 +00:00
98de9b037a An attempt at making some live graphs of relevant stats. Needs more thought.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3780 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-21 02:53:15 +00:00
df0bb102dc Kill tasks when their websocket closes. Sigh.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3779 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-21 00:49:03 +00:00
1734c88627 Try to fix some connection issues. Urge to rewrite rising.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3778 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-20 04:01:45 +00:00
df94378b96 Actually expire broadcasts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3777 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-20 03:35:03 +00:00
83fa488b8d Fix links to user IDs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3776 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-19 02:37:39 +00:00
1515525a1b Move data/global/settings.json into the database. Improved some error plumbing along the way.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3775 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-18 02:50:46 +00:00
0b5017b208 Import stock apps into /~core/ at launch. Makes the first time experience vaguely work with only running and clicking in the web interface.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3774 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-17 22:00:42 +00:00
c864041fa0 Fix a handful of errors and warnings I've seen. Gets further running in docker, now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3773 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-17 21:46:32 +00:00
e9e1a3e80d Trace libuv's idle time metric.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3772 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-17 01:29:35 +00:00
1ddaa7deb0 Fix a use after free.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3771 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-16 23:44:10 +00:00
cf56078e25 Message previews.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3770 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 22:11:05 +00:00
a156cdea9f Update docs slightly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3769 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 21:58:58 +00:00
4637509b3d Enumerate apps without walking all DB keys.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3768 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 21:48:04 +00:00
1ae9aaf752 Update to commonmark.js 0.30.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3767 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 21:21:14 +00:00
11cd707382 MIT license this thing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3766 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 21:09:36 +00:00
1807264df5 Merged TODOs into todo app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3765 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 20:04:37 +00:00
e927ff915b Do some HTTP caching, because we have all of the information to make it easy.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3764 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 19:05:59 +00:00
b8068b9ed1 Fix following.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3763 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 18:02:05 +00:00
019ab99ecc Trying to better understand import/export leaks. Possibly cleaned up after tasks better, but mostly just tweaked counters.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3762 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 17:40:24 +00:00
c40a513876 Mention all sources when sharing an app. I don't entirely know how blobs replicate, and this seems safest.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3761 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 01:34:11 +00:00
dbfa9e5623 Show placeholders for missing messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3760 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-15 00:29:51 +00:00
5e0304481b Immediately forward any non-post messages to the browser. The thought was to let votes through right away, because there's no harm, and I wanted to see what else makes sense.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3759 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-14 23:55:14 +00:00
0bcc7d8c59 Always fetch the promise JSValue and ID when we allocate one. Make it impossible that we've freed it before we return it. Hopefully fixes leaks. Definitely not worse for performance.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3758 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-14 03:05:37 +00:00
27c2f27708 Show and hide the splitter with the editor so that it doesn't shift the content to the right when the editor is hidden.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3757 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-13 02:18:40 +00:00
e1f868730f Tracing these list lengths sometimes dominates performance, so manually keep count for now.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3756 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-13 01:08:17 +00:00
7ba1e6980f Some UI tweaks and some sqlite performance things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3755 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-13 00:16:27 +00:00
35b7eb511a Support selecting a thread and showing related messages (by a rather brute force search). Sort child messages in the reverse order of top level messages, because that's how we roll.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3754 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-12 02:55:29 +00:00
d51eb64c8e Add a docker file. Runs enough to produce some output but not really tested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3753 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-11 23:17:18 +00:00
53aac8d23a Fixed a time int overflow issue on raspberry pi.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3752 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-11 03:18:15 +00:00
9d105bdc1a Remove speedscope. Long live perfetto. Until speedscope supports multiple processes/threads and counters, then I'm totally on board for coming back.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3751 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-11 03:08:21 +00:00
873019f054 Binary search exports, too. Is that all the things? This could still be improved, some. And tested.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3750 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-10 01:50:58 +00:00
7f8155613c Tweaked the message UI.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3749 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 21:31:05 +00:00
5f96eb18b2 Null check, though how did we get here?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3748 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 20:40:56 +00:00
32c7fcbbfa Show load time. Make it faster. Make it easier to instrument.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3747 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 20:36:15 +00:00
c28d4d9378 Missing binds.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3746 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 19:27:05 +00:00
6af9c17efe Added a primitive like/react menu.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3745 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 17:44:46 +00:00
ec9e9151dc Stay on https: through redirects.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3744 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 01:36:29 +00:00
86aa5e4d1e Better feedback when importing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3743 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-09 01:32:33 +00:00
26150f98e1 Binary search import records.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3742 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-08 21:56:57 +00:00
bb81fc87b9 Fast path for viewing a single user's feed, and reduce churn in collecting votes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3741 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-08 21:12:36 +00:00
700d09c730 Redid lots of things about viewing an invidual user's feed, their profile, and following users.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3740 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-08 20:54:02 +00:00
50d860183d Now with fewer dupe messages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3739 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-08 00:15:09 +00:00
1cf55d7d64 Minor refresh cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3738 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-08 00:08:01 +00:00
ae84f69025 Progress toward viewing user profile pages.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3737 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-07 01:52:47 +00:00
49ffd1055e Fixed some messages not finding their root.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3736 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-05 12:16:44 +00:00
e2c25ab414 libuv 1.43.0
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3735 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-05 02:04:05 +00:00
c02a3d3659 Fixed https.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3734 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-05 01:58:12 +00:00
24cf18651a Fixed some error reporting.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3733 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-03 02:25:11 +00:00
3eabe72299 Slightly simplifying refresh().
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3732 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-03 01:44:14 +00:00
e1448a1c3a Simplify sendUser.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3731 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-03 01:30:53 +00:00
df5dfa1539 Hooked up the trace link to perfetto.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3730 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-02 19:10:45 +00:00
23b15a8dc5 Child processes send trace information back to the parent. Also fixed weird double-activation of children.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3729 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-02 18:17:58 +00:00
d550092bd3 sqlite-amalgamation-3370100.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3728 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-02 16:08:19 +00:00
4268963e70 Send followers/following information differently so that we load posts faster.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3727 ed5197a5-7fde-0310-b194-c3ffbd925b24
2022-01-02 15:36:11 +00:00
3026443c1e Support replying to a thread.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3726 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-31 19:01:53 +00:00
4e359c3f5c Trying some app-side caching in the SSB app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3725 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-31 18:42:37 +00:00
4f1b31bce0 Oof, fixed an issue getting recent posts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3724 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-31 16:10:08 +00:00
b980bb4946 Redo sharing apps so that they can be mentioned from regular posts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3723 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-31 15:12:46 +00:00
fafc524c8c Just messing around with things. Not sure I've made anything better.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3722 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-31 00:57:57 +00:00
0cab3e7ed9 Fixing getRecentPostIds for the millionth time.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3721 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-29 21:20:24 +00:00
12010a84a3 Sped up some follower/following UI. But ultimately followed more people and made everything else slower.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3720 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-29 21:00:03 +00:00
f7974d2cef Batch vue data updates, and sort the users list.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3719 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-29 19:46:55 +00:00
62e9dfea90 Trying to improve some of my slow vue code by pre-computing some things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3718 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-29 16:01:34 +00:00
0bf216bb1a Show an '[Refresh] N unread messages' toolbar instead of flooding the browser with new posts.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3717 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-29 14:57:10 +00:00
aba95d4fe8 Initialize these form fields in the about dialog.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3716 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 21:54:43 +00:00
5e205ac897 Fix some errors I've seen responding to blobs.get. Especially: handle sending large blobs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3715 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 21:48:03 +00:00
0f7472fa22 Trying to make the SSB client webapp tolerable. Middling success. Let me set some 'about' information. Tweak what information is shown where as I experiment. Mess with the feed logic.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3714 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 20:21:23 +00:00
12ab2f4b85 Don't let promise IDs be zero.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3713 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 19:47:32 +00:00
f676cd937f Add a little app to list apps.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3712 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 17:48:21 +00:00
263a59f6c5 Binary search promises.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3711 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 17:44:48 +00:00
2e1e4f90e7 Working toward less aggressive blob and feed fetching.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3710 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-28 15:25:04 +00:00
6eed168b7d Walking these callback lists that might unregister callbacks is a use after free hazard. Hmm.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3709 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 22:28:27 +00:00
9f0315458f Saw an asan issue here.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3708 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 22:27:27 +00:00
c590eb3a44 Whoops. Compile fixes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3707 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 22:00:37 +00:00
2e1b0089ae Clean up failed callbacks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3706 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 21:48:16 +00:00
05b55c849a Make setTimeout callable from ssb.js by moving it into util.js.c.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3705 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 20:49:07 +00:00
5fbe9c42bc Show new posts at the top of the list.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3704 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 20:24:14 +00:00
3cddc524d1 Some ebt.replicate success.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3703 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-27 19:52:42 +00:00
efcada8e25 Fix some leaks on a clean boot.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3702 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-23 20:31:37 +00:00
c616a16993 Still not syncing with the other clients I want but fighting to try to get it.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3701 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-22 19:57:34 +00:00
d4f7fdfc40 Make the editor pane resizable.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3700 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-22 15:05:08 +00:00
f760d48368 Look ma, no CDNs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3699 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-22 14:27:52 +00:00
ba87f9acaa Moving things off of CDNs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3698 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-22 13:51:49 +00:00
9faa4c9ca6 More minor output changes.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3697 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-21 22:43:41 +00:00
58b0b54785 sqlite-amalgamation-3370000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3696 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-21 20:10:06 +00:00
e3b83c10db Integrate speedscope. Just visit /scope.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3695 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-21 19:53:30 +00:00
7f31798119 Another trace fix. Now it's perfect.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3694 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-21 19:33:02 +00:00
d9ffca81f8 Trace some lengths of linked lists.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3693 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-21 19:06:44 +00:00
1dd3b3c9aa More logging reduction and a trace fix.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3692 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-21 18:09:15 +00:00
8075bdfe99 Avoid a message storm, and reduce log spam a bit.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3691 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-20 17:00:25 +00:00
b15cf901ad Fix some things that GCC 10 doesn't like on raspi.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3690 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-17 23:58:59 +00:00
84a3d7348d Add a way to set arbitrary data accessible by all tasks. Use it to allow autologin for testing multiple instances more easily.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3689 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-12-01 23:29:53 +00:00
00c1ec660e Add some tests for message callbacks, and fix all the things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3688 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-17 23:47:55 +00:00
9e1bab03eb Made it easier to run multiple instances.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3687 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-14 22:55:21 +00:00
63c344112d Add a callback for when messages are added to the database. Abuse it to forward messages semi-live.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3686 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-11 00:05:07 +00:00
18c90214a8 Trying to normalize event handling somewhat. More to go before it's simple.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3685 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-07 22:28:58 +00:00
68cf3efcde I am too good at breaking syncing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3684 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-06 02:10:13 +00:00
308e24c9fa Maybe ordered better?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3683 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-03 23:23:20 +00:00
2fb7fceb0c Consolidate error handling until util, too.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3682 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-03 22:28:25 +00:00
fde7fb4270 Create a util.js.{h,c} from some common things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3681 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-11-03 22:15:46 +00:00
03a2367532 Fixed lots of things about storing blobs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3680 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-31 21:15:18 +00:00
08cd0ec878 Continuing to try to get this thing talking to other clients.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3679 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-31 19:39:16 +00:00
0a01332d1f Fix some RPC issues?
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3678 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-30 21:07:01 +00:00
256c47c33c Ugg, need to get this talking SSB properly.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3677 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-28 02:19:57 +00:00
62ad08985c Whoops.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3676 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-28 01:11:30 +00:00
21ba7cb02c Make all of the File.* operations async.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3675 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-28 00:53:16 +00:00
77ec1a0b2e Don't start the broadcast listener if we're not starting an SSB server.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3674 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-28 00:20:17 +00:00
07a0828626 Async File.writeFile.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3673 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-27 23:27:21 +00:00
08e32c0de4 Minor cleanups.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3672 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-24 19:23:21 +00:00
f4f6bb8333 Move all JS interface things into .js.c files with _register() functions.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3671 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-24 15:46:30 +00:00
b1a6384ac1 Don't allow unexpected arguments.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3670 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-15 19:44:10 +00:00
786c83c57c Fix tests in light of async File.readFile.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3669 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-10 22:45:24 +00:00
843c53e15e I just decided. Braces on their own lines.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3668 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-10 21:51:38 +00:00
470814f147 Made File.readFile async.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3667 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-06 01:25:33 +00:00
24a91219c1 Improve some problematic redirects.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3666 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-04 01:15:33 +00:00
d3e02470cd Remove debug echos.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3665 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-03 22:17:30 +00:00
6d2b560c3d Rearrange the makefile so that debug and release can be built together. There are probably easy ways to make this more concise that I am missing.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3664 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-10-03 22:14:06 +00:00
059392df8e What was ssb.rpc.c now lives in ssb.js.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3663 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-09 00:37:02 +00:00
3b4f0c1321 Add a green [pass] print.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3662 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-09 00:23:55 +00:00
a09d159268 Moving a little bit more to this test.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3661 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-09 00:15:57 +00:00
91ec68252d Cleans up some confusing output from -t ssb.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3660 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-06 21:21:51 +00:00
e85168ac53 Fixed some memory leaks. Memory leak-related paranoia. Minor cleanups.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3659 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-06 20:54:44 +00:00
35e0d8b68a Add some test infrastructure.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3658 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-06 18:23:22 +00:00
cadcb236ee Work in progress moving SSB RPC handlers into javascript.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3657 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-09-06 17:50:38 +00:00
cfd5341a6b Rename the DB things.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3656 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-08-22 19:41:27 +00:00
e922af4c55 Trying to get organized. Move things db, import, and export out of ssb.c.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3655 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-08-22 19:34:28 +00:00
45dfe34375 Fix the release build.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3654 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-08-22 17:38:20 +00:00
c78d3b0413 That's all of the tests.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3653 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-08-19 20:10:37 +00:00
dd90fe4fbf Starting to move the tests to C.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3652 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-08-19 19:29:37 +00:00
be6a39bd15 sqlite-amalgamation-3360000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3651 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-08-05 15:56:16 +00:00
da51e87774 libuv 1.42.0.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3650 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-07-27 22:08:18 +00:00
5197eb91f7 quickjs-2021-03-27.tar.xz
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3649 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-07-27 22:00:49 +00:00
87747c0b6b Oh, votes are slowing everything down. Batch them and simplify.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3648 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-20 02:20:40 +00:00
03cf347394 Try to clean up some websocket noise, and try harder to not duplicate connections.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3647 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-20 02:01:14 +00:00
3487f335e5 Remove an explicit GC call.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3646 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-20 01:42:47 +00:00
8c0d380a4d printf newline.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3645 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-20 01:39:06 +00:00
b660abff7f Better yet, the main script into its own file.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3644 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-14 02:59:11 +00:00
5988fddf8d Split up the ssb web client into one file per vue component.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3643 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-14 02:56:14 +00:00
f268ca3adf Minor ssb web client cleanup before I attempt some major cleanup.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3642 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-14 02:45:52 +00:00
cbc21cfbe6 Don't connect to ourselves or duplicates.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3641 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-14 02:45:10 +00:00
cf195cdd44 Only save modified files. Much faster saves.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3640 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-13 02:40:46 +00:00
85c5b4c4d6 Remove pubs from the ssb client app. Not used.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3639 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-13 02:39:20 +00:00
7d8258c262 Add args to unsupported message response based on some warnings I saw. Indicate which files are unsaved in the editor.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3638 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-13 02:15:09 +00:00
92c06b34a9 A few minor things. Fixed missing fields from app messages. Fixed some missing messages. Removed unnecessary asyncs.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3637 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-12 02:23:57 +00:00
7012418b13 Support requiring adjacent files from the same app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3636 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-11 02:09:19 +00:00
2b5a56abfe Allow visiting/viewing an app message by id.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3635 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-09 23:06:33 +00:00
d8657866f5 This lets me post a 'tildefriends-app' message.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3634 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-09 22:19:52 +00:00
a2851f8ade More legible colors.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3633 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-09 19:16:39 +00:00
ff4c144be3 Expose a user's apps. Baby step to being able to share an app.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3632 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-06 02:56:25 +00:00
3650cd8350 Only warn on errors in src/, not dependencies.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3631 ed5197a5-7fde-0310-b194-c3ffbd925b24
2021-01-04 01:58:50 +00:00
956 changed files with 141403 additions and 273479 deletions

20
.clang-format Normal file
View File

@ -0,0 +1,20 @@
# Format Style Options - Created with Clang Power Tools
---
BasedOnStyle: WebKit
AlignEscapedNewlines: DontAlign
AlignOperands: DontAlign
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: false
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Allman
ColumnLimit: 180
ContinuationIndentWidth: 4
IndentCaseBlocks: true
IndentWidth: 4
MaxEmptyLinesToKeep: 1
ObjCBlockIndentWidth: 4
ObjCBreakBeforeNestedBlockParam: false
SortIncludes: true
TabWidth: 4
UseTab: Always
...

3
.dockerignore Normal file
View File

@ -0,0 +1,3 @@
.git
db.sqlite*
out/

2
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1,2 @@
# Add prettier to the project
41024ddb7961b04a5688bbc997cb74de6fab4763

View File

@ -0,0 +1,71 @@
name: Build Tilde Friends
run-name: ${{ gitea.actor }} running 🚀
on: [push]
jobs:
Build-All:
runs-on: ubuntu-latest
container:
image: node:23-bookworm-slim
valid_volumes:
- '/opt/keys'
- '/opt/deps'
volumes:
- /opt/keys:/opt/keys
- /opt/deps:/opt/deps
steps:
- name: Install build dependencies
run: >
apt update && apt install -y \
build-essential \
clang-19 \
cmake \
curl \
docker.io \
doxygen \
file \
gcc-aarch64-linux-gnu \
git \
graphviz \
libgpgme11 \
libssl-dev \
mingw-w64 \
rsync \
unzip \
zip \
zlib1g-dev
- name: Get code
uses: actions/checkout@v4
with:
submodules: true
- name: Setup environment
run: |
update-alternatives --install /usr/bin/clang clang /usr/bin/clang-19 100
update-alternatives --install /usr/bin/clang++ clang++ /usr/bin/clang++-19 100
ln -s /opt/keys .keys
ln -sf /opt/deps/ios_toolchain deps/
ln -sf /opt/deps/macos_toolchain deps/
- name: Build documentation
run: |
mkdir -p out/html/ ~/.ssh/
make docs
echo 'pildefriends ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIKD3Kde5vDO0TrMBDK0IGGeNGe/XinWAZkSQ/rXxwUjt' >> ~/.ssh/known_hosts
rsync -avP --delete -e "ssh -i /opt/keys/ssh.ed25519" out/html/ tfdocs@pildefriends:docs/html/
- name: Setup JDK
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Setup Android SDK
uses: android-actions/setup-android@v3
with:
packages: 'tools platform-tools build-tools;34.0.0 platforms;android-34 ndk;26.3.11579264'
- name: Docker build
run: DOCKER_BUILDKIT=1 docker build .
- name: Build
run: ANDROID_SDK=$HOME/.android/sdk make -j`nproc` all dist docs
- name: Upload artifacts
uses: actions/upload-artifact@v3
with:
name: dist
path: dist/*

20
.gitignore vendored Normal file
View File

@ -0,0 +1,20 @@
build/
*.core
db.*
deps/ios_toolchain
deps/macos_toolchain
deps/openssl/
dist/
.flatpak-builder
.keys
**/.DS_Store
logs/
**/node_modules
out
repo/
result
*.swo
*.swp
tmp/
unsigned/
.zsign_cache/

31
.gitmodules vendored Normal file
View File

@ -0,0 +1,31 @@
[submodule "deps/zlib"]
path = deps/zlib
url = https://github.com/madler/zlib.git
[submodule "deps/libsodium"]
path = deps/libsodium
url = https://github.com/jedisct1/libsodium.git
[submodule "deps/quickjs"]
path = deps/quickjs
url = https://github.com/bellard/quickjs.git
[submodule "deps/crypt_blowfish"]
path = deps/crypt_blowfish
url = https://github.com/openwall/crypt_blowfish.git
[submodule "deps/libbacktrace"]
path = deps/libbacktrace
url = https://github.com/ianlancetaylor/libbacktrace.git
[submodule "deps/libuv"]
path = deps/libuv
url = https://github.com/libuv/libuv.git
[submodule "deps/picohttpparser"]
path = deps/picohttpparser
url = https://github.com/h2o/picohttpparser.git
[submodule "deps/openssl_src"]
path = deps/openssl_src
url = https://github.com/openssl/openssl.git
shallow = true
[submodule "deps/c-ares"]
path = deps/c-ares
url = https://github.com/c-ares/c-ares.git
[submodule "deps/zsign"]
path = deps/zsign
url = https://github.com/zhlynn/zsign.git

15
.prettierignore Normal file
View File

@ -0,0 +1,15 @@
node_modules
src
deps
.clang-format
flake.lock
# Minified files
**/*.min.css
**/*.min.js
**/leaflet.*
**/commonmark*
**/w3.css
apps/ssb/tribute.esm.js
apps/api/app.js
**/emojis.json

5
.prettierrc.yaml Normal file
View File

@ -0,0 +1,5 @@
trailingComma: 'es5'
useTabs: true
semi: true
singleQuote: true
bracketSpacing: false

37
CONTRIBUTING.md Normal file
View File

@ -0,0 +1,37 @@
# Contributing to Tilde Friends
Thank you for your interest in Tilde Friends.
Above all, Tilde Friends aims to be a fun, safe place to play. When that is at
odds with the course of development, we will work through it with respectful
communication.
## How can I contribute?
The nature of Tilde Friends makes for a wide range of ways to contribute
- Just use it. Really, just kicking the tires will probably shake out issues
in useful ways at this point.
- Report and comment on bugs: https://dev.tildefriends.net/issues.
- Make apps. You don't need my permission to make and share apps with Tilde
Friends. I hope that an ecosystem of good apps grows outside of this
repository. If you want to recreate better versions of the stock apps, just
do it. If you make a better ssb app or whatever and drop me a line however
is most convenient for you, I will probably take a look and consider
replacing the stock one with it.
- Write about it. Docs in the git repository, blog posts, private messages to
me with ideas...really there is no wrong answer. Just make some noise, and
I'll do my best to incorporate or otherwise link your feedback and make the
most of it.
- Write C code in the git repository. I'm really striving for it to be the
case that other people don't really need to meddle in there, but if you can
help out, I will gladly review your pull requests via
https://dev.tildefriends.net/pulls.
## Best practices
- The C code is formatted with clang-format. Run `make format`.
- The rest is formatted with prettier. Run `npm run prettier`.
- We strive to have code compile on all platforms with no warnings and run with
no sanitizer issues.
- There are tests. Run `out/debug/tildefriends test`.

59
COPYING
View File

@ -1,59 +0,0 @@
Tilde Friends - An operating system for the web.
Copyright (C) 2014 Cory McWilliams <cory@unprompted.com>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Additional permission under GNU GPL version 3 section 7
If you modify this Program, or any covered work, by linking or combining it
with libuv (or a modified version of that library), containing parts covered by
the terms of the MIT License, the licensors of this Program grant you
additional permission to convey the resulting work. {Corresponding Source for
a non-source form of such a combination shall include the source code for the
parts of libuv used as well as that of the covered work.}
If you modify this Program, or any covered work, by linking or combining it
with QuickJS (or a modified version of that library), containing parts covered
by the terms of the MIT License, the licensors of this Program grant you
additional permission to convey the resulting work. {Corresponding Source for
a non-source form of such a combination shall include the source code for the
parts of QuickJS used as well as that of the covered work.}
If you modify this Program, or any covered work, by linking or combining it
with libsodium (or a modified version of that library), containing parts
covered by the terms of the ISC License, the licensors of this Program grant
you additional permission to convey the resulting work. {Corresponding Source
for a non-source form of such a combination shall include the source code for
the parts of libsodium used as well as that of the covered work.}
If you modify this Program, or any covered work, by linking or combining it
with xopt (or a modified version of that library), containing parts covered by
the terms of the Apache License 2.0, the licensors of this Program grant you
additional permission to convey the resulting work. {Corresponding Source for
a non-source form of such a combination shall include the source code for the
parts of xopt used as well as that of the covered work.}
If you modify this Program, or any covered work, by linking or combining it
with crypt_blowfish (or a modified version of that library), containing parts
covered by the terms of the MIT License, the licensors of this Program grant
you additional permission to convey the resulting work. {Corresponding Source
for a non-source form of such a combination shall include the source code for
the parts of crypt_blowfish used as well as that of the covered work.}
If you modify this Program, or any covered work, by linking or combining it
with base64c (or a modified version of that library), containing parts covered
by the terms of the BSD 3-Clause License, the licensors of this Program grant
you additional permission to convey the resulting work. {Corresponding Source
for a non-source form of such a combination shall include the source code for
the parts of base64c used as well as that of the covered work.}

20
Dockerfile Normal file
View File

@ -0,0 +1,20 @@
FROM bitnami/minideb:bookworm AS build
RUN apt-get update && \
apt-get install -y --no-install-recommends \
gcc \
libc6-dev \
perl \
make
COPY . /app
RUN make -C /app -j $(nproc) release
FROM bitnami/minideb:bookworm
COPY --from=build /app/out/release/tildefriends /app/out/release/tildefriends
COPY --from=build /app/apps /app/apps
COPY --from=build /app/core /app/core
WORKDIR /app
EXPOSE 12345
ENTRYPOINT ["/app/out/release/tildefriends"]

2817
Doxyfile Normal file

File diff suppressed because it is too large Load Diff

1488
GNUmakefile Normal file

File diff suppressed because it is too large Load Diff

680
LICENSE
View File

@ -1,661 +1,19 @@
GNU AFFERO GENERAL PUBLIC LICENSE
Version 3, 19 November 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU Affero General Public License is a free, copyleft license for
software and other kinds of works, specifically designed to ensure
cooperation with the community in the case of network server software.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
our General Public Licenses are intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
Developers that use our General Public Licenses protect your rights
with two steps: (1) assert copyright on the software, and (2) offer
you this License which gives you legal permission to copy, distribute
and/or modify the software.
A secondary benefit of defending all users' freedom is that
improvements made in alternate versions of the program, if they
receive widespread use, become available for other developers to
incorporate. Many developers of free software are heartened and
encouraged by the resulting cooperation. However, in the case of
software used on network servers, this result may fail to come about.
The GNU General Public License permits making a modified version and
letting the public access it on a server without ever releasing its
source code to the public.
The GNU Affero General Public License is designed specifically to
ensure that, in such cases, the modified source code becomes available
to the community. It requires the operator of a network server to
provide the source code of the modified version running there to the
users of that server. Therefore, public use of a modified version, on
a publicly accessible server, gives the public access to the source
code of the modified version.
An older license, called the Affero General Public License and
published by Affero, was designed to accomplish similar goals. This is
a different license, not a version of the Affero GPL, but Affero has
released a new version of the Affero GPL which permits relicensing under
this license.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU Affero General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Remote Network Interaction; Use with the GNU General Public License.
Notwithstanding any other provision of this License, if you modify the
Program, your modified version must prominently offer all users
interacting with it remotely through a computer network (if your version
supports such interaction) an opportunity to receive the Corresponding
Source of your version by providing access to the Corresponding Source
from a network server at no charge, through some standard or customary
means of facilitating copying of software. This Corresponding Source
shall include the Corresponding Source for any work covered by version 3
of the GNU General Public License that is incorporated pursuant to the
following paragraph.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the work with which it is combined will remain governed by version
3 of the GNU General Public License.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU Affero General Public License from time to time. Such new versions
will be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU Affero General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU Affero General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU Affero General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If your software can interact with users remotely through a computer
network, you should also make sure that it provides a way for users to
get its source. For example, if your program is a web application, its
interface could display a "Source" link that leads users to an archive
of the code. There are many ways you could offer source, and different
solutions will be better for different programs; see section 13 for the
specific requirements.
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU AGPL, see
<http://www.gnu.org/licenses/>.
Copyright 2014 Cory McWilliams
Permission is hereby granted, free of charge, to any person obtaining a copy of
this software and associated documentation files (the "Software"), to deal in
the Software without restriction, including without limitation the rights to
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
of the Software, and to permit persons to whom the Software is furnished to do
so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

170
Makefile
View File

@ -1,170 +0,0 @@
PROJECT = tildefriends
BUILD_DIR ?= out
COMMON_CFLAGS = \
-Wall \
-Werror \
-Wextra \
-Wno-unused-parameter \
-Wno-cast-function-type \
-MMD \
-ffunction-sections \
-fdata-sections
COMMON_LDFLAGS += -Wl,-gc-sections
ifneq ($(UNUSED),)
COMMON_LDFLAGS += -Wl,-print-gc-sections
endif
ifneq ($(DEBUG),)
COMMON_CFLAGS += -g -fsanitize=address -fsanitize=undefined
COMMON_LDFLAGS += -fsanitize=address -fsanitize=undefined
BUILD_DIR := $(BUILD_DIR)/debug
else
COMMON_CFLAGS += -DNDEBUG -O3
BUILD_DIR := $(BUILD_DIR)/release
endif
APP_BIN = $(BUILD_DIR)/$(PROJECT)
APP_SOURCES = $(wildcard src/*.c)
APP_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(APP_SOURCES))
$(APP_OBJS): CFLAGS += \
-Ideps/base64c/include \
-Ideps/crypt_blowfish \
-Ideps/quickjs \
-Ideps/sqlite \
-Ideps/libuv/include \
-Ideps/xopt
BASE64C_SOURCES = deps/base64c/src/base64c.c
BASE64C_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(BASE64C_SOURCES))
$(BASE64C_OBJS): CFLAGS += \
-Wno-sign-compare
BLOWFISH_SOURCES = \
deps/crypt_blowfish/crypt_blowfish.c \
deps/crypt_blowfish/crypt_gensalt.c \
deps/crypt_blowfish/wrapper.c
BLOWFISH_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(BLOWFISH_SOURCES))
UV_SOURCES = \
deps/libuv/src/fs-poll.c \
deps/libuv/src/idna.c \
deps/libuv/src/inet.c \
deps/libuv/src/random.c \
deps/libuv/src/strscpy.c \
deps/libuv/src/threadpool.c \
deps/libuv/src/timer.c \
deps/libuv/src/unix/async.c \
deps/libuv/src/unix/core.c \
deps/libuv/src/unix/dl.c \
deps/libuv/src/unix/fs.c \
deps/libuv/src/unix/getaddrinfo.c \
deps/libuv/src/unix/getnameinfo.c \
deps/libuv/src/unix/linux-core.c \
deps/libuv/src/unix/linux-inotify.c \
deps/libuv/src/unix/linux-syscalls.c \
deps/libuv/src/unix/loop-watcher.c \
deps/libuv/src/unix/loop.c \
deps/libuv/src/unix/pipe.c \
deps/libuv/src/unix/poll.c \
deps/libuv/src/unix/process.c \
deps/libuv/src/unix/procfs-exepath.c \
deps/libuv/src/unix/proctitle.c \
deps/libuv/src/unix/random-devurandom.c \
deps/libuv/src/unix/random-getrandom.c \
deps/libuv/src/unix/random-sysctl-linux.c \
deps/libuv/src/unix/signal.c \
deps/libuv/src/unix/stream.c \
deps/libuv/src/unix/tcp.c \
deps/libuv/src/unix/thread.c \
deps/libuv/src/unix/tty.c \
deps/libuv/src/unix/udp.c \
deps/libuv/src/uv-common.c \
deps/libuv/src/uv-data-getter-setters.c \
deps/libuv/src/version.c
UV_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(UV_SOURCES))
$(UV_OBJS): CFLAGS += \
-Ideps/libuv/include \
-Ideps/libuv/src \
-Wno-unused-but-set-variable \
-Wno-incompatible-pointer-types \
-Wno-sign-compare \
-D_GNU_SOURCE \
SQLITE_SOURCES = deps/sqlite/sqlite3.c
SQLITE_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(SQLITE_SOURCES))
$(SQLITE_OBJS): CFLAGS += \
-DSQLITE_DBCONFIG_DEFAULT_DEFENSIVE \
-DSQLITE_ENABLE_JSON1 \
-DSQLITE_MAX_LENGTH=5242880 \
-DSQLITE_MAX_SQL_LENGTH=100000 \
-DSQLITE_MAX_COLUMN=100 \
-DSQLITE_MAX_EXPR_DEPTH=20 \
-DSQLITE_MAX_COMPOUND_SELECT=3 \
-DSQLITE_MAX_VDBE_OP=25000 \
-DSQLITE_MAX_FUNCTION_ARG=8 \
-DSQLITE_MAX_ATTACHED=0 \
-DSQLITE_MAX_LIKE_PATTERN_LENGTH=50 \
-DSQLITE_MAX_VARIABLE_NUMBER=100 \
-DSQLITE_MAX_TRIGGER_DEPTH=10 \
-DSQLITE_SECURE_DELETE \
-Wno-implicit-fallthrough
XOPT_SOURCES = deps/xopt/xopt.c
XOPT_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(XOPT_SOURCES))
QUICKJS_SOURCES = \
deps/quickjs/cutils.c \
deps/quickjs/libbf.c \
deps/quickjs/libregexp.c \
deps/quickjs/libunicode.c \
deps/quickjs/quickjs-libc.c \
deps/quickjs/quickjs.c
QUICKJS_OBJS = $(patsubst %.c,$(BUILD_DIR)/%.o,$(QUICKJS_SOURCES))
$(QUICKJS_OBJS): CFLAGS += \
-DCONFIG_VERSION=\"$(shell cat deps/quickjs/VERSION)\" \
-DDUMP_LEAKS \
-D_GNU_SOURCE \
-Wno-sign-compare \
-Wno-implicit-fallthrough \
-Wno-unused-variable \
-Wno-unused-but-set-variable
APP_LDFLAGS = \
$(COMMON_LDFLAGS) \
$(LDFLAGS) \
-pthread \
-ldl \
-lm \
-lssl \
-lcrypto \
-lsodium
DEFAULT_TARGET = $(APP_BIN)
all: $(DEFAULT_TARGET)
.PHONY: all
ALL_APP_OBJS = \
$(APP_OBJS) \
$(BASE64C_OBJS) \
$(BLOWFISH_OBJS) \
$(UV_OBJS) \
$(SQLITE_OBJS) \
$(QUICKJS_OBJS) \
$(XOPT_OBJS)
DEPS = $(ALL_APP_OBJS:.o=.d)
-include $(DEPS)
$(APP_BIN): $(ALL_APP_OBJS)
$(CC) -o $@ $^ $(APP_LDFLAGS)
$(BUILD_DIR)/%.o: %.c
@mkdir -p $(dir $@)
@echo [c] $@
@$(CC) $(COMMON_CFLAGS) $(CFLAGS) -c $< -o $@
clean:
rm -rf $(BUILD_DIR)
.PHONY: clean

View File

@ -1,26 +1,72 @@
# Tilde Friends
Tilde Friends is a program that aims to securely host and share pure JavaScript web applications.
Tilde Friends participates in the Secure Scuttlebutt decentralized social
network while also functioning as a platform for making, sharing, and running
web applications.
A public instance lives at https://www.tildefriends.net/.
## Goals
1. Make it easy and fun to run all sorts of web applications.
2. Provide a security model that is easy to understand and protects your data.
3. Make creating and sharing web applications accessible to anyone with a browser.
1. Be the fanciest, best-maintained Secure Scuttlebutt client in town.
1. Make it easy to make, share, and run all sorts of applications while
respecting the privacy and safety of your data.
## Getting the Source
Tilde Friends uses git submodules, so either:
```
git clone --recurse-submodules https://dev.tildefriends.net/cory/tildefriends.git
```
or:
```
git clone https://dev.tildefriends.net/cory/tildefriends.git
cd tildefriends
git submodule update --init --recursive
```
The `.tar.xz` source releases are all-inclusive.
## Building
1. Requires libsodium and openssl. Other dependencies are kept up to date in the tree.
2. To build, run `make` or `make DEBUG=1`. An executable will be generated in a subdirectory of `out/`.
Builds on Linux (x86_64 and aarch64), MacOS, OpenBSD, and Haiku. It's possible
to build for Android, iOS, and Windows on Linux, if you have the right
dependencies in the right places.
### Requirements
System OpenSSL libraries are assumed to be available on Haiku and OpenBSD.
On MacOS, Xcode's command-line tools are expected to be available.
### Build Commands
Run `make` with no arguments to see available build targets and options. `make
debug` is a good place to start.
To build in docker, `docker build .`.
`make format` and `make prettier` will normalize formatting to the coding
standard.
## Running
This is only just starting to show some signs of beginning to work as intended. Set expectations low.
Running the built `tildefriends` executable will start a web server at <http://localhost:12345/>. `tildefriends -h` lists further options.
By default, running the built `out/debug/tildefriends` executable will start a
web server at <http://localhost:12345/>. `tildefriends -h` lists further
options.
The first user to create an account and log in will be granted administrative privileges. Everything can be managed entirely from the web interface.
Some starter apps can be installed by running `tildefriends import -u cory`. Hint: `~cory/docs/` and `~cory/index/`.
The first user to create an account and log in will be granted administrative
privileges. Further administration can be done in the `admin` app at
<http://localhost:12345/~core/admin/>.
## Documentation
There are the very beginnings of developer documentation in `apps/cory/docs/` that can be read in-place or in-browser by running `tildefriends import -u cory` and then visiting <http://localhost:12345/~cory/docs/>.
Docs live here: <https://docs.tildefriends.net/>.
## License
All code unless otherwise noted in [COPYING](https://www.unprompted.com/projects/browser/projects/tildefriends/trunk/COPYING) is provided under the [Affero GPL 3.0](https://www.unprompted.com/projects/browser/projects/tildefriends/trunk/LICENSE) license.
All code unless otherwise noted in is provided under the
[MIT](https://opensource.org/licenses/MIT) license.

5
apps/admin.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "🎛",
"previous": "&kmKNyb/uaXNb24gCinJtfS8iWx4cLUWdtl0y2DwEUas=.sha256"
}

30
apps/admin/app.js Normal file
View File

@ -0,0 +1,30 @@
import * as tfrpc from '/tfrpc.js';
tfrpc.register(function delete_user(user) {
return core.deleteUser(user);
});
tfrpc.register(function global_settings_set(key, value) {
return core.globalSettingsSet(key, value);
});
async function main() {
try {
let data = {
users: {},
granted: await core.allPermissionsGranted(),
settings: await core.globalSettingsDescriptions(),
};
for (let user of await core.users()) {
data.users[user] = await core.permissionsForUser(user);
}
await app.setDocument(
utf8Decode(getFile('index.html')).replace('$data', JSON.stringify(data))
);
} catch {
await app.setDocument(
'<span style="color: #f00">Only an administrator can modify these settings.</span>'
);
}
}
main();

41
apps/admin/index.html Normal file
View File

@ -0,0 +1,41 @@
<!doctype html>
<html style="width: 100%">
<head>
<script>
const g_data = $data;
</script>
<link rel="stylesheet" href="w3.css" />
<!-- prettier-ignore -->
<style>
/* 2018 Valiant Poppy */
.w3-theme-l5 {color:#000 !important; background-color:#fbf3f3 !important}
.w3-theme-l4 {color:#000 !important; background-color:#f3d7d6 !important}
.w3-theme-l3 {color:#000 !important; background-color:#e6afae !important}
.w3-theme-l2 {color:#fff !important; background-color:#da8785 !important}
.w3-theme-l1 {color:#fff !important; background-color:#cd5f5d !important}
.w3-theme-d1 {color:#fff !important; background-color:#a93634 !important}
.w3-theme-d2 {color:#fff !important; background-color:#96302e !important}
.w3-theme-d3 {color:#fff !important; background-color:#832a28 !important}
.w3-theme-d4 {color:#fff !important; background-color:#702423 !important}
.w3-theme-d5 {color:#fff !important; background-color:#5e1e1d !important}
.w3-theme-light {color:#000 !important; background-color:#fbf3f3 !important}
.w3-theme-dark {color:#fff !important; background-color:#5e1e1d !important}
.w3-theme-action {color:#fff !important; background-color:#5e1e1d !important}
.w3-theme {color:#fff !important; background-color:#bd3d3a !important}
.w3-text-theme {color:#bd3d3a !important}
.w3-border-theme {border-color:#bd3d3a !important}
.w3-hover-theme:hover {color:#fff !important; background-color:#bd3d3a !important}
.w3-hover-text-theme:hover {color:#bd3d3a !important}
.w3-hover-border-theme:hover {border-color:#bd3d3a !important}
</style>
</head>
<body class="w3-theme-l4">
<header class="w3-row w3-padding w3-header w3-theme-l1">
<h1>Tilde Friends Administration</h1>
</header>
</body>
<script type="module" src="script.js"></script>
</html>

13
apps/admin/lit.min.js vendored Normal file

File diff suppressed because one or more lines are too long

115
apps/admin/script.js Normal file
View File

@ -0,0 +1,115 @@
import {html, render} from './lit.min.js';
import * as tfrpc from '/static/tfrpc.js';
function delete_user(user) {
if (confirm(`Are you sure you want to delete the user "${user}"?`)) {
tfrpc.rpc
.delete_user(user)
.then(function () {
alert(`User "${user}" deleted successfully.`);
})
.catch(function (error) {
alert(
`Failed to delete user "${user}": ${JSON.stringify(error, null, 2)}.`
);
});
}
}
function global_settings_set(key, value) {
tfrpc.rpc
.global_settings_set(key, value)
.then(function () {
alert(`Set "${key}" to "${value}".`);
})
.catch(function (error) {
alert(`Failed to set "${key}": ${JSON.stringify(error, null, 2)}.`);
});
}
function title_case(name) {
return name
.split('_')
.map((x) => x.charAt(0).toUpperCase() + x.substring(1))
.join(' ');
}
window.addEventListener('load', function () {
const permission_template = (permission) => html` <code>${permission}</code>`;
function input_template(key, description) {
if (description.type === 'boolean') {
return html`
<li class="w3-row">
<label class="w3-quarter" for=${'gs_' + key} style="font-weight: bold">${title_case(key)}</label>
<div class="w3-quarter w3-padding">${description.description}</div>
<div class="w3-quarter w3-padding w3-center"><input class="w3-check" type="checkbox" ?checked=${description.value} id=${'gs_' + key}></input></div>
<button class="w3-quarter w3-button w3-theme-action" @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.firstChild.checked)}>Set</button>
</li>
`;
} else if (description.type === 'textarea') {
return html`
<li class="w3-row">
<label class="w3-quarter" for=${'gs_' + key} style="font-weight: bold"
>${title_case(key)}</label
>
<div class="w3-rest w3-padding">${description.description}</div>
<textarea
class="w3-input"
style="vertical-align: top; resize: vertical"
id=${'gs_' + key}
>
${description.value}</textarea
>
<button
class="w3-button w3-right w3-quarter w3-theme-action"
@click=${(e) =>
global_settings_set(
key,
e.srcElement.previousElementSibling.value
)}
>
Set
</button>
</li>
`;
} else if (description.type != 'hidden') {
return html`
<li class="w3-row">
<label class="w3-quarter" for=${'gs_' + key} style="font-weight: bold">${title_case(key)}</label>
<div class="w3-quarter w3-padding">${description.description}</div>
<input class="w3-input w3-quarter" type="text" value="${description.value}" id=${'gs_' + key}></input>
<button class="w3-button w3-quarter w3-theme-action" @click=${(e) => global_settings_set(key, e.srcElement.previousElementSibling.value)}>Set</button>
</li>
`;
}
}
const user_template = (user, permissions) => html`
<li class="w3-card w3-margin">
<button
class="w3-button w3-theme-action"
@click=${(e) => delete_user(user)}
>
Delete
</button>
${user}: ${permissions.map((x) => permission_template(x))}
</li>
`;
const users_template = (users) =>
html` <header class="w3-container w3-theme-l2"><h2>Users</h2></header>
<ul class="w3-ul">
${Object.entries(users).map((u) => user_template(u[0], u[1]))}
</ul>`;
const page_template = (data) =>
html`<div style="padding: 0; margin: 0; width: 100%; max-width: 100%">
<header class="w3-container w3-theme-l2"><h2>Global Settings</h2></header>
<div class="w3-container">
<ul class="w3-ul">
${Object.keys(data.settings)
.sort()
.map((x) => html`${input_template(x, data.settings[x])}`)}
</ul>
</div>
${users_template(data.users)}
</div> `;
render(page_template(g_data), document.body);
});

251
apps/admin/w3.css Normal file
View File

@ -0,0 +1,251 @@
/* W3.CSS 5.02 March 31 2025 by Jan Egil and Borge Refsnes */
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
a{background-color:transparent}a:active,a:hover{outline-width:0}
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
button,input{overflow:visible}button,select{text-transform:none}
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
[type=checkbox],[type=radio]{padding:0}
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
/* End extract */
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
hr{border:0;border-top:1px solid #eee;margin:20px 0}
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
.w3-main,#main{transition:margin-left .4s}
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
.w3-bar .w3-button{white-space:normal}
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
.w3-responsive{display:block;overflow-x:auto}
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
@media (max-width:1205px){.w3-auto{max-width:95%}}
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
.w3-display-position{position:absolute}
.w3-circle{border-radius:50%}
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
.w3-grid{display:grid}.w3-grid-padding{display:grid;gap:16px}.w3-flex{display:flex}
.w3-text-center{text-align:center}.w3-text-bold,.w3-bold{font-weight:bold}.w3-text-italic,.w3-italic{font-style:italic}
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
.w3-left{float:left!important}.w3-right{float:right!important}
.w3-button:hover{color:#000!important;background-color:#ccc!important}
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
.w3-hover-none:hover{box-shadow:none!important}
.w3-rtl{direction:rtl}.w3-ltr{direction:ltr}
/* Colors */
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
.w3-asphalt,.w3-hover-asphalt:hover{color:#fff!important;background-color:#343a40!important}
.w3-crimson,.w3-hover-crimson:hover{color:#fff!important;background-color:#a20025!important}
.w3-cobalt,w3-hover-cobalt:hover{color:#fff!important;background-color:#0050ef!important}
.w3-emerald,.w3-hover-emerald:hover{color:#fff!important;background-color:#008a00!important}
.w3-olive,.w3-hover-olive:hover{color:#fff!important;background-color:#6d8764!important}
.w3-paper,.w3-hover-paper:hover{color:#000!important;background-color:#f8f9fa!important}
.w3-sienna,.w3-hover-sienna:hover{color:#fff!important;background-color:#a0522d!important}
.w3-taupe,.w3-hover-taupe:hover{color:#fff!important;background-color:#87794e!important}
.w3-danger{color:#fff!important;background-color:#dd0000!important}
.w3-note{color:#000!important;background-color:#fff599!important}
.w3-info{color:#fff!important;background-color:#0a6fc2!important}
.w3-warning{color:#000!important;background-color:#ffb305!important}
.w3-success{color:#fff!important;background-color:#008a00!important}
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}

5
apps/api.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "📜",
"previous": "&BEf0nraBdHk/+PWqx6tOSu5rheWVaxaL7orAOz3285M=.sha256"
}

77
apps/api/app.js Normal file

File diff suppressed because one or more lines are too long

356
apps/api/docs.js Normal file
View File

@ -0,0 +1,356 @@
export const docs = {};
docs.global = `# Tilde Friends API Documentation
Welcome to the Tilde Friends API documentation.
* [App Globals](#App_Globals)
* [Database Interface](#Database)
* [Remote Procedure Calls](#tfrpc)
<a id="App_Globals"></a>
## <span style="color: #aaf">App Globals</span>
The following are functions and values exposed to all apps in their \`app.js\` or \`handler.js\`. Most
of these are asynchronous, returning a \`Promise\` that will be resolved when the call completes, unless
noted otherwise.
This is all a work in progess. These are liable to change without warning. Feedback is welcome.
The exposed functions in this API balance multiple competing needs:
* The surface area of the exposed API ought to be fairly minimal. If something can be implemented entirely app-side, that is
generally preferred over building it into the core.
* Everything is built on this API. Ideally the admin app, the SSB app, and the editor all use standard API exposed to all
apps, with appropriate permission guards in place making it so that only trusted apps do potentially destructive operations.
There will be some things here that aren't necessarily general use to support what's required.
If you are looking at the [Tilde Friends source code](https://www.tildefriends.net/~cory/releases/),
the vast majority of these are implemented in \`src/*.js.c\` files, and exposed to apps via \`core/core.js\`.
`;
docs['core.user.credentials.session.name'] = `
*String* The name of the authenticated user.
`;
docs['app.setDocument()'] = `
Set the contents of the client &lt;iframe/&gt;.
### Parameters
* *String* **html** The HTML contents.
`;
docs['core.apps()'] = `
Gets a list of apps owned by the current user.
### Returns
*Array* An array of string names of the apps owned by the current user.
`;
docs['core.url'] = `
The url by which the running app is being invoked.
`;
docs['app.localStorageSet()'] = `
Set a value in browser local storage.
### Parameters
*String* **key** The localStorage key to set.
*String* **value** The localStorage value to set.
`;
docs['app.localStorageGet()'] = `
Gets a value from browser local storage.
### Parameters
*String* **key** The key with which the value was set.
### Returns
*String* The value, or undefined.
`;
docs['app.print()'] = `
Log information for debugging purposes to the server and to the connected browser console.
### Parameters
* ... Any args to print.
`;
docs['ssb.createIdentity()'] = `
Create a new SSB identity.
### Returns
*String* The created identity public key.
`;
docs['ssb.getIdentities()'] = `
Get all SSB identities owned by the current user.
### Returns
*Array* An array of public key strings.
`;
docs['ssb.sqlAsync()'] = `
Run an SQL query against the sqlite database.
### Parameters
* *String* **query** The sqlite query.
* *Array* **args** The query arguments to bind.
* *Function* **callback** Callback called for each row result.
`;
docs['ssb.appendMessageWithIdentity()'] = `
Signs and stores a message in the SSB database.
### Parameters
* *String* **id** The public key of an SSB identity owned by the authenticated user.
* *Object* **message** The unsigned message.
`;
docs['ssb.storeMessage()'] = `
Verifies and stores a signed message in the SSB database.
### Parameters
* *Object* **message** The valid, signed message to store.
`;
docs['ssb.blobStore()'] = `
Store a blob in the SSB database.
### Parameters
* *String*/*Uint8Array* **blob** The blob contents to store
### Returns
*String* The stored blob ID.
`;
docs['ssb.blobGet()'] = `
Fetches a blob from the database.
### Parameters
* *String* **blob_id** The blob identifier to fetch (\`&....sha256\`).
### Returns
*ArrayBuffer* The blob data.
`;
docs['print()'] = `
Log debug information both to the server's console and to the visiting user's browser console when possible.
### Parameters
* **...** Whatever you want to log. Will be joined with spaces.
`;
docs['database()'] = `
Returns a database instance that is specific to the authenticated user and the given key.
### Parameters
* *String* **key** The database key.
### Returns
*Database* A database.
`;
docs['my_shared_database()'] = `
Returns a database instance that is specific to the authenticated user and the given key.
### Parameters
* *String* **package_name** The database package name.
* *String* **key** The database key.
### Returns
*Database* A database.
`;
docs['shared_database()'] = `
Returns a database instance that is shared between all users of the app, determined by its owner and app name.
### Parameters
* *String* **key** The database key.
### Returns
*Database* A database.
`;
docs['base64Decode()'] = `
Decode a base64 string to bytes.
Completes synchronously.
### Parameters
* *String* value The base64-encoded string.
### Returns
*Uint8Array* The decoded bytes.
`;
docs['base64Encode()'] = `
Encode bytes to a base64 string.
Completes synchronously.
### Parameters
* *Uint8Array* The bytes to encode.
### Returns
*String* The base64-encoded string.
`;
docs['utf8Decode()'] = `
Decode UTF-8 bytes to a string.
Completes synchronously.
### Parameters
* *Uint8Array* **value** The value to decode.
### Returns
*String* The value as a string.
`;
docs['utf8Encode()'] = `
Encodes a string to UTF-8 bytes.
Completes synchronously.
### Parameters
* *String* **value** The value to encode.
### Returns
*Uint8Array* The encoded \`value\`.
`;
docs['setTimeout()'] = `
Call a function after some delay.
### Parameters
* *Function* **callback** The function to call.
* *Number* **timeout** Number of milliseconds to wait before calling the callback function.
`;
docs['parseHttpRequest()'] = `
Parses an HTTP request.
### Parameters
* *Uint8Array* **request** The request data. Maybe be partial or contain extra data. The return value will
indicate when and where it is complete.
* *Number* **last_length** The length of the data passed on a previous attempt for the same request, or 0 initially.
### Returns
* *Integer* **-2** if the request is incomplete.
* *Integer* **-1** if the request could not be parsed.
* *Object* An object with **bytes_parsed**, **minor_version**, **path**, and **headers** fields on successful parse.
`;
docs['parseHttpResponse()'] = `
Parses an HTTP response.
### Parameters
* *Uint8Array* **response** The response data. Maybe be partial or contain extra data. The return value will
indicate when and where it is complete.
* *Number* **last_length** The length of the data passed on a previous attempt for the same response, or 0 initially.
### Returns
* *Integer* **-2** if the response is incomplete.
* *Integer* **-1** if the response could not be parsed.
* *Object* An object with **bytes_parsed**, **minor_version**, **status**, **message**, and **headers** fields on successful parse.
`;
docs['sha1Digest()'] = `
Calculates a SHA1 digest.
Completes synchronously.
### Parameters
* *String* **value** The value for which to calculate the digest.
### Returns
*String* The SHA1 digest of UTF-8 encoded \`value\`.
`;
docs['maskBytes()'] = `
Masks bytes for WebSocket communication.
Completes synchronously.
### Parameters
* *Uint8Array* **bytes** The byte array of data to mask.
* *Uint32* **mask** The mask to apply.
### Returns
*Uint32Array* The masked bytes.
`;
docs['exit()'] = `
Exits the app. But why would you want to do that?
Completes synchronously.
### Parameters
* *Integer* **exit_code** System exit code.
`;
docs['version()'] = `
Gets version information for the running server.
### Returns
*Object* Keys are things like \`name\` and \`number\` for the server itself and \`libuv\` and \`openssl\` for
dependencies. Values are *String* version numbers.
`;
docs['platform()'] = `
Gets the host operating system platform of the running server.
### Returns
*String* The platform, one of \`windows\`, \`android\`, \`linux\`, or \`other\`.
`;
docs['getFile()'] = `
Gets a file from the running app.
### Parameters
* *String* **name** Name of the file to retrieve.
### Returns
*Uint8Array* The contents of a file from the app with the given name, or *undefined*.
`;
docs.database = `
# <span style="color: #aaf">Database</span>
Local-only storage is provided by a \`Database\` type representing a key-value store.
`;
docs['database.get()'] = `
Gets a value from the database.
### Parameters
* *String* **key** The key.
### Returns
*String* The value from the database or undefined if not found.
`;
docs['database.getAll()'] = `
Gets all keys from the database.
### Returns
*Array* An array of *String* key names for all keys in the given database.
`;
docs['database.getLike()'] = `
Gets all keys and values from the database matching a pattern.
### Parameters
* *String* **pattern** An sqlite \`LIKE\` pattern to match keys against.
### Returns
*Object* An object whose keys are the database keys and values are the database values that match the given pattern.
`;
docs['database.set()'] = `
Sets a value in the database, creating a new entry or replacing an existing entry.
### Parameters
* *String* **key** The key.
* *String* **value** The value.
`;
docs['database.exchange()'] = `
Performs an atomic compare and exchange operation, setting a value in the database only if its current value matches what is expected.
### Parameters
* *String* **key** The key.
* *String* **expected** The expected value.
* *String* **value** The new value.
### Returns
*Boolean* true if the value is now the given value.
`;
docs['database.remove()'] = `
Removes an entry from the database if it exists.
### Parameters
* *String* **key** The key.
`;
docs.tfrpc = `
# <span style="color: #aaf" id="tfrpc">tfrpc</span>
\`tfrpc.js\` is a small helper script that is available to be used to facilitate communication between parts of an application.
\`tfrpc.js\` can be used to asynchronously make calls between the app code running in a sandboxed iframe in the browser
and the app process on the server.
From \`app.js\`:
\`\`\`
import * as tfrpc from '/tfrpc.js';
\`\`\`
From script running in the browser:
\`\`\`
import * as tfrpc from '/static/tfrpc.js';
\`\`\`
Either side can register or call functions, though they must be registered before they can be called. Arguments and return
values are ultimately serialized by means that attempt to preserve most JSON-serializable values as well as functions themselves.
`;
docs['tfrpc.register()'] = `
Register a function, allowing it to be called remotely.
### Parameters
* *Function* **function** The function to register. Its name will be how it will be called.
`;
docs['tfrpc.rpc.*()'] = `
Call a remote function.
### Parameters
* **...** Parameters to pass to the function.
### Returns
The return value of the called function.
`;

5
apps/apps.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "💻",
"previous": "&sFRTDn/RpxP1NJeECXHrXKwCRUJsEOEDVaCMPl50zpM=.sha256"
}

195
apps/apps/app.js Normal file
View File

@ -0,0 +1,195 @@
/**
* Fetches information about the applications
* @param apps Record<appName, blobId>
* @returns an object including the apps' name, emoji, and blobs ids
*/
async function fetch_info(apps) {
let result = {};
// For each app
for (let [key, value] of Object.entries(apps)) {
// Get it's blob and parse it
let blob = await ssb.blobGet(value);
blob = blob ? utf8Decode(blob) : '{}';
// Add it to the result object
result[key] = JSON.parse(blob);
}
return result;
}
async function fetch_shared_apps() {
let messages = {};
await ssb.sqlAsync(
`
SELECT messages.id, messages.previous, messages.author, messages.sequence, messages.timestamp, messages.hash, json(messages.content) AS content, messages.signature
FROM messages_fts('"application/tildefriends"')
JOIN messages ON messages.rowid = messages_fts.rowid
ORDER BY messages.timestamp
`,
[],
function (row) {
let content = JSON.parse(row.content);
for (let mention of content.mentions) {
if (mention?.type === 'application/tildefriends') {
messages[JSON.stringify([row.author, mention.name])] = {
message: row,
blob: mention.link,
name: mention.name,
};
}
}
}
);
let result = {};
for (let app of Object.values(messages).sort(
(x, y) => y.message.timestamp - x.message.timestamp
)) {
let app_object = JSON.parse(utf8Decode(await ssb.blobGet(app.blob)));
if (app_object) {
app_object.blob_id = app.blob;
result[app.name] = app_object;
}
}
return result;
}
async function main() {
const apps = await fetch_info(await core.apps());
const core_apps = await fetch_info(await core.apps('core'));
const shared_apps = await fetch_shared_apps();
const stylesheet = `
body {
color: whitesmoke;
margin: 8px;
}
.iconbox {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(96px, 1fr));
}
.iconbox::after {
content: "";
flex: auto;
}
.app {
height: 96px;
width: 64px;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
white-space: nowrap;
}
.app > a {
text-decoration: none;
max-width: 64px;
text-overflow: ellipsis ellipsis;
overflow: hidden;
color: whitesmoke;
}
`;
const body = `
<h1>Welcome to Tilde Friends</h1>
<div class="w3-card-4 w3-margin-top">
<header class="w3-container w3-light-blue">
<h2>Your Apps</h2>
</header>
<div id="apps" class="w3-indigo iconbox"></div>
</div>
<div class="w3-card-4 w3-margin-top">
<header class="w3-container w3-light-blue">
<h2>Shared Apps</h2>
</header>
<div id="shared_apps" class="w3-indigo iconbox"></div>
</div>
<div class="w3-card-4 w3-margin-top">
<header class="w3-container w3-light-blue">
<h2>Core Apps</h2>
</header>
<div id="core_apps" class="w3-indigo iconbox"></div>
</div>
`;
const script = `
/*
* Creates a list of apps
* @param id the id of the element to populate
* @param name (a username, 'core' or undefined)
* @param apps Object, a list of apps
*/
function populate_apps(id, name, apps) {
// Our target
var list = document.getElementById(id);
// For each app in the provided list
for (let app of Object.keys(apps).sort()) {
// Create the item
let inline = document.createElement('div');
inline.style.display = 'inline-block';
inline.classList.add('w3-button');
list.appendChild(inline);
let div = document.createElement('div');
inline.appendChild(div);
div.classList.add('app');
// The app's icon
let href = name ? '/~' + name + '/' + app + '/' : ('/' + apps[app].blob_id + '/');
let icon_a = document.createElement('a');
let icon = document.createElement('div');
icon.appendChild(document.createTextNode(apps[app].emoji || '📦'));
icon.style.fontSize = 'xxx-large';
icon_a.appendChild(icon);
icon_a.href = href;
icon_a.target = '_top';
div.appendChild(icon_a);
// The app's name
let a = document.createElement('a');
a.appendChild(document.createTextNode(app));
a.href = href;
a.target = '_top';
div.appendChild(a);
}
}
populate_apps('apps', '${core.user.credentials?.session?.name}', ${JSON.stringify(apps)});
populate_apps('core_apps', 'core', ${JSON.stringify(core_apps)});
populate_apps('shared_apps', undefined, ${JSON.stringify(shared_apps)});
`;
// Build the document
const document = `
<!DOCTYPE html>
<html>
<head>
<link type="text/css" rel="stylesheet" href="w3.css"></link>
<style>
${stylesheet}
</style>
</head>
<body class="w3-darkgray">
${body}
</body>
<script>
${script}
</script>
</html>`;
// Send it to the browser
app.setDocument(document);
}
main();

251
apps/apps/w3.css Normal file
View File

@ -0,0 +1,251 @@
/* W3.CSS 5.02 March 31 2025 by Jan Egil and Borge Refsnes */
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
a{background-color:transparent}a:active,a:hover{outline-width:0}
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
button,input{overflow:visible}button,select{text-transform:none}
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
[type=checkbox],[type=radio]{padding:0}
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
/* End extract */
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
hr{border:0;border-top:1px solid #eee;margin:20px 0}
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
.w3-main,#main{transition:margin-left .4s}
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
.w3-bar .w3-button{white-space:normal}
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
.w3-responsive{display:block;overflow-x:auto}
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
@media (max-width:1205px){.w3-auto{max-width:95%}}
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
.w3-display-position{position:absolute}
.w3-circle{border-radius:50%}
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
.w3-grid{display:grid}.w3-grid-padding{display:grid;gap:16px}.w3-flex{display:flex}
.w3-text-center{text-align:center}.w3-text-bold,.w3-bold{font-weight:bold}.w3-text-italic,.w3-italic{font-style:italic}
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
.w3-left{float:left!important}.w3-right{float:right!important}
.w3-button:hover{color:#000!important;background-color:#ccc!important}
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
.w3-hover-none:hover{box-shadow:none!important}
.w3-rtl{direction:rtl}.w3-ltr{direction:ltr}
/* Colors */
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
.w3-asphalt,.w3-hover-asphalt:hover{color:#fff!important;background-color:#343a40!important}
.w3-crimson,.w3-hover-crimson:hover{color:#fff!important;background-color:#a20025!important}
.w3-cobalt,w3-hover-cobalt:hover{color:#fff!important;background-color:#0050ef!important}
.w3-emerald,.w3-hover-emerald:hover{color:#fff!important;background-color:#008a00!important}
.w3-olive,.w3-hover-olive:hover{color:#fff!important;background-color:#6d8764!important}
.w3-paper,.w3-hover-paper:hover{color:#000!important;background-color:#f8f9fa!important}
.w3-sienna,.w3-hover-sienna:hover{color:#fff!important;background-color:#a0522d!important}
.w3-taupe,.w3-hover-taupe:hover{color:#fff!important;background-color:#87794e!important}
.w3-danger{color:#fff!important;background-color:#dd0000!important}
.w3-note{color:#000!important;background-color:#fff599!important}
.w3-info{color:#fff!important;background-color:#0a6fc2!important}
.w3-warning{color:#000!important;background-color:#ffb305!important}
.w3-success{color:#fff!important;background-color:#008a00!important}
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}

5
apps/blog.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "🪵",
"previous": "&3jabNEk6W2uolzTvfXX6fcWF50N3501vtgZ6ZxFVJ1s=.sha256"
}

8
apps/blog/app.js Normal file
View File

@ -0,0 +1,8 @@
import * as blog from './blog.js';
async function main() {
let blogs = await blog.get_posts();
await app.setDocument(blog.render_html(blogs));
}
main();

207
apps/blog/blog.js Normal file
View File

@ -0,0 +1,207 @@
import * as commonmark from './commonmark.min.js';
function escape(text) {
return (text ?? '')
.replaceAll('&', '&amp;')
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;');
}
function escapeAttribute(text) {
return (text ?? '')
.replaceAll('&', '&amp;')
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;')
.replaceAll('"', '&quot;')
.replaceAll("'", '&#39;');
}
export async function get_blog_message(id) {
let message;
await ssb.sqlAsync(
'SELECT author, timestamp, content FROM messages WHERE id = ?',
[id],
function (row) {
let content = JSON.parse(row.content);
message = {
author: row.author,
timestamp: row.timestamp,
blog: content?.blog,
title: content?.title,
};
}
);
if (message) {
await ssb.sqlAsync(
`
SELECT json_extract(content, '$.name') AS name
FROM messages
WHERE author = ?
AND json_extract(content, '$.type') = 'about'
AND json_extract(content, '$.about') = author
AND name IS NOT NULL
ORDER BY sequence DESC LIMIT 1
`,
[message.author],
function (row) {
message.name = row.name;
}
);
}
return message;
}
export function markdown(md) {
let reader = new commonmark.Parser();
let writer = new commonmark.HtmlRenderer({safe: true});
let parsed = reader.parse(md || '');
let walker = parsed.walker();
let event, node;
while ((event = walker.next())) {
node = event.node;
if (event.entering) {
if (node.destination?.startsWith('&')) {
node.destination =
'/' + node.destination + '/view?filename=' + node.firstChild?.literal;
} else if (
node.destination?.startsWith('@') ||
node.destination?.startsWith('%')
) {
node.destination = '/~core/ssb/#' + escape(node.destination);
}
}
}
return writer.render(parsed);
}
export async function render_blog_post_html(blog_post) {
let blob = utf8Decode(await ssb.blobGet(blog_post.blog));
return `<!DOCTYPE html>
<html>
<head>
<title>🪵Tilde Friends Blog - ${markdown(blog_post.title)}</title>
<base target="_top">
</head>
<body>
<h1><a href="./">🪵Tilde Friends Blog</a></h1>
<div>
<div><a href="../ssb/#${escapeAttribute(blog_post.author)}">${escape(blog_post.name)}</a> ${escape(new Date(blog_post.timestamp).toString())}</div>
<div>${markdown(blob)}</div>
</div>
</body>
</html>
`;
}
function render_blog_post(blog_post) {
return `
<div>
<h2><a href="/~${core.app.owner}/${core.app.name}/${escapeAttribute(blog_post.id)}">${escape(blog_post.title)}</a></h2>
<div><a href="../ssb/#${escapeAttribute(blog_post.author)}">${escape(blog_post.name)}</a> ${escape(new Date(blog_post.timestamp).toString())}</div>
<div>${markdown(blog_post.summary)}</div>
</div>
`;
}
export function render_html(blogs) {
return `<!DOCTYPE html>
<html>
<head>
<title>🪵Tilde Friends Blog</title>
<link href="./atom" type="application/atom+xml" rel="alternate" title="🪵Tilde Blog"/>
<style>
html {
background-color: #ccc;
}
</style>
<base target="_top">
</head>
<body>
<div style="display: flex; flex-direction: row; align-items: center; gap: 1em">
<h1>🪵Tilde Friends Blog</h1>
<div style="font-size: xx-small; vertical-align: middle"><a href="/~cory/blog/atom">atom feed</a></div>
</div>
${blogs.map((blog_post) => render_blog_post(blog_post)).join('\n')}
</body>
</html>`;
}
function render_blog_post_atom(blog_post) {
return `<entry>
<title>${escape(blog_post.title)}</title>
<link href="/~cory/ssb/#${blog_post.id}" />
<id>${blog_post.id}</id>
<published>${escape(new Date(blog_post.timestamp).toString())}</published>
<summary>${escape(blog_post.summary)}</summary>
<author>
<name>${escape(blog_post.name)}</name>
<feed>${escape(blog_post.author)}</feed>
</author>
</entry>`;
}
export function render_atom(blogs) {
return `<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title>🪵Tilde Blog</title>
<subtitle>A subtitle.</subtitle>
<link href="${core.url}/atom" rel="self"/>
<link href="${core.url}"/>
<id>${core.url}</id>
<updated>${new Date().toString()}</updated>
${blogs.map((blog_post) => render_blog_post_atom(blog_post)).join('\n')}
</feed>`;
}
export async function get_posts() {
let blogs = [];
let ids = await ssb.getIdentities();
await ssb.sqlAsync(
`
WITH
blogs AS (
SELECT
messages.author,
messages.id,
json_extract(messages.content, '$.title') AS title,
json_extract(messages.content, '$.summary') AS summary,
json_extract(messages.content, '$.blog') AS blog,
messages.timestamp
FROM messages_fts('blog')
JOIN messages ON messages.rowid = messages_fts.rowid
WHERE json_extract(messages.content, '$.type') = 'blog'),
public AS (
SELECT author FROM (
SELECT
messages.author,
RANK() OVER (PARTITION BY messages.author ORDER BY messages.sequence DESC) AS author_rank,
json_extract(messages.content, '$.publicWebHosting') AS is_public
FROM messages_fts('about')
JOIN messages ON messages.rowid = messages_fts.rowid
WHERE json_extract(messages.content, '$.type') = 'about' AND is_public IS NOT NULL)
WHERE author_rank = 1 AND is_public),
names AS (
SELECT author, name FROM (
SELECT
messages.author,
RANK() OVER (PARTITION BY messages.author ORDER BY messages.sequence DESC) AS author_rank,
json_extract(messages.content, '$.name') AS name
FROM messages_fts('about')
JOIN messages ON messages.rowid = messages_fts.rowid
WHERE json_extract(messages.content, '$.type') = 'about' AND
json_extract(messages.content, '$.about') = messages.author AND
name IS NOT NULL)
WHERE author_rank = 1)
SELECT blogs.*, names.name FROM blogs
JOIN json_each(?) AS self ON self.value = blogs.author
JOIN public ON public.author = blogs.author
LEFT OUTER JOIN names ON names.author = blogs.author
ORDER BY blogs.timestamp DESC LIMIT 20
`,
[JSON.stringify(ids)],
function (row) {
blogs.push(row);
}
);
return blogs;
}

1
apps/blog/commonmark.min.js vendored Normal file

File diff suppressed because one or more lines are too long

51
apps/blog/handler.js Normal file
View File

@ -0,0 +1,51 @@
import * as blog from './blog.js';
async function main() {
if (request.path.startsWith('%') && request.path.endsWith('.sha256')) {
let id = request.path.startsWith('%25')
? '%' + request.path.substring(3)
: request.path;
let message = await blog.get_blog_message(id);
if (message) {
respond({
data: await blog.render_blog_post_html(message),
content_type: 'text/html; charset=utf-8',
});
} else {
respond({
data: `Message ${id} not found.`,
content_type: 'text/html; charset=utf-8',
});
}
} else if (request.path == 'atom') {
let blogs = await blog.get_posts();
respond({
data: blog.render_atom(blogs),
content_type: 'application/atom+xml',
});
} else {
let blogs = await blog.get_posts();
for (let blog_post of blogs) {
let title = (blog_post.title || '').replaceAll(/\W/g, '_').toLowerCase();
if (request.path === title) {
respond({
data: await blog.render_blog_post_html(blog_post),
content_type: 'text/html; charset=utf-8',
});
return;
}
}
respond({
data: blog.render_html(blogs),
content_type: 'text/html; charset=utf-8',
});
}
}
main().catch(function (error) {
respond({
data: `<!DOCTYPE html>
<pre style="color: #f00">${error.message}\n${error.stack}</pre>`,
content_type: 'text/html',
});
});

120
apps/blog/lit-all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +0,0 @@
{"type":"tildefriends-app","files":{"app.js":"&WCq6ssQedT5denXPXlz2BswPD6hmt++EmWIMIDUMurA=.sha256","index.md":"&Lr7IXs8osbmWz6SDsGTQCiybbxkbWSK2MrUcXMzgqTs=.sha256","todo.md":"&XrOJ3D5YMTN+j+0hJgLLy7Y61B6Z14ebv+60ee+N37I=.sha256","structure.md":"&xRhQ4Mpom1Idskum07osbBQYcYWroH0sELQBkQHrOMg=.sha256","purpose.md":"&c0/YqFhXC0X3DqiEo55NqzI5wq0VTw6cVZTf/gAWS3w=.sha256","guide.md":"&SgnGL0+rjetY2o9A2+lVRbNvHIkqKwMnZr9gXWneIlc=.sha256"}}

File diff suppressed because one or more lines are too long

View File

@ -1,16 +0,0 @@
# Tilde Friends Developer's Guide
[Back to index](#index)
A Tilde Friends application runs on the server. To make an interesting
application that interacts with the client, it's necessary to understand
how the parts work together.
## Hello, world!
A simple starting point. Presents `Hello, world!` in the browser when
visited.
**app.js**:
```
app.setDocument('<h1>Hello, world!</h1>');
```

View File

@ -1,11 +0,0 @@
# Tilde Friends Documentation
Tilde Friends is a participating member of a greater social
network, [Secure Scuttlebutt](https://scuttlebutt.nz/),
augmenting it with a way to safely and securely write, share,
and run code.
- [Purpose](#purpose)
- [Structure](#structure)
- [Guide](#guide)
- [TODO](#todo)

File diff suppressed because one or more lines are too long

View File

@ -1,24 +0,0 @@
# Tilde Friends Purpose
[Back to index](#index)
## Beliefs
1. The web is the universal virtual machine.
- It is here, ready to be used from your desktop, laptop, smart phone,
tablet, game console, and smart TV.
- It is not ideal, but it is the best we have right now,
and all signs point to it continuing to improve, at least
in terms of features, security, and device support.
2. Distributed is superior to centralized.
- Distributed services don't need ads.
- Distributed services can't be acquired by evil corporations.
- Distributed services respect the user's privacy.
- Distributed services respect the user.
3. Offline-first is superior to online-only.
- The internet goes down sometimes. Applications should continue
to work.
3. Making and sharing code should be easy.
- Cloning your repository, installing dev tools, running a
docker image, or fighting with dependencies is *not* easy.
- If you see a thing in a web browser, you should be able to click
`edit`, make a change, save, and see the result.
[Wikipedia](https://www.wikipedia.org/) is easy.

View File

@ -1,67 +0,0 @@
# Tilde Friends Structure
[Back to index](#index)
Tilde Friends is a mostly-self-contained executable written in C.
In combines the following key components:
- A Secure Scuttlebutt (SSB) client/server. This talks with other SSB
instances, storing messages and blobs for anyone visible to local
users as they are encountered and sharing anything published locally
as appropriate.
- An sqlite database. This is where the SSB instance stores its data.
The general schema involves a `messages` table, storing mostly JSON,
a `blobs` table storing arbitrary blob data, and a `properties` table,
storing arbitrary state gleaned from `messages` and `blobs`, generally
updated on demand and incrementally.
- A QuickJS runtime. The core process runs stock scripts and has access
and permission to use all resources. All other processes, which
includes everything which runs untrusted code created by Tilde Friends
users, are strictly sandboxed in ways similar to how web browsers run
untrusted code. All attempts to access potentially sensitive resources
are mediated through the core process.
When run with no arguments, it starts a web server on
[http://localhost:12345/](http://localhost:12345/) and an SSB server.
## Web Interface
The Tilde Friends web server provides access to Tilde Friends applications,
which are arbitrary user-defined web applications.
At the top left, in addition to some basic navigation links, is an `edit`
link. Anyone can view, modify, and run in-place the code to any Tilde
Friends application by using the in-browser editor.
At the top right, one can `login` (to save work in their own space)
or `logout` (proceeding as a guest).
The rest of the page is an iframe belonging to the application.
## Special Paths
- `/~user/app/` - Tilde Friends application paths take the form `/~user/app/`, where `user`
is a username of a Tilde Friends account, and `app` is an arbitrary name
of an application saved by the given user.
- `/~user/app/file` - A raw file in an app.
- `/&blobid.ed25519` - A raw blob. Content-Type is inferred for at least
a few common image types.
## Communication Channels
Web Browser <-> Core <-> Sandbox
Visiting an application path delivers stock HTML and JavaScript which
establishes a WebSocket connection back to the server.
At this point, a new sandbox process is started in Tilde Friends, much
as a new sandboxed process might be started for a new tab in a web
browser. This process has a custom RPC connection to the core process
which holds the WebSocket connection to the browser.
The custom RPC communication between the sandbox process and the core
process facilitates calling functions asynchronously. Calling a remote
function (ie. a function in another process) returns a `Promise`. In
addition, any functions passed in either direction are serialized in
such a way that they can be called remotely.
An application will typically call `app.setDocument()` at startup to
populate the app's iframe in the web browser with its own client web
application resources.

View File

@ -1,48 +0,0 @@
# Tilde Friends TODO
[Back to index](#index)
## MVP
- release
- blog
- update COPYING
- update README
- auto-populate data on initial launch
- audit + document API exposed to apps
- ssb core
- good refresh
- disconnect all current connections and reset reconnect timers?
- reload the page
- live updates
- createHistoryStream for every account followed from local accounts
- apps
- app messages
- installable apps
- web interface
- live updates
- strip out unnecessary things?
- more raw views until it's more functional?
## Done
- likely classes of script errors
- tf core
- good error feedback
- markdeep demo
- send blobs
## Later
- DB migration
- stop using CDNs
- collect loads of stats
- faster save - parallel / don't save unmodified
- test likely denials of service
- package standalone executable
- ideas
- visualizations / analysis of gps data
- good web interface for managing connections
- identity
- multiple identities
- tie identities to TF login accounts
- tf account timeout why
- make some demo apps
- rock paper scissors, somehow
- don't resave files that didn't change

View File

@ -1 +0,0 @@
{"type":"tildefriends-app","files":{"app.js":"&6uFJG2C0kZar1Aj+7p2/KzYEBXgmK/uJSt7aIJqenN4=.sha256","index.html":"&TFtniuUIVO7XeWCgwmqPAmuBzpGX6slxJQcPMEr+860=.sha256","vue-material.js":"&K5cdLqXYCENPak/TCINHQhyJhpS4G9DlZHGwoh/LF2g=.sha256"}}

View File

@ -1,381 +0,0 @@
"use strict";
const k_posts_max = 20;
const k_votes_max = 100;
async function following(db, id) {
var o = await db.get(id + ":following");
const k_version = 4;
var f = o ? JSON.parse(o) : o;
if (!f || f.version != k_version) {
f = {users: [], sequence: 0, version: k_version};
}
f.users = new Set(f.users);
await ssb.sqlStream(
"SELECT "+
" sequence, "+
" json_extract(content, '$.contact') AS contact, "+
" json_extract(content, '$.following') AS following "+
"FROM messages "+
"WHERE "+
" author = ?1 AND "+
" sequence > ?2 AND "+
" json_extract(content, '$.type') = 'contact' "+
"UNION SELECT MAX(sequence) AS sequence, NULL, NULL FROM messages WHERE author = ?1 "+
"ORDER BY sequence",
[id, f.sequence],
async function(row) {
if (row.following) {
f.users.add(row.contact);
} else {
f.users.delete(row.contact);
}
f.sequence = row.sequence;
});
f.users = Array.from(f.users);
var j = JSON.stringify(f);
if (o != j) {
await db.set(id + ":following", j);
}
return f.users;
}
async function followingDeep(db, seed_ids, depth) {
if (depth <= 0) {
return seed_ids;
}
var f = await Promise.all(seed_ids.map(x => following(db, x)));
var ids = [].concat(...f);
var x = await followingDeep(db, [...new Set(ids)].sort(), depth - 1);
x = [].concat(...x, ...seed_ids);
return x;
}
async function followers(db, id) {
var o = await db.get(id + ":followers");
const k_version = 2;
var f = o ? JSON.parse(o) : o;
if (!f || f.version != k_version) {
f = {users: [], rowid: 0, version: k_version};
}
f.users = new Set(f.users);
await ssb.sqlStream(
"SELECT "+
" rowid, "+
" author AS contact, "+
" json_extract(content, '$.following') AS following "+
"FROM messages "+
"WHERE "+
" rowid > $1 AND "+
" json_extract(content, '$.type') = 'contact' AND "+
" json_extract(content, '$.contact') = $2 "+
"UNION SELECT MAX(rowid) as rowid, NULL, NULL FROM messages "+
"ORDER BY rowid",
[f.rowid, id],
async function(row) {
if (row.following) {
f.users.add(row.contact);
} else {
f.users.delete(row.contact);
}
f.rowid = row.rowid;
});
f.users = Array.from(f.users);
var j = JSON.stringify(f);
if (o != j) {
await db.set(id + ":followers", j);
}
return f.users;
}
async function sendUser(db, id) {
return Promise.all([
following(db, id).then(async function(following) {
return app.postMessage({following: {id: id, users: following}});
}),
followers(db, id).then(async function(followers) {
return app.postMessage({followers: {id: id, users: followers}});
}),
]);
}
async function pubsByUser(db, id) {
var o = await db.get(id + ":pubs");
const k_version = 2;
var f = o ? JSON.parse(o) : o;
if (!f || f.version != k_version) {
f = {pubs: [], sequence: 0, version: k_version};
}
f.pubs = Object.fromEntries(f.pubs.map(x => [JSON.stringify(x), x]));
await ssb.sqlStream(
"SELECT "+
" sequence, "+
" json_extract(content, '$.address.host') AS host, "+
" json_extract(content, '$.address.port') AS port, "+
" json_extract(content, '$.address.key') AS key "+
"FROM messages "+
"WHERE "+
" sequence > ?1 AND "+
" author = ?2 AND "+
" json_extract(content, '$.type') = 'pub' "+
"UNION SELECT MAX(sequence) as sequence, NULL, NULL, NULL FROM messages WHERE author = ?2 "+
"ORDER BY sequence",
[f.sequence, id],
async function(row) {
f.sequence = row.sequence;
if (row.host) {
row = {host: row.host, port: row.port, key: row.key};
f.pubs[JSON.stringify(row)] = row;
}
});
f.pubs = Object.values(f.pubs);
var j = JSON.stringify(f);
if (o != j) {
await db.set(id + ":pubs", j);
}
return f.pubs;
}
async function visiblePubs(db, id) {
var ids = [id].concat(await following(db, id));
var pubs = {};
for (var follow of ids) {
var followPubs = await pubsByUser(db, follow);
for (var pub of followPubs) {
pubs[JSON.stringify(pub)] = pub;
}
}
return Object.values(pubs);
}
async function getAbout(db, id) {
var o = await db.get(id + ":about");
const k_version = 4;
var f = o ? JSON.parse(o) : o;
if (!f || f.version != k_version) {
f = {about: {}, sequence: 0, version: k_version};
}
await ssb.sqlStream(
"SELECT "+
" sequence, "+
" content "+
"FROM messages "+
"WHERE "+
" sequence > ?1 AND "+
" author = ?2 AND "+
" json_extract(content, '$.type') = 'about' AND "+
" json_extract(content, '$.about') = author "+
"UNION SELECT MAX(sequence) as sequence, NULL FROM messages WHERE author = ?2 "+
"ORDER BY sequence",
[f.sequence, id],
async function(row) {
f.sequence = row.sequence;
if (row.content) {
var about = {};
try {
about = JSON.parse(row.content);
} catch {
}
delete about.about;
delete about.type;
f.about = Object.assign(f.about, about);
}
});
var j = JSON.stringify(f);
if (o != j) {
await db.set(id + ":about", j);
}
return f.about;
}
function fnv32a(value)
{
var result = 0x811c9dc5;
for (var i = 0; i < value.length; i++) {
result ^= value.charCodeAt(i);
result += (result << 1) + (result << 4) + (result << 7) + (result << 8) + (result << 24);
}
return result >>> 0;
}
async function getRecentPostIds(db, id, ids, limit) {
const k_version = 6;
var o = await db.get(id + ':recent_posts');
var recent = [];
var f = o ? JSON.parse(o) : o;
var ids_hash = fnv32a(JSON.stringify(ids));
if (!f || f.version != k_version || f.ids_hash != ids_hash) {
f = {recent: [], rowid: 0, version: k_version, ids_hash: ids_hash};
}
await ssb.sqlStream(
"SELECT "+
" rowid, "+
" id "+
"FROM messages "+
"WHERE "+
" rowid > ? AND "+
" author IN (" + ids.map(x => '?').join(", ") + ") AND "+
" json_extract(content, '$.type') = 'post' "+
"UNION SELECT MAX(rowid) as rowid, NULL FROM messages "+
"ORDER BY rowid DESC LIMIT ?",
[].concat([f.rowid], ids, [limit + 1]),
function(row) {
if (row.id) {
recent.push(row.id);
}
if (row.rowid) {
f.rowid = row.rowid;
}
});
f.recent = [].concat(recent, f.recent).slice(0, limit);
var j = JSON.stringify(f);
if (o != j) {
await db.set(id + ":recent_posts", j);
}
return f.recent;
}
async function getVotes(db, id) {
var o = await db.get(id + ":votes");
const k_version = 2;
var votes = [];
var f = o ? JSON.parse(o) : o;
if (!f || f.version != k_version) {
f = {votes: [], rowid: 0, version: k_version};
}
await ssb.sqlStream(
"SELECT "+
" rowid, "+
" author, "+
" id, "+
" sequence, "+
" timestamp, "+
" content "+
"FROM messages "+
"WHERE "+
" rowid > ? AND "+
" author = ? AND "+
" json_extract(content, '$.type') = 'vote' "+
"UNION SELECT MAX(rowid) as rowid, NULL, NULL AS id, NULL, NULL, NULL FROM messages "+
"ORDER BY rowid DESC LIMIT ?",
[f.rowid, id, k_votes_max],
async function(row) {
if (row.id) {
votes.push(row);
} else {
f.rowid = row.rowid;
}
});
f.votes = [].concat(votes.reverse(), f.votes).slice(0, k_votes_max);
var j = JSON.stringify(f);
if (o != j) {
await db.set(id + ":votes", j);
}
return f.votes;
}
async function getPosts(db, ids) {
var posts = [];
if (ids.length) {
await ssb.sqlStream(
"SELECT rowid, * FROM messages WHERE id IN (" + ids.map(x => "?").join(", ") + ")",
ids,
async function(row) {
try {
posts.push(row);
} catch {
}
});
}
return posts;
}
async function ready() {
return refresh();
}
core.register('onBroadcastsChanged', async function() {
await app.postMessage({broadcasts: await ssb.getBroadcasts()});
});
core.register('onConnectionsChanged', async function() {
var connections = await ssb.connections();
await app.postMessage({connections: connections});
});
async function refresh() {
await app.postMessage({clear: true});
var whoami = await ssb.whoami();
var db = await database("ssb");
await Promise.all([
app.postMessage({whoami: whoami}),
app.postMessage({pubs: await visiblePubs(db, whoami)}),
app.postMessage({broadcasts: await ssb.getBroadcasts()}),
app.postMessage({connections: await ssb.connections()}),
followingDeep(db, [whoami], 2).then(function(f) {
getRecentPostIds(db, whoami, [].concat([whoami], f), k_posts_max).then(async function(ids) {
return getPosts(db, ids);
}).then(async function(posts) {
var roots = posts.map(function(x) {
try {
return JSON.parse(x.content).root;
} catch {
return null;
}
});
roots = roots.filter(function(root) {
return root && posts.every(post => post.id != root);
});
return [].concat(posts, await getPosts(db, roots));
}).then(async function(posts) {
posts.forEach(async function(post) {
await app.postMessage({message: post});
});
});
f.forEach(async function(id) {
await Promise.all([
getVotes(db, id).then(async function(votes) {
return Promise.all(votes.map(vote => app.postMessage({vote: vote})));
}),
getAbout(db, id).then(async function(user) {
return app.postMessage({user: {user: id, about: user}});
}),
]);
});
}),
sendUser(db, whoami),
]);
}
core.register('message', async function(m) {
if (m.message == 'ready') {
await ready();
} else if (m.message) {
if (m.message.connect) {
await ssb.connect(m.message.connect);
} else if (m.message.post) {
await ssb.post(m.message.post);
} else if (m.message.appendMessage) {
await ssb.appendMessage(m.message.appendMessage);
} else if (m.message.user) {
await sendUser(await database("ssb"), m.message.user);
} else if (m.message.refresh) {
await refresh();
}
} else {
print(JSON.stringify(m));
}
});
async function main() {
if (core.user &&
core.user.credentials &&
core.user.credentials.permissions &&
core.user.credentials.permissions.administration) {
await app.setDocument(utf8Decode(await getFile("index.html")));
} else {
await app.setDocument('<div style="color: #f00">Only the administrator can use this app at this time. Login at the top right.</div>');
}
}
main();

View File

@ -1,281 +0,0 @@
<html>
<head>
<meta content="width=device-width,initial-scale=1,minimal-ui" name="viewport">
<link rel="stylesheet" href="//fonts.googleapis.com/css?family=Roboto:400,500,700,400italic|Material+Icons">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<link rel="stylesheet" href="https://unpkg.com/vue-material/dist/vue-material.min.css">
<link rel="stylesheet" href="https://unpkg.com/vue-material/dist/theme/default-dark.css">
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="vue-material.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/commonmark/0.29.1/commonmark.min.js"></script>
<script>
var g_data = {
whoami: null,
connections: [],
messages: [],
users: {},
broadcasts: [],
showUsers: false,
show_connect_dialog: false,
show_user_dialog: null,
connect: null,
pubs: [],
votes: [],
};
var g_data_initial = JSON.parse(JSON.stringify(g_data));
window.addEventListener('message', function(event) {
var key = Object.keys(event.data)[0];
if (key + 's' in g_data && Array.isArray(g_data[key + 's'])) {
g_data[key + 's'].push(event.data[key]);
} else if (key == 'user') {
Vue.set(g_data.users, event.data.user.user, Object.assign({}, g_data.users[event.data.user.user] || {}, event.data.user.about));
} else if (key == 'followers') {
if (!g_data.users[event.data.followers.id]) {
Vue.set(g_data.users, event.data.followers.id, {});
}
Vue.set(g_data.users[event.data.followers.id], 'followers', event.data.followers.users);
} else if (key == 'following') {
if (!g_data.users[event.data.following.id]) {
Vue.set(g_data.users, event.data.following.id, {});
}
Vue.set(g_data.users[event.data.following.id], 'following', event.data.following.users);
} else if (key == 'broadcasts') {
g_data.broadcasts = event.data.broadcasts;
} else if (key == 'pubs') {
g_data.pubs = event.data.pubs;
} else if (key == 'clear') {
Object.keys(g_data_initial).forEach(function(key) {
Vue.set(g_data, key, JSON.parse(JSON.stringify(g_data_initial[key])));
});
} else {
g_data[key] = event.data[key];
}
});
window.addEventListener('load', function() {
Vue.use(VueMaterial.default);
Vue.component('tf-user', {
data: function() { return {users: g_data.users, show_user_dialog: false, show_follow_dialog: false} },
props: ['id'],
mounted: function() {
window.parent.postMessage({user: this.id}, '*');
},
computed: {
following: {
get: function() {
return g_data.users[g_data.whoami] &&
g_data.users[g_data.whoami].following &&
g_data.users[g_data.whoami].following.indexOf(this.id) != -1;
},
set: function(newValue) {
if (g_data.users[g_data.whoami] &&
g_data.users[g_data.whoami].following) {
if (newValue && g_data.users[g_data.whoami].following.indexOf(this.id) == -1) {
window.parent.postMessage({appendMessage: {type: "contact", following: true, contact: this.id}}, '*');
} else if (!newValue) {
window.parent.postMessage({appendMessage: {type: "contact", following: false, contact: this.id}}, '*');
}
}
},
},
},
template: `<span @click="show_user_dialog = true">
{{users[id] && users[id].name ? users[id].name : id}}
<md-tooltip v-if="users[id] && users[id].name">{{id}}</md-tooltip>
<md-dialog :md-active.sync="show_user_dialog">
<md-dialog-title>{{users[id] && users[id].name ? users[id].name : id}}</md-dialog-title>
<md-dialog-content v-if="users[id]">
<div v-if="users[id].image"><img :src="'/' + users[id].image + '/view'"></div>
<div v-if="users[id].name">{{id}}</div>
<div>{{users[id].description}}</div>
<div><md-switch v-model="following">Following</md-switch></div>
<md-list>
<md-subheader>Followers</md-subheader>
<md-list-item v-for="follower in (users[id] || []).followers" v-bind:key="'follower-' + follower">
<tf-user :id="follower"></tf-user>
</md-list-item>
<md-subheader>Following</md-subheader>
<md-list-item v-for="user in (users[id] || []).following" v-bind:key="'following-' + user">
<tf-user :id="user"></tf-user>
</md-list-item>
</md-list>
</md-dialog-content>
<md-dialog-actions>
<md-button @click="show_user_dialog = false">Close</md-button>
</md-dialog-actions>
</md-dialog>
</span>`,
});
Vue.component('tf-message', {
props: ['message', 'messages'],
data: function() { return { showRaw: false } },
computed: {
content_json: function() {
try {
return JSON.parse(this.message.content);
} catch {
return undefined;
}
},
sub_messages: function() {
var id = this.message.id;
return this.messages.filter(function (x) {
try {
return JSON.parse(x.content).root == id;
} catch {}
});
},
votes: function() {
return [];
var id = this.message.id;
return this.votes.filter(function (x) {
try {
var j = JSON.parse(x.content);
return j.type == 'vote' && j.vote.link == id;
} catch {}
}).reduce(function (accum, value) {
var expression = JSON.parse(value.content).vote.expression;
if (!accum[expression]) {
accum[expression] = [];
}
accum[expression].push(value);
return accum;
}, {});
}
},
methods: {
markdown: function(md) {
var reader = new commonmark.Parser({safe: true});
var writer = new commonmark.HtmlRenderer();
return writer.render(reader.parse(md));
},
json: function(message) {
try {
return JSON.parse(message.content);
} catch {
return undefined;
}
},
},
template: `<md-app class="md-elevation-8" style="margin: 1em" v-if="!content_json || ['pub', 'vote'].indexOf(content_json.type) == -1">
<md-app-toolbar>
<h3>
<tf-user :id="message.author"></tf-user>
</h3>
<div style="font-size: x-small">{{new Date(message.timestamp)}}</div>
<div class="md-toolbar-section-end">
<md-menu>
<md-button md-menu-trigger class="md-icon-button"><md-icon>more_vert</md-icon></md-button>
<md-menu-content>
<md-menu-item v-if="!showRaw" v-on:click="showRaw = true">View Raw</md-menu-item>
<md-menu-item v-else v-on:click="showRaw = false">View Message</md-menu-item>
</md-menu-content>
</md-menu>
</div>
</md-app-toolbar>
<md-app-content>
<div v-if="showRaw">{{message.content}}</div>
<div v-else>
<div v-if="content_json && content_json.type == 'post'">
<div v-html="this.markdown(content_json.text)"></div>
<img v-for="mention in content_json.mentions" v-if="mention.link && typeof(mention.link) == 'string' && mention.link.startsWith('&')" :src="'/' + mention.link + '/view'"></img>
</div>
<div v-else-if="content_json && content_json.type == 'contact'"><tf-user :id="message.author"></tf-user> {{content_json.following ? '==&gt;' : '=/=&gt;'}} <tf-user :id="content_json.contact"></tf-user></div>
<div v-else>{{message.content}}</div>
</div>
<tf-message v-for="sub_message in sub_messages" v-bind:message="sub_message" v-bind:messages="messages" v-bind:key="sub_message.id"></tf-message>
<md-chip v-for="vote in Object.keys(votes)" v-bind:key="vote">
{{vote + (votes[vote].length > 1 ? ' (' + votes[vote].length + ')' : '')}}
</md-chip>
</md-app-content>
</md-app>`,
});
function markdown(d) { return d; }
Vue.config.performance = true;
var vue = new Vue({
el: '#app',
data: g_data,
methods: {
post_message: function() {
window.parent.postMessage({post: document.getElementById('post_text').value}, '*');
},
ssb_connect: function(connection) {
window.parent.postMessage({connect: connection}, '*');
},
content_json: function(message) {
try {
return JSON.parse(message.content);
} catch {
return undefined;
}
},
refresh: function() {
window.parent.postMessage({refresh: true}, '*');
},
}
});
});
window.parent.postMessage('ready', '*');
</script>
</head>
<body style="color: #fff">
<div id="app">
<md-dialog :md-active.sync="show_connect_dialog">
<md-dialog-title>Connect</md-dialog-title>
<md-dialog-content>
<md-field>
<label>net:127.0.0.1:8008~shs:id</label>
<md-input v-model="connect"></md-input>
</md-field>
</md-dialog-content>
<md-dialog-actions>
<md-button class="md-primary" @click="ssb_connect(connect); connect = null; show_connect_dialog = false">Connect</md-button>
<md-button @click="connect = null; show_connect_dialog = false">Cancel</md-button>
</md-dialog-actions>
</md-dialog>
<md-app style="position: absolute; height: 100%; width: 100%">
<md-app-toolbar class="md-primary">
<md-button class="md-icon-button" @click="showUsers = !showUsers">
<md-icon>menu</md-icon>
</md-button>
<span class="md-title">Tilde Friends Secure Scuttlebutt Test</span>
</md-app-toolbar>
<md-app-drawer :md-active.sync="showUsers" md-persistent="full">
<md-list>
<md-subheader>Followers</md-subheader>
<md-list-item v-for="follower in (users[whoami] || []).followers" v-bind:key="'follower-' + follower"><tf-user :id="follower"></tf-user></md-list-item>
<md-subheader>Following</md-subheader>
<md-list-item v-for="user in (users[whoami] || []).following" v-bind:key="'following-' + user"><tf-user :id="user"></tf-user></md-list-item>
<md-subheader>Network</md-subheader>
<md-list-item v-for="broadcast in broadcasts" v-bind:key="JSON.stringify(broadcast)" @click="ssb_connect(broadcast)">{{broadcast.address}}:{{broadcast.port}} <tf-user :id="broadcast.pubkey"></tf-user></md-list-item>
<md-subheader>Pubs</md-subheader>
<md-list-item v-for="pub in pubs" v-bind:key="JSON.stringify(pub)" @click="ssb_connect({address: pub.host, port: pub.port, pubkey: pub.key})">{{pub.host}}:{{pub.port}} <tf-user :id="pub.key"></tf-user></md-list-item>
<md-subheader>Connections</md-subheader>
<md-list-item v-for="connection in connections" v-bind:key="'connection-' + JSON.stringify(connection)"><tf-user :id="connection"></tf-user></md-list-item>
<md-list-item @click="show_connect_dialog = true">Connect</md-list-item>
</md-list>
</md-app-drawer>
<md-app-content>
<md-button @click="refresh()" class="md-icon-button md-dense md-raised md-primary">
<md-icon>cached</md-icon>
</md-button>
Welcome, <tf-user :id="whoami"></tf-user>.
<md-card class="md-elevation-8">
<md-card-header>
<div class="md-title">What's up?</div>
</md-card-header>
<md-card-content>
<md-field>
<label>Post a message</label>
<md-textarea id="post_text"></md-textarea>
</md-field>
</md-card-content>
<md-card-actions>
<md-button class="md-raised md-primary" v-on:click="post_message()">Submit Post</md-button>
</md-card-actions>
</md-card>
<tf-message v-for="message in messages" v-if="!content_json(message).root" v-bind:message="message" v-bind:messages="messages" v-bind:key="message.id"></tf-message>
</md-app-content>
</md-app>
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

5
apps/db.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "💽",
"previous": "&uQzkIe/Aj8yNhLKe3hEq+5fEJsGwIUx8NVBjJKwoV2U=.sha256"
}

83
apps/db/app.js Normal file
View File

@ -0,0 +1,83 @@
async function database_list() {
var dbs = await databases();
var doc = `<!DOCTYPE html>
<html>
<body style="background: #888">
<h1>Databases</h1>
<ul id="dbs"></ul>
</body>
<script>
function populate_dbs(id, dbs) {
var list = document.getElementById(id);
for (let db of dbs) {
var li = list.appendChild(document.createElement('li'));
var a = document.createElement('a');
a.innerText = db;
a.href = './#' + db;
a.target = '_top';
li.appendChild(a);
}
}
populate_dbs('dbs', ${JSON.stringify(dbs)});
</script>
</html>`;
app.setDocument(doc);
}
async function key_list(db) {
let keys = await db.getAll();
let object = {};
for (let key of keys) {
object[key] = await db.get(key);
}
let doc = `<!DOCTYPE html>
<html>
<body style="background: #888">
<a href="#" target="_top">back</a>
<h1>Keys</h1>
<ul id="keys"></ul>
</body>
<script>
function populate_dbs(id, keys) {
var list = document.getElementById(id);
for (let [key, value] of Object.entries(keys)) {
var li = list.appendChild(document.createElement('li'));
li.innerText = key + ' = ' + value;
}
}
populate_dbs('keys', ${JSON.stringify(object)});
</script>
</html>`;
app.setDocument(doc);
}
function load() {
if (core.user?.credentials?.session) {
database_list();
} else {
app.setDocument(`<!DOCTYPE html>
<html>
<body style="background: #888">
<h1>Must be signed in to examine databases.</h1>
</body>
</html>`);
}
}
core.register('message', async function (message) {
if (message.event == 'hashChange') {
let hash = message.hash.substring(1);
if (hash.startsWith(':shared:')) {
let parts = hash.split(':');
let packageName = parts[3];
let key = parts.slice(4).join(':');
key_list(await my_shared_database(packageName, key));
} else if (hash.length) {
key_list(await database(hash.split(':').slice(1).join(':')));
} else {
load();
}
}
});
load();

5
apps/follow.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "➡️",
"previous": "&YDDSzbRD8NFAykYlZnk4r4hAK5qXjT5LmKE6rhS1s+A=.sha256"
}

273
apps/follow/app.js Normal file
View File

@ -0,0 +1,273 @@
let g_about_cache = {};
async function query(sql, args) {
let result = [];
await ssb.sqlAsync(sql, args, function (row) {
result.push(row);
});
return result;
}
async function contacts_internal(id, last_row_id, following, max_row_id) {
let result = Object.assign({}, following[id] || {});
result.following = result.following || {};
result.blocking = result.blocking || {};
let contacts = await query(
`
SELECT json(content) AS content FROM messages
WHERE author = ? AND
rowid > ? AND
rowid <= ? AND
json_extract(content, '$.type') = 'contact'
ORDER BY sequence
`,
[id, last_row_id, max_row_id]
);
for (let row of contacts) {
let contact = JSON.parse(row.content);
if (contact.following === true) {
result.following[contact.contact] = true;
} else if (contact.following === false) {
delete result.following[contact.contact];
} else if (contact.blocking === true) {
result.blocking[contact.contact] = true;
} else if (contact.blocking === false) {
delete result.blocking[contact.contact];
}
}
following[id] = result;
return result;
}
async function contact(id, last_row_id, following, max_row_id) {
return await contacts_internal(id, last_row_id, following, max_row_id);
}
async function following_deep_internal(
ids,
depth,
blocking,
last_row_id,
following,
max_row_id
) {
let contacts = await Promise.all(
[...new Set(ids)].map((x) => contact(x, last_row_id, following, max_row_id))
);
let result = {};
for (let i = 0; i < ids.length; i++) {
let id = ids[i];
let contact = contacts[i];
let all_blocking = Object.assign({}, contact.blocking, blocking);
let found = Object.keys(contact.following).filter((y) => !all_blocking[y]);
let deeper =
depth > 1
? await following_deep_internal(
found,
depth - 1,
all_blocking,
last_row_id,
following,
max_row_id
)
: [];
result[id] = [id, ...found, ...deeper];
}
return [...new Set(Object.values(result).flat())];
}
async function following_deep(ids, depth, blocking) {
let db = await database('cache');
const k_cache_version = 5;
let cache = await db.get('following');
cache = cache ? JSON.parse(cache) : {};
if (cache.version !== k_cache_version) {
cache = {
version: k_cache_version,
following: {},
last_row_id: 0,
};
}
let max_row_id = (
await query(
`
SELECT MAX(rowid) AS max_row_id FROM messages
`,
[]
)
)[0].max_row_id;
let result = await following_deep_internal(
ids,
depth,
blocking,
cache.last_row_id,
cache.following,
max_row_id
);
cache.last_row_id = max_row_id;
let store = JSON.stringify(cache);
await db.set('following', store);
return result;
}
async function fetch_about(db, ids, users) {
const k_cache_version = 1;
let cache = await db.get('about');
cache = cache ? JSON.parse(cache) : {};
if (cache.version !== k_cache_version) {
cache = {
version: k_cache_version,
about: {},
last_row_id: 0,
};
}
let max_row_id = 0;
await ssb.sqlAsync(
`
SELECT MAX(rowid) AS max_row_id FROM messages
`,
[],
function (row) {
max_row_id = row.max_row_id;
}
);
for (let id of Object.keys(cache.about)) {
if (ids.indexOf(id) == -1) {
delete cache.about[id];
}
}
let abouts = [];
await ssb.sqlAsync(
`
SELECT
messages.*
FROM
messages,
json_each(?1) AS following
WHERE
messages.author = following.value AND
messages.rowid > ?3 AND
messages.rowid <= ?4 AND
json_extract(messages.content, '$.type') = 'about'
UNION
SELECT
messages.*
FROM
messages,
json_each(?2) AS following
WHERE
messages.author = following.value AND
messages.rowid <= ?4 AND
json_extract(messages.content, '$.type') = 'about'
ORDER BY messages.author, messages.sequence
`,
[
JSON.stringify(ids.filter((id) => cache.about[id])),
JSON.stringify(ids.filter((id) => !cache.about[id])),
cache.last_row_id,
max_row_id,
]
);
for (let about of abouts) {
let content = JSON.parse(about.content);
if (content.about === about.author) {
delete content.type;
delete content.about;
cache.about[about.author] = Object.assign(
cache.about[about.author] || {},
content
);
}
}
cache.last_row_id = max_row_id;
await db.set('about', JSON.stringify(cache));
users = users || {};
for (let id of Object.keys(cache.about)) {
users[id] = Object.assign(users[id] || {}, cache.about[id]);
}
return Object.assign({}, users);
}
async function getSize(db, id) {
let size = 0;
await ssb.sqlAsync(
'SELECT (LENGTH(author) * COUNT(*) + SUM(LENGTH(content)) + SUM(LENGTH(id))) AS size FROM messages WHERE author = ?1',
[id],
function (row) {
size += row.size;
}
);
return size;
}
async function getSizes(ids) {
let sizes = {};
await ssb.sqlAsync(
`
SELECT
author,
(SUM(LENGTH(content)) + SUM(LENGTH(author)) + SUM(LENGTH(messages.id))) AS size
FROM messages
JOIN json_each(?) AS ids ON author = ids.value
GROUP BY author
`,
[JSON.stringify(ids)],
function (row) {
sizes[row.author] = row.size;
}
);
return sizes;
}
function niceSize(bytes) {
let value = bytes;
let unit = 'B';
const k_units = ['kB', 'MB', 'GB', 'TB'];
for (let u of k_units) {
if (value >= 1024) {
value /= 1024;
unit = u;
} else {
break;
}
}
return Math.round(value * 10) / 10 + ' ' + unit;
}
function escape(value) {
return value
.replaceAll('&', '&amp;')
.replaceAll('<', '&lt;')
.replaceAll('>', '&gt;');
}
async function main() {
await app.setDocument('<pre style="color: #fff">building...</pre>');
let db = await database('ssb');
let whoami = await ssb.getIdentities();
let tree = '';
await app.setDocument(
`<pre style="color: #fff">Enumerating followed users...</pre>`
);
let following = await following_deep(whoami, 2, {});
await app.setDocument(
`<pre style="color: #fff">Getting names and sizes...</pre>`
);
let [about, sizes] = await Promise.all([
fetch_about(db, following, {}),
getSizes(following),
]);
await app.setDocument(`<pre style="color: #fff">Finishing...</pre>`);
following.sort((a, b) => (sizes[b] ?? 0) - (sizes[a] ?? 0));
for (let id of following) {
tree += `<li><a href="/~core/ssb/#${id}">${escape(about[id]?.name ?? id)}</a> ${niceSize(sizes[id] ?? 0)}</li>\n`;
}
await app.setDocument(
'<!DOCTYPE html>\n<html>\n<body style="color: #fff"><h1>Following</h1>\n<ul>' +
tree +
'</ul>\n</body>\n</html>'
);
}
main();

5
apps/identity.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "🪪",
"previous": "&5kw/2PgcySwOYCmAkjHTR2xTkIx3i7UjQmtQ8MfgWw8=.sha256"
}

153
apps/identity/app.js Normal file
View File

@ -0,0 +1,153 @@
import * as tfrpc from '/tfrpc.js';
const is_admin = core.user?.credentials?.permissions?.administration;
tfrpc.register(async function get_private_key(id) {
return bip39Words(await ssb.getPrivateKey(id));
});
tfrpc.register(async function create_id(id) {
return await ssb.createIdentity();
});
tfrpc.register(async function add_id(id) {
return await ssb.addIdentity(bip39Bytes(id));
});
tfrpc.register(async function delete_id(id) {
return await ssb.deleteIdentity(id);
});
tfrpc.register(async function reload() {
await main();
});
tfrpc.register(async function make_server(id) {
return await ssb.swapWithServerIdentity(id);
});
async function main() {
let ids = await ssb.getIdentities();
let server_id = await ssb.getServerIdentity();
await app.setDocument(
`
<head>
<link rel="stylesheet" href="w3.css"></link>
<style>
/* "2018 Sargasso Sea" */
.w3-theme-l5 {color:#000 !important; background-color:#f3f4f7 !important}
.w3-theme-l4 {color:#000 !important; background-color:#d7dbe3 !important}
.w3-theme-l3 {color:#000 !important; background-color:#b0b6c8 !important}
.w3-theme-l2 {color:#fff !important; background-color:#8892ac !important}
.w3-theme-l1 {color:#fff !important; background-color:#636f8e !important}
.w3-theme-d1 {color:#fff !important; background-color:#40485c !important}
.w3-theme-d2 {color:#fff !important; background-color:#394052 !important}
.w3-theme-d3 {color:#fff !important; background-color:#323848 !important}
.w3-theme-d4 {color:#fff !important; background-color:#2b303d !important}
.w3-theme-d5 {color:#fff !important; background-color:#242833 !important}
.w3-theme-light {color:#000 !important; background-color:#f3f4f7 !important}
.w3-theme-dark {color:#fff !important; background-color:#242833 !important}
.w3-theme-action {color:#fff !important; background-color:#242833 !important}
.w3-theme {color:#fff !important; background-color:#485167 !important}
.w3-text-theme {color:#485167 !important}
.w3-border-theme {border-color:#485167 !important}
.w3-hover-theme:hover {color:#fff !important; background-color:#485167 !important}
.w3-hover-text-theme:hover {color:#485167 !important}
.w3-hover-border-theme:hover {border-color:#485167 !important}
</style>
</head>
<body class="w3-theme-l3">
<script>const handler = {};</script>
<script type="module">
import * as tfrpc from '/static/tfrpc.js';
handler.export_id = async function export_id(event) {
let id = event.srcElement.dataset.id;
let element = document.createElement('textarea');
element.value = await tfrpc.rpc.get_private_key(id);
element.style = 'width: 100%; height: auto; read-only: true; resize: none';
element.classList.add('w3-input');
element.readOnly = true;
event.srcElement.parentElement.appendChild(element);
event.srcElement.onclick = event => handler.hide_id(event, element);
}
handler.add_id = async function add_id(event) {
let id = document.getElementById('add_id').value;
try {
let new_id = await tfrpc.rpc.add_id(id);
alert('Successfully imported: ' + new_id);
await tfrpc.rpc.reload();
} catch (e) {
alert('Error importing identity: ' + e);
}
}
handler.create_id = async function create_id(event) {
try {
let id = await tfrpc.rpc.create_id();
alert('Successfully created: ' + id);
await tfrpc.rpc.reload();
} catch (e) {
alert('Error creating identity: ' + e.message);
}
}
handler.hide_id = function hide_id(event, element) {
element.parentNode.removeChild(element);
event.srcElement.onclick = handler.export_id;
}
handler.delete_id = async function delete_id(event) {
let id = event.srcElement.dataset.id;
try {
if (prompt('Are you sure you want to delete "' + id + '"? It cannot be recovered without the exported phrase.\\n\\nEnter the word "DELETE" to confirm you wish to delete it.') === 'DELETE') {
if (await tfrpc.rpc.delete_id(id)) {
alert('Successfully deleted ID: ' + id);
}
await tfrpc.rpc.reload();
}
} catch (e) {
alert('Error deleting ID: ' + e);
}
}
handler.make_server = async function make_server(event) {
let id = event.srcElement.dataset.id;
try {
if (confirm('Are you sure you want to make "' + id + '" the server identity?\\n\\nFor it to take effect, you will need to both sign in again and restart Tilde Friends.')) {
await tfrpc.rpc.make_server(id);
}
} catch (e) {
alert('Error making server ID: ' + e);
}
}
</script>
<header class="w3-theme w3-padding"><h1>SSB Identity Management</h1></header>
<div class="w3-card-4 w3-margin">
<header class="w3-container w3-theme-l2"><h2>Create a new identity</h2></header>
<footer class="w3-padding">
<button id="create_id" onclick="handler.create_id()" class="w3-button w3-theme">Create Identity</button>
</footer>
</div>
<div class="w3-card-4 w3-margin">
<header class="w3-container w3-theme-l2"><h2>Import an SSB Identity from 12 BIP39 English Words</h2></header>
<textarea id="add_id" style="width: 100%" rows="4" class="w3-input"></textarea>
<footer class="w3-padding">
<button id="add" onclick="handler.add_id(event)" class="w3-button w3-theme">Import Identity</button>
</footer>
</div>
<div class="w3-card-4 w3-margin">
<header class="w3-container w3-theme-l2"><h2>Identities</h2></header>
<ul class="w3-ul">` +
(ids ?? [])
.map(
(
id
) => `<li style="overflow: hidden; text-wrap: nowrap; text-overflow: ellipsis">
<button onclick="handler.export_id(event)" data-id="${id}" class="w3-button w3-theme">Export Identity</button>
<button onclick="handler.delete_id(event)" data-id="${id}" class="w3-button w3-theme">Delete Identity</button>
${is_admin && id != server_id ? `<button onclick="handler.make_server(event)" data-id="${id}" class="w3-button w3-theme">Make Server Identity</button>` : ''}
${id}${id == server_id ? ' <div class="w3-tag w3-theme-l4 w3-round">🖥 local server</div>' : ''}
</li>`
)
.join('\n') +
` </ul>
</div>
</body>`
);
}
main();

251
apps/identity/w3.css Normal file
View File

@ -0,0 +1,251 @@
/* W3.CSS 5.02 March 31 2025 by Jan Egil and Borge Refsnes */
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
a{background-color:transparent}a:active,a:hover{outline-width:0}
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
button,input{overflow:visible}button,select{text-transform:none}
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
[type=checkbox],[type=radio]{padding:0}
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
/* End extract */
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
hr{border:0;border-top:1px solid #eee;margin:20px 0}
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
.w3-main,#main{transition:margin-left .4s}
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
.w3-bar .w3-button{white-space:normal}
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
.w3-responsive{display:block;overflow-x:auto}
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
@media (max-width:1205px){.w3-auto{max-width:95%}}
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
.w3-display-position{position:absolute}
.w3-circle{border-radius:50%}
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
.w3-grid{display:grid}.w3-grid-padding{display:grid;gap:16px}.w3-flex{display:flex}
.w3-text-center{text-align:center}.w3-text-bold,.w3-bold{font-weight:bold}.w3-text-italic,.w3-italic{font-style:italic}
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
.w3-left{float:left!important}.w3-right{float:right!important}
.w3-button:hover{color:#000!important;background-color:#ccc!important}
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
.w3-hover-none:hover{box-shadow:none!important}
.w3-rtl{direction:rtl}.w3-ltr{direction:ltr}
/* Colors */
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
.w3-asphalt,.w3-hover-asphalt:hover{color:#fff!important;background-color:#343a40!important}
.w3-crimson,.w3-hover-crimson:hover{color:#fff!important;background-color:#a20025!important}
.w3-cobalt,w3-hover-cobalt:hover{color:#fff!important;background-color:#0050ef!important}
.w3-emerald,.w3-hover-emerald:hover{color:#fff!important;background-color:#008a00!important}
.w3-olive,.w3-hover-olive:hover{color:#fff!important;background-color:#6d8764!important}
.w3-paper,.w3-hover-paper:hover{color:#000!important;background-color:#f8f9fa!important}
.w3-sienna,.w3-hover-sienna:hover{color:#fff!important;background-color:#a0522d!important}
.w3-taupe,.w3-hover-taupe:hover{color:#fff!important;background-color:#87794e!important}
.w3-danger{color:#fff!important;background-color:#dd0000!important}
.w3-note{color:#000!important;background-color:#fff599!important}
.w3-info{color:#fff!important;background-color:#0a6fc2!important}
.w3-warning{color:#000!important;background-color:#ffb305!important}
.w3-success{color:#fff!important;background-color:#008a00!important}
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}

5
apps/intro.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "💡",
"previous": "&ckE7T/dt9f1xV8jNSgXVcXYkAzMhU9689MRQbhOi9Wo=.sha256"
}

13
apps/intro/app.js Normal file
View File

@ -0,0 +1,13 @@
import * as tfrpc from '/tfrpc.js';
async function main() {
await app.setDocument(utf8Decode(getFile('index.html')));
}
tfrpc.register(async function complete() {
if ((await core.globalSettingsGet('index')) == '/~core/intro/') {
return await core.globalSettingsSet('index', '/~core/ssb/');
}
});
main();

286
apps/intro/index.html Normal file
View File

@ -0,0 +1,286 @@
<!doctype html>
<html style="height: 100%; margin: 0; padding: 0; box-sizing: border-box">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1" />
<link rel="stylesheet" type="text/css" href="w3.css" />
<style>
.slide {
display: none;
margin-left: auto;
margin-right: auto;
}
.dot {
width: 1em;
height: 1em;
cursor: pointer;
}
.w3-left,
.w3-right {
cursor: pointer;
}
</style>
</head>
<body
style="
width: 100%;
height: 100%;
max-width: 100%;
max-height: 100%;
margin: 0;
padding: 0;
flex-direction: column;
align-items: center;
"
class="w3-flex w3-dark-gray w3-center"
>
<div
style="
flex: 1 1 auto;
overflow: auto;
contain: content;
padding-top: 16px;
padding-bottom: 16px;
"
>
<div class="slide">
<div
class="w3-content w3-xlarge w3-card-4 w3-blue w3-panel w3-padding-32 w3-round-xlarge"
style="margin: 32px"
>
<div>
<div>Welcome to</div>
<div>~😎 Tilde Friends.</div>
</div>
<footer>
<button class="w3-button w3-yellow proceed">Next</button>
</footer>
</div>
</div>
<div class="slide w3-card-4 w3-gray" style="width: 90%">
<header class="w3-container w3-blue w3-xlarge">
<h1>This brief tutorial will introduce:</h1>
</header>
<ul class="w3-large w3-left-align">
<li><b>Secure Scuttlebutt</b>, a decentralized social network.</li>
<li>
<b>Tilde Friends</b>, the application platform that you are using
right now.
</li>
<li>
<b>How to get started</b> if you want to get gossiping right away.
</li>
</ul>
<footer class="w3-center w3-xlarge w3-padding">
<button class="w3-button w3-yellow proceed">Onward</button>
</footer>
</div>
<div class="slide w3-gray" style="width: 90%">
<div class="w3-card-4 w3-xlarge">
<header class="w3-container w3-blue">
<h1>💻Secure Scuttlebutt in a Nutshell🦀</h1>
</header>
<div class="w3-container w3-large w3-left-align">
<p>
Secure Scuttlebutt is a social network whose technical operation
attempts to mirrors human social interaction.
</p>
<ul>
<li>
You can create your own account and post to your own feed on
your own device. This is all <b>local</b> with no external
communication. This puts you fully in control of your own words
and actions.
</li>
<li>
Before you can interact with others, you need to
<b>connect over the network</b>, either directly to your friends
(i.e., peer-to-peer between your phones on coffee shop Wi-Fi) or
to 🚪<i>rooms</i> and 🍻<i>pubs</i> (hint: search the web for
<i>#ssbroom</i>).
</li>
<li>
Who you choose to <b>follow</b> determines what you see, with
most people choosing to see messages from friends and friends of
those friends. If you encounter content you'd rather not see,
<b>block</b> the offending account to improve the experience for
you and your followers.
</li>
<li>
Your feed is an <b>immutable</b> log of your activity. Post with
care, because like your words in real life, posts can't be taken
back.
</li>
</ul>
</div>
<footer class="w3-center w3-xlarge w3-padding">
<a
class="w3-button w3-light-gray"
href="https://scuttlebutt.nz/"
target="_blank"
>See scuttlebutt.nz</a
>
<button class="w3-button w3-yellow proceed">Got It</button>
</footer>
</div>
</div>
<div class="slide w3-gray" style="width: 90%">
<div class="w3-card-4 w3-xlarge">
<header class="w3-container w3-blue w3-center">
<h1>~😎 Let's Talk Tilde Friends ~😎</h1>
</header>
<div class="w3-container w3-large w3-left-align">
<p>
Tilde Friends is an application platform that is an application of
its own.
</p>
<ul>
<li>
This intro is a Tilde Friends app. You can click <b>edit</b> at
the top to look under the hood and make changes.
</li>
<li>
It is already possible to make and share new applications using
only Tilde Friends and Secure Scuttlebutt without having to set
up development environments, configure web servers, register
domain names, or pay for hosting services.
</li>
<li>
But it's also set up so that you can't just break an app that
everybody is using or do malicious things with personal content.
There are <b>protections</b> in place like an operating system.
The intent is also for it to be <b>safe</b> to run strange apps
without worrying about adverse effects.
</li>
<li>
But this is all a big 🚧work in progress🚧 and
<b>experiment</b>. Let's see where it takes us.
</li>
</ul>
</div>
<footer class="w3-center w3-xlarge w3-padding">
<button class="w3-button w3-yellow proceed">Okay</button>
</footer>
</div>
</div>
<div class="slide w3-gray" style="width: 90%">
<div class="w3-card-4 w3-xlarge">
<header class="w3-container w3-blue w3-center">
<h1>🦀Let's Get this Tilde Friends Party Started🎉</h1>
</header>
<div class="w3-container w3-large w3-left-align">
<p>The button below will take you to the Secure Scuttlebutt app.</p>
<ul>
<li>
Remember:
<ol>
<li>You are in charge. This is all on your device.</li>
<li>
Make network connections to exchange messages with others.
</li>
<li>
Follow more accounts to see more content, and block those
posting content you'd rather not see.
</li>
<li>
Be respectful, and consider the consequences of what you
post.
</li>
<li>
This is all under active development. Exercise patience, and
report issues encountered.
</li>
</ol>
</li>
<li>
To see this tutorial again later, select <b>apps</b> -&gt;
<b>Core Apps</b> -&gt; <b>intro</b>.
</li>
</ul>
</div>
<footer class="w3-center w3-xlarge w3-padding">
<button class="w3-button w3-yellow" id="complete">Let's Go!</button>
</footer>
</div>
</div>
</div>
<div
class="w3-text-white w3-xlarge w3-center w3-flex"
style="
width: 100%;
flex: 0 1;
flex-direction: row;
align-items: center;
gap: 8px;
"
>
<div class="w3-jumbo" id="left" style="flex: 1 0; cursor: pointer">
&#10094;
</div>
<span class="w3-badge dot w3-border w3-hover-yellow"></span>
<span class="w3-badge dot w3-border w3-hover-yellow"></span>
<span class="w3-badge dot w3-border w3-hover-yellow"></span>
<span class="w3-badge dot w3-border w3-hover-yellow"></span>
<span class="w3-badge dot w3-border w3-hover-yellow"></span>
<div class="w3-jumbo" style="flex: 1 0; cursor: pointer" id="right">
&#10095;
</div>
</div>
<script type="module">
import * as tfrpc from '/static/tfrpc.js';
let index = 0;
function set(i) {
show(i - index);
}
function show(delta) {
let slides = [...document.getElementsByClassName('slide')];
let dots = [...document.getElementsByClassName('dot')];
index = (index + delta + slides.length) % slides.length;
for (let slide of slides) {
slide.style.display =
slides.indexOf(slide) == index ? 'block' : 'none';
}
for (let dot of dots) {
if (dots.indexOf(dot) == index) {
dot.classList.add('w3-white');
} else {
dot.classList.remove('w3-white');
}
}
document.getElementById('left').style.visibility =
index == 0 ? 'hidden' : 'visible';
document.getElementById('right').style.visibility =
index == slides.length - 1 ? 'hidden' : 'visible';
}
let dots = [...document.getElementsByClassName('dot')];
for (let dot of dots) {
dot.onclick = () => set(dots.indexOf(dot));
}
for (let button of document.getElementsByClassName('proceed')) {
button.onclick = () => show(1);
}
document.getElementById('left').onclick = () => show(-1);
document.getElementById('right').onclick = () => show(1);
document.getElementById('complete').onclick = function () {
console.log('completing');
tfrpc.rpc.complete().finally(function () {
console.log('completed');
let a = document.createElement('a');
a.href = '/~core/ssb/';
a.target = '_top';
document.body.appendChild(a);
a.click();
});
};
window.addEventListener('keyup', function (event) {
if (event.key == 'ArrowLeft') {
show(-1);
} else if (event.key == 'ArrowRight') {
show(1);
}
});
show(0);
</script>
</body>
</html>

251
apps/intro/w3.css Normal file
View File

@ -0,0 +1,251 @@
/* W3.CSS 5.02 March 31 2025 by Jan Egil and Borge Refsnes */
html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit}
/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */
html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}
article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item}
audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline}
audio:not([controls]){display:none;height:0}[hidden],template{display:none}
a{background-color:transparent}a:active,a:hover{outline-width:0}
abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}
b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000}
small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none}
code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible}
button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold}
button,input{overflow:visible}button,select{text-transform:none}
button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}
button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0}
button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText}
fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}
legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto}
[type=checkbox],[type=radio]{padding:0}
[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}
[type=search]{-webkit-appearance:textfield;outline-offset:-2px}
[type=search]::-webkit-search-decoration{-webkit-appearance:none}
::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}
/* End extract */
html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden}
h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px}
.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace}
h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px}
hr{border:0;border-top:1px solid #eee;margin:20px 0}
.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit}
.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc}
.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1}
.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1}
.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center}
.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top}
.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px}
.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap}
.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)}
.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}
.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none}
.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none}
.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%}
.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none}
.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block}
.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s}
.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%}
.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc}
.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer}
.w3-dropdown-hover:hover .w3-dropdown-content{display:block}
.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000}
.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000}
.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1}
.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px}
.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto}
.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%}
.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%}
.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px}
.w3-main,#main{transition:margin-left .4s}
.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)}
.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px}
.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto}
.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0}
.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left}
.w3-bar .w3-button{white-space:normal}
.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0}
.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%}
.w3-responsive{display:block;overflow-x:auto}
.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before,
.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both}
.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%}
.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%}
.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%}
.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%}
@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%}
.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%}
.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}}
@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%}
.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%}
.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}}
.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px}
.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px}
.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell}
.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom}
.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important}
@media (max-width:1205px){.w3-auto{max-width:95%}}
@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px}
.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative}
.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center}
.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}}
@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}}
@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}}
@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}}
@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}}
.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0}
.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2}
.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0}
.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0}
.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}
.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)}
.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)}
.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)}
.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none}
.w3-display-position{position:absolute}
.w3-circle{border-radius:50%}
.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px}
.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px}
.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px}
.w3-grid{display:grid}.w3-grid-padding{display:grid;gap:16px}.w3-flex{display:flex}
.w3-text-center{text-align:center}.w3-text-bold,.w3-bold{font-weight:bold}.w3-text-italic,.w3-italic{font-style:italic}
.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px}
.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word}
.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%}
.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)}
.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)}
.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}}
.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}}
.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}}
.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}}
.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}}
.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}}
.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}}
.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}}
.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important}
.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1}
.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75}
.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)}
.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)}
.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)}
.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important}
.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important}
.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important}
.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important}
.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important}
.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important}
.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important}
.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important}
.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important}
.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important}
.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important}
.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important}
.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important}
.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important}
.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important}
.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important}
.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important}
.w3-left{float:left!important}.w3-right{float:right!important}
.w3-button:hover{color:#000!important;background-color:#ccc!important}
.w3-transparent,.w3-hover-none:hover{background-color:transparent!important}
.w3-hover-none:hover{box-shadow:none!important}
.w3-rtl{direction:rtl}.w3-ltr{direction:ltr}
/* Colors */
.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important}
.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important}
.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important}
.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important}
.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important}
.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important}
.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important}
.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important}
.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important}
.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important}
.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important}
.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important}
.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important}
.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important}
.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important}
.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important}
.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important}
.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important}
.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important}
.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important}
.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important}
.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important}
.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important}
.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important}
.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important}
.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important}
.w3-asphalt,.w3-hover-asphalt:hover{color:#fff!important;background-color:#343a40!important}
.w3-crimson,.w3-hover-crimson:hover{color:#fff!important;background-color:#a20025!important}
.w3-cobalt,w3-hover-cobalt:hover{color:#fff!important;background-color:#0050ef!important}
.w3-emerald,.w3-hover-emerald:hover{color:#fff!important;background-color:#008a00!important}
.w3-olive,.w3-hover-olive:hover{color:#fff!important;background-color:#6d8764!important}
.w3-paper,.w3-hover-paper:hover{color:#000!important;background-color:#f8f9fa!important}
.w3-sienna,.w3-hover-sienna:hover{color:#fff!important;background-color:#a0522d!important}
.w3-taupe,.w3-hover-taupe:hover{color:#fff!important;background-color:#87794e!important}
.w3-danger{color:#fff!important;background-color:#dd0000!important}
.w3-note{color:#000!important;background-color:#fff599!important}
.w3-info{color:#fff!important;background-color:#0a6fc2!important}
.w3-warning{color:#000!important;background-color:#ffb305!important}
.w3-success{color:#fff!important;background-color:#008a00!important}
.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important}
.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important}
.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important}
.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important}
.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important}
.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important}
.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important}
.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important}
.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important}
.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important}
.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important}
.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important}
.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important}
.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important}
.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important}
.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important}
.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important}
.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important}
.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important}
.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important}
.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important}
.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important}
.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important}
.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important}
.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important}
.w3-text-white,.w3-hover-text-white:hover{color:#fff!important}
.w3-text-black,.w3-hover-text-black:hover{color:#000!important}
.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important}
.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important}
.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important}
.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important}
.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important}
.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important}
.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important}
.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important}
.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important}
.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important}
.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important}
.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important}
.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important}
.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important}
.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important}
.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important}
.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important}
.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important}
.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important}
.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important}
.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important}
.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important}
.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important}
.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important}
.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important}
.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important}
.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important}
.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important}
.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important}
.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important}
.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important}

5
apps/issues.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "🦟",
"previous": "&O0huuEgL/UQC9bkUfhPOyZFo9eRiz+koOkba6QwCGNA=.sha256"
}

107
apps/issues/app.js Normal file
View File

@ -0,0 +1,107 @@
import * as tfrpc from '/tfrpc.js';
let g_database;
let g_hash;
tfrpc.register(async function localStorageGet(key) {
return app.localStorageGet(key);
});
tfrpc.register(async function localStorageSet(key, value) {
return app.localStorageSet(key, value);
});
tfrpc.register(async function databaseGet(key) {
return g_database ? g_database.get(key) : undefined;
});
tfrpc.register(async function databaseSet(key, value) {
return g_database ? g_database.set(key, value) : undefined;
});
tfrpc.register(async function createIdentity() {
return ssb.createIdentity();
});
tfrpc.register(async function getIdentities() {
return ssb.getIdentities();
});
tfrpc.register(async function getAllIdentities() {
return ssb.getAllIdentities();
});
tfrpc.register(async function getBroadcasts() {
return ssb.getBroadcasts();
});
tfrpc.register(async function getConnections() {
return ssb.connections();
});
tfrpc.register(async function getStoredConnections() {
return ssb.storedConnections();
});
tfrpc.register(async function forgetStoredConnection(connection) {
return ssb.forgetStoredConnection(connection);
});
tfrpc.register(async function createTunnel(portal, target) {
return ssb.createTunnel(portal, target);
});
tfrpc.register(async function connect(token) {
await ssb.connect(token);
});
tfrpc.register(async function closeConnection(id) {
await ssb.closeConnection(id);
});
tfrpc.register(async function query(sql, args) {
let result = [];
await ssb.sqlAsync(sql, args, function callback(row) {
result.push(row);
});
return result;
});
tfrpc.register(async function appendMessage(id, message) {
return ssb.appendMessageWithIdentity(id, message);
});
core.register('message', async function message_handler(message) {
if (message.event == 'hashChange') {
g_hash = message.hash;
await tfrpc.rpc.hashChanged(message.hash);
}
});
tfrpc.register(function getHash(id, message) {
return g_hash;
});
tfrpc.register(function setHash(hash) {
return app.setHash(hash);
});
tfrpc.register(async function store_blob(blob) {
if (Array.isArray(blob)) {
blob = Uint8Array.from(blob);
}
return await ssb.blobStore(blob);
});
tfrpc.register(async function get_blob(id) {
return utf8Decode(await ssb.blobGet(id));
});
tfrpc.register(async function store_message(message) {
return await ssb.storeMessage(message);
});
tfrpc.register(function apps() {
return core.apps();
});
tfrpc.register(function getActiveIdentity() {
return ssb.getActiveIdentity();
});
tfrpc.register(async function try_decrypt(id, content) {
return await ssb.privateMessageDecrypt(id, content);
});
core.register('onMessage', async function (id) {
await tfrpc.rpc.notifyNewMessage(id);
});
core.register('onBroadcastsChanged', async function () {
await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
});
core.register('onConnectionsChanged', async function () {
await tfrpc.rpc.set('connections', await ssb.connections());
});
async function main() {
if (typeof database !== 'undefined') {
g_database = await database('ssb');
}
await app.setDocument(utf8Decode(await getFile('index.html')));
}
main();

View File

@ -0,0 +1,91 @@
function textNode(text) {
const node = new commonmark.Node("text", undefined);
node.literal = text;
return node;
}
function linkNode(text, url) {
const urlNode = new commonmark.Node("link", undefined);
urlNode.destination = url;
urlNode.appendChild(textNode(text));
return urlNode;
}
function splitMatches(text, regexp) {
// Regexp must be sticky.
regexp = new RegExp(regexp, "gm");
let i = 0;
const result = [];
let match = regexp.exec(text);
while (match) {
const matchText = match[0];
if (match.index > i) {
result.push([text.substring(i, match.index), false]);
}
result.push([matchText, true]);
i = match.index + matchText.length;
match = regexp.exec(text);
}
if (i < text.length) {
result.push([text.substring(i, text.length), false]);
}
return result;
}
const urlRegexp = new RegExp("https?://[^ ]+[^ .,]");
function splitURLs(textNodes) {
const text = textNodes.map(n => n.literal).join("");
const parts = splitMatches(text, urlRegexp);
return parts.map(part => {
if (part[1]) {
return linkNode(part[0], part[0]);
} else {
return textNode(part[0]);
}
});
}
export function transform(parsed) {
const walker = parsed.walker();
let event;
let nodes = [];
while ((event = walker.next())) {
const node = event.node;
if (event.entering && node.type === "text") {
nodes.push(node);
} else {
if (nodes.length > 0) {
splitURLs(nodes)
.reverse()
.forEach(newNode => {
nodes[0].insertAfter(newNode);
});
nodes.forEach(n => n.unlink());
nodes = [];
}
}
}
if (nodes.length > 0) {
splitURLs(nodes)
.reverse()
.forEach(newNode => {
nodes[0].insertAfter(newNode);
});
nodes.forEach(n => n.unlink());
}
return parsed;
}

1
apps/issues/commonmark.min.js vendored Normal file

File diff suppressed because one or more lines are too long

16
apps/issues/index.html Normal file
View File

@ -0,0 +1,16 @@
<!doctype html>
<html style="color: #fff">
<head>
<title>Tilde Friends</title>
<base target="_top" />
</head>
<body>
<tf-issues-app />
<script>
window.litDisableBundleWarning = true;
</script>
<script src="commonmark.min.js"></script>
<script src="commonmark-linkify.js" type="module"></script>
<script src="script.js" type="module"></script>
</body>
</html>

120
apps/issues/lit-all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

248
apps/issues/script.js Normal file
View File

@ -0,0 +1,248 @@
import {LitElement, html, unsafeHTML} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
import * as tfutils from './tf-utils.js';
const k_project = '%Hr+4xEVtjplidSKBlRWi4Aw/0Tfw7B+1OR9BzlDKmOI=.sha256';
class TfComposeElement extends LitElement {
static get properties() {
return {
value: {type: String},
};
}
input() {
let input = this.renderRoot.getElementById('input');
let preview = this.renderRoot.getElementById('preview');
if (input && preview) {
preview.innerHTML = tfutils.markdown(input.value);
}
}
submit() {
this.dispatchEvent(
new CustomEvent('tf-submit', {
bubbles: true,
composed: true,
detail: {
value: this.renderRoot.getElementById('input').value,
},
})
);
this.renderRoot.getElementById('input').value = '';
this.input();
}
render() {
return html`
<div style="display: flex; flex-direction: row">
<textarea id="input" @input=${this.input} style="flex: 1 1">${this.value}</textarea>
<div id="preview" style="flex: 1 1"></div>
</div>
<input type="submit" value="Submit" @click=${this.submit}></input>
`;
}
}
customElements.define('tf-compose', TfComposeElement);
class TfIssuesAppElement extends LitElement {
static get properties() {
return {
issues: {type: Array},
selected: {type: Object},
};
}
constructor() {
super();
this.issues = [];
this.load();
}
async load() {
let issues = {};
let messages = await tfrpc.rpc.query(
`
WITH issues AS (SELECT messages.id, json(messages.content) AS content, messages.author, messages.timestamp FROM messages_refs JOIN messages ON
messages.id = messages_refs.message
WHERE messages_refs.ref = ? AND json_extract(messages.content, '$.type') = 'issue'),
edits AS (SELECT messages.id, json(messages.content) AS content, messages.author, messages.timestamp FROM issues JOIN messages_refs ON
issues.id = messages_refs.ref JOIN messages ON
messages.id = messages_refs.message
WHERE json_extract(messages.content, '$.type') IN ('issue-edit', 'post'))
SELECT * FROM issues
UNION
SELECT * FROM edits ORDER BY timestamp
`,
[k_project]
);
for (let message of messages) {
let content = JSON.parse(message.content);
switch (content.type) {
case 'issue':
issues[message.id] = {
id: message.id,
author: message.author,
text: content.text,
updates: [],
created: message.timestamp,
open: true,
};
break;
case 'issue-edit':
case 'post':
for (let issue of content.issues || []) {
if (issues[issue.link]) {
if (issue.open !== undefined) {
issues[issue.link].open = issue.open;
message.open = issue.open;
}
issues[issue.link].updates.push(message);
issues[issue.link].updated = message.timestamp;
}
}
break;
}
}
this.issues = Object.values(issues).sort(
(x, y) => y.open - x.open || y.created - x.created
);
if (this.selected) {
for (let issue of this.issues) {
if (issue.id == this.selected.id) {
this.selected = issue;
}
}
}
}
render_issue_table_row(issue) {
return html`
<tr>
<td>${issue.open ? '☐ open' : '☑ closed'}</td>
<td
style="max-width: 8em; overflow: hidden; white-space: nowrap; text-overflow: ellipsis"
>
${issue.author}
</td>
<td
style="max-width: 40em; overflow: hidden; white-space: nowrap; text-overflow: ellipsis; cursor: pointer"
@click=${() => (this.selected = issue)}
>
${issue.text.split('\n')?.[0]}
</td>
<td>
${new Date(issue.updated ?? issue.created).toLocaleDateString()}
</td>
</tr>
`;
}
render_update(update) {
let content = JSON.parse(update.content);
let message;
if (content.text) {
message = unsafeHTML(tfutils.markdown(content.text));
}
return html`
<div style="border-left: 2px solid #fff; padding-left: 8px">
<div>${new Date(update.timestamp).toLocaleString()}</div>
<div>${update.author}</div>
<div>${message}</div>
<div>
${update.open !== undefined
? update.open
? 'issue opened'
: 'issue closed'
: undefined}
</div>
</div>
`;
}
async set_open(id, open) {
if (
confirm(`Are you sure you want to ${open ? 'open' : 'close'} this issue?`)
) {
let whoami = await tfrpc.rpc.getActiveIdentity();
await tfrpc.rpc.appendMessage(whoami, {
type: 'issue-edit',
issues: [
{
link: id,
open: open,
},
],
});
await this.load();
}
}
async create_issue(event) {
let whoami = await tfrpc.rpc.getActiveIdentity();
await tfrpc.rpc.appendMessage(whoami, {
type: 'issue',
project: k_project,
text: event.detail.value,
});
await this.load();
}
async reply_to_issue(event) {
let whoami = await tfrpc.rpc.getActiveIdentity();
await tfrpc.rpc.appendMessage(whoami, {
type: 'post',
text: event.detail.value,
root: this.selected.id,
branch: this.selected.updates.length
? this.selected.updates[this.selected.updates.length - 1].id
: this.selected.id,
issues: [
{
link: this.selected.id,
},
],
});
await this.load();
}
render() {
let header = html` <h1>Tilde Friends Issues</h1> `;
if (this.selected) {
return html`
${header}
<div>
<input type="button" value="Back" @click=${() => (this.selected = undefined)}></input>
${
this.selected.open
? html`<input type="button" value="Close Issue" @click=${() => this.set_open(this.selected.id, false)}></input>`
: html`<input type="button" value="Reopen Issue" @click=${() => this.set_open(this.selected.id, true)}></input>`
}
</div>
<div>${new Date(this.selected.created).toLocaleString()}</div>
<div>${this.selected.author}</div>
<div>${this.selected.id}</div>
<div>${unsafeHTML(tfutils.markdown(this.selected.text))}</div>
${this.selected.updates.map((x) => this.render_update(x))}
<tf-compose @tf-submit=${this.reply_to_issue}></tf-compose>
`;
} else {
return html`
${header}
<h2>New Issue</h2>
<tf-compose @tf-submit=${this.create_issue}></tf-compose>
<table>
<tr>
<th>Status</th>
<th>Author</th>
<th>Title</th>
<th>Date</th>
</tr>
${this.issues.map((x) => this.render_issue_table_row(x))}
</table>
`;
}
}
}
customElements.define('tf-issues-app', TfIssuesAppElement);

119
apps/issues/tf-utils.js Normal file
View File

@ -0,0 +1,119 @@
import * as linkify from './commonmark-linkify.js';
var reUnsafeProtocol = /^javascript:|vbscript:|file:|data:/i;
var reSafeDataProtocol = /^data:image\/(?:png|gif|jpeg|webp)/i;
var potentiallyUnsafe = function (url) {
return reUnsafeProtocol.test(url) && !reSafeDataProtocol.test(url);
};
function image(node, entering) {
if (
node.firstChild?.type === 'text' &&
node.firstChild.literal.startsWith('video:')
) {
if (entering) {
this.lit(
'<video style="max-width: 100%; max-height: 480px" title="' +
this.esc(node.firstChild?.literal) +
'" controls>'
);
this.lit('<source src="' + this.esc(node.destination) + '"></source>');
this.disableTags += 1;
} else {
this.disableTags -= 1;
this.lit('</video>');
}
} else if (
node.firstChild?.type === 'text' &&
node.firstChild.literal.startsWith('audio:')
) {
if (entering) {
this.lit(
'<audio style="height: 32px; max-width: 100%" title="' +
this.esc(node.firstChild?.literal) +
'" controls>'
);
this.lit('<source src="' + this.esc(node.destination) + '"></source>');
this.disableTags += 1;
} else {
this.disableTags -= 1;
this.lit('</audio>');
}
} else {
if (entering) {
if (this.disableTags === 0) {
this.lit(
'<div class="img_caption">' +
this.esc(node.firstChild?.literal || node.destination) +
'</div>'
);
if (this.options.safe && potentiallyUnsafe(node.destination)) {
this.lit('<img src="" alt="');
} else {
this.lit('<img src="' + this.esc(node.destination) + '" alt="');
}
}
this.disableTags += 1;
} else {
this.disableTags -= 1;
if (this.disableTags === 0) {
if (node.title) {
this.lit('" title="' + this.esc(node.title));
}
this.lit('" />');
}
}
}
}
export function markdown(md) {
var reader = new commonmark.Parser();
var writer = new commonmark.HtmlRenderer({safe: true});
writer.image = image;
var parsed = reader.parse(md || '');
parsed = linkify.transform(parsed);
var walker = parsed.walker();
var event, node;
while ((event = walker.next())) {
node = event.node;
if (event.entering) {
if (node.type == 'link') {
if (
node.destination.startsWith('@') &&
node.destination.endsWith('.ed25519')
) {
node.destination = '#' + node.destination;
} else if (
node.destination.startsWith('%') &&
node.destination.endsWith('.sha256')
) {
node.destination = '#' + node.destination;
} else if (
node.destination.startsWith('&') &&
node.destination.endsWith('.sha256')
) {
node.destination = '/' + node.destination + '/view';
}
} else if (node.type == 'image') {
if (node.destination.startsWith('&')) {
node.destination = '/' + node.destination + '/view';
}
}
}
}
return writer.render(parsed);
}
export function human_readable_size(bytes) {
let v = bytes;
let u = 'B';
for (let unit of ['kB', 'MB', 'GB']) {
if (v > 1024) {
v /= 1024;
u = unit;
} else {
break;
}
}
return `${Math.round(v * 10) / 10} ${u}`;
}

5
apps/journal.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "📝",
"previous": "&5LpOTEnor/rYFk3axyfmmehAoq9aEwNQRH4jwNhRQ7o=.sha256"
}

185
apps/journal/app.js Normal file
View File

@ -0,0 +1,185 @@
import * as tfrpc from '/tfrpc.js';
let g_hash;
let g_collection_notifies = {};
tfrpc.register(async function getOwnerIdentities() {
return ssb.getOwnerIdentities();
});
tfrpc.register(async function getIdentities() {
return ssb.getIdentities();
});
tfrpc.register(async function query(sql, args) {
let result = [];
await ssb.sqlAsync(sql, args, function callback(row) {
result.push(row);
});
return result;
});
tfrpc.register(async function localStorageGet(key) {
return app.localStorageGet(key);
});
tfrpc.register(async function localStorageSet(key, value) {
return app.localStorageSet(key, value);
});
tfrpc.register(async function following(ids, depth) {
return ssb.following(ids, depth);
});
tfrpc.register(async function appendMessage(id, message) {
return ssb.appendMessageWithIdentity(id, message);
});
tfrpc.register(async function store_blob(blob) {
if (Array.isArray(blob)) {
blob = Uint8Array.from(blob);
}
return await ssb.blobStore(blob);
});
tfrpc.register(async function get_blob(id) {
return utf8Decode(await ssb.blobGet(id));
});
let g_new_message_resolve;
let g_new_message_promise = new Promise(function (resolve, reject) {
g_new_message_resolve = resolve;
});
function new_message() {
return g_new_message_promise;
}
core.register('onMessage', function (id) {
let resolve = g_new_message_resolve;
g_new_message_promise = new Promise(function (resolve, reject) {
g_new_message_resolve = resolve;
});
if (resolve) {
resolve();
}
});
core.register('message', async function message_handler(message) {
if (message.event == 'hashChange') {
print('hash change', message.hash);
g_hash = message.hash;
await tfrpc.rpc.hash_changed(message.hash);
}
});
tfrpc.register(function set_hash(hash) {
if (g_hash != hash) {
return app.setHash(hash);
}
});
tfrpc.register(function get_hash(id, message) {
return g_hash;
});
tfrpc.register(async function try_decrypt(id, content) {
return await ssb.privateMessageDecrypt(id, content);
});
tfrpc.register(async function encrypt(id, recipients, content) {
return await ssb.privateMessageEncrypt(id, recipients, content);
});
async function process_message(whoami, collection, message, kind, parent) {
let content = JSON.parse(message.content);
if (typeof content == 'string') {
let x;
for (let id of whoami) {
x = await ssb.privateMessageDecrypt(id, content);
if (x) {
content = JSON.parse(x);
break;
}
}
if (!x) {
return;
}
if (content.type !== kind || (parent && content.parent !== parent)) {
return;
}
}
if (content?.key) {
if (content?.tombstone) {
delete collection[content.key];
} else {
collection[content.key] = Object.assign(
collection[content.key] || {},
content
);
}
} else {
collection[message.id] = Object.assign(content, {id: message.id});
}
return true;
}
tfrpc.register(async function collection(ids, kind, parent, max_rowid, data) {
let whoami = await ssb.getIdentities();
data = data ?? {};
let rowid = 0;
await ssb.sqlAsync(
'SELECT MAX(rowid) AS rowid FROM messages',
[],
function (row) {
rowid = row.rowid;
}
);
while (true) {
if (rowid == max_rowid) {
await new_message();
await ssb.sqlAsync(
'SELECT MAX(rowid) AS rowid FROM messages',
[],
function (row) {
rowid = row.rowid;
}
);
}
let modified = false;
let rows = [];
await ssb.sqlAsync(
`
SELECT messages.id, author, content, timestamp
FROM messages
JOIN json_each(?1) AS id ON messages.author = id.value
WHERE
messages.rowid > ?2 AND
messages.rowid <= ?3 AND
((json_extract(messages.content, '$.type') = ?4 AND
(?5 IS NULL OR json_extract(messages.content, '$.parent') = ?5)) OR
content LIKE '"%')
`,
[JSON.stringify(ids), max_rowid ?? -1, rowid, kind, parent],
function (row) {
rows.push(row);
}
);
max_rowid = rowid;
for (let row of rows) {
if (await process_message(whoami, data, row, kind, parent)) {
modified = true;
}
}
if (modified) {
break;
}
}
return [rowid, data];
});
async function main() {
await app.setDocument(utf8Decode(await getFile('index.html')));
}
main();

1
apps/journal/commonmark.min.js vendored Normal file

File diff suppressed because one or more lines are too long

16
apps/journal/index.html Normal file
View File

@ -0,0 +1,16 @@
<!doctype html>
<html>
<head>
<base target="_top" />
</head>
<body style="color: #fff">
<tf-journal-app></tf-journal-app>
<script src="commonmark.min.js"></script>
<script>
window.litDisableBundleWarning = true;
</script>
<script src="tf-journal-app.js" type="module"></script>
<script src="tf-journal-entry.js" type="module"></script>
<script src="tf-id-picker.js" type="module"></script>
</body>
</html>

120
apps/journal/lit-all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,43 @@
import {LitElement, html} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
/*
** Provide a list of IDs, and this lets the user pick one.
*/
class TfIdentityPickerElement extends LitElement {
static get properties() {
return {
ids: {type: Array},
selected: {type: String},
};
}
constructor() {
super();
this.ids = [];
}
changed(event) {
this.selected = event.srcElement.value;
this.dispatchEvent(
new Event('change', {
srcElement: this,
})
);
}
render() {
return html`
<select @change=${this.changed} style="max-width: 100%">
${(this.ids ?? []).map(
(id) =>
html`<option ?selected=${id == this.selected} value=${id}>
${id}
</option>`
)}
</select>
`;
}
}
customElements.define('tf-id-picker', TfIdentityPickerElement);

View File

@ -0,0 +1,89 @@
import {LitElement, html, keyed, live} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
class TfJournalAppElement extends LitElement {
static get properties() {
return {
ids: {type: Array},
owner_ids: {type: Array},
whoami: {type: String},
journals: {type: Object},
};
}
constructor() {
super();
this.ids = [];
this.owner_ids = [];
this.journals = {};
this.load();
}
async load() {
this.ids = await tfrpc.rpc.getIdentities();
this.whoami = await tfrpc.rpc.localStorageGet('journal_whoami');
await this.read_journals();
}
async read_journals() {
let max_rowid;
let journals;
while (true) {
[max_rowid, journals] = await tfrpc.rpc.collection(
[this.whoami],
'journal-entry',
undefined,
max_rowid,
journals
);
this.journals = Object.assign({}, journals);
console.log('JOURNALS', this.journals);
}
}
async on_whoami_changed(event) {
let new_id = event.srcElement.selected;
await tfrpc.rpc.localStorageSet('journal_whoami', new_id);
this.whoami = new_id;
}
async on_journal_publish(event) {
let key = event.detail.key;
let text = event.detail.text;
let message = {
type: 'journal-entry',
key: key,
text: text,
};
message.recps = [this.whoami];
print(message);
message = await tfrpc.rpc.encrypt(
this.whoami,
message.recps,
JSON.stringify(message)
);
print(message);
await tfrpc.rpc.appendMessage(this.whoami, message);
}
render() {
console.log('RENDER APP', this.journals);
let self = this;
return html`
<div>
<tf-id-picker
.ids=${this.ids}
selected=${this.whoami}
@change=${this.on_whoami_changed}
></tf-id-picker>
</div>
<tf-journal-entry
whoami=${this.whoami}
.journals=${this.journals}
@publish=${this.on_journal_publish}
></tf-journal-entry>
`;
}
}
customElements.define('tf-journal-app', TfJournalAppElement);

View File

@ -0,0 +1,97 @@
import {LitElement, html, unsafeHTML, range} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
class TfJournalEntryElement extends LitElement {
static get properties() {
return {
whoami: {type: String},
key: {type: String},
journals: {type: Object},
text: {type: String},
};
}
constructor() {
super();
this.journals = {};
this.key = new Date().toISOString().split('T')[0];
}
markdown(md) {
var reader = new commonmark.Parser();
var writer = new commonmark.HtmlRenderer({safe: true});
var parsed = reader.parse(md || '');
return writer.render(parsed);
}
on_discard(event) {
this.text = undefined;
}
async on_publish() {
console.log('publish', this.text);
this.dispatchEvent(
new CustomEvent('publish', {
bubbles: true,
detail: {
key: this.shadowRoot.getElementById('date_picker').value,
text: this.text,
},
})
);
}
back_dates(count) {
let now = new Date();
let result = [];
for (let i = 0; i < count; i++) {
let next = new Date(now);
next.setDate(now.getDate() - i);
result.push(next.toISOString().split('T')[0]);
}
return result;
}
on_edit(event) {
this.text = event.srcElement.value;
}
on_date_change(event) {
this.key = event.srcElement.value;
this.text = this.journals[this.key]?.text;
}
render() {
console.log('RENDER ENTRY', this.key, this.journals?.[this.key]);
return html`
<select id="date_picker" @change=${this.on_date_change}>
${this.back_dates(10).map(
(x) => html` <option value=${x}>${x}</option> `
)}
</select>
<div style="display: inline-flex; flex-direction: row">
<button
?disabled=${this.text == this.journals?.[this.key]?.text}
@click=${this.on_publish}
>
Publish
</button>
<button @click=${this.on_discard}>Discard</button>
</div>
<div style="display: flex; flex-direction: row">
<textarea
style="flex: 1 1; min-height: 10em"
@input=${this.on_edit}
.value=${this.text ?? this.journals?.[this.key]?.text ?? ''}
></textarea>
<div style="flex: 1 1">
${unsafeHTML(
this.markdown(this.text ?? this.journals?.[this.key]?.text)
)}
</div>
</div>
`;
}
}
customElements.define('tf-journal-entry', TfJournalEntryElement);

5
apps/room.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "🚪",
"previous": "&HXCdDG8gGYXElTyEFbg85jqa6lDXNL2ENPIA9UoJNbI=.sha256"
}

15
apps/room/app.js Normal file
View File

@ -0,0 +1,15 @@
async function main() {
print(core.url);
let host = core.url.match(/.*?\/\/([^:/]*)/)[1];
let port = await ssb.port();
let id = (await ssb.getServerIdentity()).substring(1);
let room = `net:${host}:${port}~shs:${id}:SSB+Room+SK3TLYC2T86EHQCUHBUHASCASE18JBV24=`;
await app.setDocument(`
<body style="color: #fff">
<h1>Server</h1>
<div>The local server address is:</div>
<div><input type="text" readonly value="${room}" style="width: 100%"></input></div>
</body>
`);
}
main();

5
apps/sneaker.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "👟",
"previous": "&lYZRnT2UGQxXxYISbuaZewik9AuxBpcJumakwrePw5c=.sha256"
}

30
apps/sneaker/app.js Normal file
View File

@ -0,0 +1,30 @@
import * as tfrpc from '/tfrpc.js';
tfrpc.register(async function getAllIdentities() {
return ssb.getAllIdentities();
});
tfrpc.register(async function query(sql, args) {
let result = [];
await ssb.sqlAsync(sql, args, function callback(row) {
result.push(row);
});
return result;
});
tfrpc.register(async function store_blob(blob) {
if (Array.isArray(blob)) {
blob = Uint8Array.from(blob);
}
return await ssb.blobStore(blob);
});
tfrpc.register(async function get_blob(id) {
return Array.from(new Uint8Array(await ssb.blobGet(id)));
});
tfrpc.register(async function store_message(message) {
return await ssb.storeMessage(message);
});
async function main() {
await app.setDocument(utf8Decode(await getFile('index.html')));
}
main();

3
apps/sneaker/filesaver.min.js vendored Normal file
View File

@ -0,0 +1,3 @@
(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)});
//# sourceMappingURL=FileSaver.min.js.map

16
apps/sneaker/index.html Normal file
View File

@ -0,0 +1,16 @@
<!doctype html>
<html style="color: #fff">
<head>
<title>Tilde Friends</title>
<base target="_top" />
</head>
<body>
<tf-sneaker-app />
<script>
window.litDisableBundleWarning = true;
</script>
<script src="filesaver.min.js"></script>
<script src="jszip.min.js"></script>
<script src="script.js" type="module"></script>
</body>
</html>

13
apps/sneaker/jszip.min.js vendored Normal file

File diff suppressed because one or more lines are too long

120
apps/sneaker/lit-all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

350
apps/sneaker/script.js Normal file
View File

@ -0,0 +1,350 @@
import {LitElement, html} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
class TfSneakerAppElement extends LitElement {
static get properties() {
return {
feeds: {type: Object},
progress: {type: Object},
result: {type: String},
};
}
constructor() {
super();
this.feeds = [];
this.progress = undefined;
this.result = undefined;
}
async search() {
let q = this.renderRoot.getElementById('search').value;
let result = await tfrpc.rpc.query(
`
SELECT messages.author AS id, json_extract(messages.content, '$.name') AS name
FROM messages_fts(?)
JOIN messages ON messages.rowid = messages_fts.rowid
WHERE
json_extract(messages.content, '$.type') = 'about' AND
json_extract(messages.content, '$.about') = messages.author AND
json_extract(messages.content, '$.name') IS NOT NULL
GROUP BY messages.author
HAVING MAX(messages.sequence)
ORDER BY COUNT(*) DESC
`,
[`"${q.replaceAll('"', '""')}"`]
);
this.feeds = Object.fromEntries(result.map((x) => [x.id, x.name]));
}
format_message(message) {
const k_flag_sequence_before_author = 1;
let out = {
previous: message.previous ?? null,
};
if (message.flags & k_flag_sequence_before_author) {
out.sequence = message.sequence;
out.author = message.author;
} else {
out.author = message.author;
out.sequence = message.sequence;
}
out.timestamp = message.timestamp;
out.hash = message.hash;
out.content = JSON.parse(message.content);
out.signature = message.signature;
return {key: message.id, value: out};
}
sanitize(value) {
return value.replaceAll('/', '_').replaceAll('+', '-');
}
guess_ext(data) {
function startsWith(prefix) {
if (data.length < prefix.length) {
return false;
}
for (let i = 0; i < prefix.length; i++) {
if (prefix[i] !== null && data[i] !== prefix[i]) {
return false;
}
}
return true;
}
if (
startsWith(data, [0xff, 0xd8, 0xff, 0xdb]) ||
startsWith(
data,
[0xff, 0xd8, 0xff, 0xe0, 0x00, 0x10, 0x4a, 0x46, 0x49, 0x46, 0x00, 0x01]
) ||
startsWith(data, [0xff, 0xd8, 0xff, 0xee]) ||
startsWith(data, [
0xff,
0xd8,
0xff,
0xe1,
null,
null,
0x45,
0x78,
0x69,
0x66,
0x00,
0x00,
])
) {
return '.jpg';
} else if (
startsWith(data, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])
) {
return '.png';
} else if (
startsWith(data, [0x47, 0x49, 0x46, 0x38, 0x37, 0x61]) ||
startsWith(data, [0x47, 0x49, 0x46, 0x38, 0x39, 0x61])
) {
return '.gif';
} else if (
startsWith(data, [
0x52,
0x49,
0x46,
0x46,
null,
null,
null,
null,
0x57,
0x45,
0x42,
0x50,
])
) {
return '.webp';
} else if (startsWith(data, [0x3c, 0x73, 0x76, 0x67])) {
return '.svg';
} else if (
startsWith(data, [
null,
null,
null,
null,
0x66,
0x74,
0x79,
0x70,
0x6d,
0x70,
0x34,
0x32,
])
) {
return '.mp3';
} else if (
startsWith(data, [
null,
null,
null,
null,
0x66,
0x74,
0x79,
0x70,
0x69,
0x73,
0x6f,
0x6d,
]) ||
startsWith(data, [
null,
null,
null,
null,
0x66,
0x74,
0x79,
0x70,
0x6d,
0x70,
0x34,
0x32,
])
) {
return '.mp4';
} else {
return '.bin';
}
}
async export(id) {
let all_messages = '';
let sequence = -1;
let messages_done = 0;
let messages_max = (
await tfrpc.rpc.query(
'SELECT MAX(sequence) AS total FROM messages WHERE author = ?',
[id]
)
)[0].total;
while (true) {
let messages = await tfrpc.rpc.query(
`
SELECT author, id, sequence, timestamp, hash, json(content) AS content, signature, flags
FROM messages
WHERE author = ? AND SEQUENCE > ?
ORDER BY sequence LIMIT 100
`,
[id, sequence]
);
if (messages?.length) {
all_messages +=
messages
.map((x) => JSON.stringify(this.format_message(x)))
.join('\n') + '\n';
sequence = messages[messages.length - 1].sequence;
messages_done += messages.length;
this.progress = {
name: 'messages',
value: messages_done,
max: messages_max,
};
} else {
break;
}
}
let zip = new JSZip();
zip.file(`message/classic/${this.sanitize(id)}.ndjson`, all_messages);
let blobs = await tfrpc.rpc.query(
`SELECT messages_refs.ref AS id
FROM messages
JOIN messages_refs ON messages.id = messages_refs.message
WHERE messages.author = ? AND messages_refs.ref LIKE '&%.sha256'`,
[id]
);
let blobs_done = 0;
for (let row of blobs) {
this.progress = {name: 'blobs', value: blobs_done, max: blobs.length};
let blob;
try {
blob = await tfrpc.rpc.get_blob(row.id);
} catch (e) {
console.log(`Failed to get ${row.id}: ${e.message}`);
}
if (blob) {
zip.file(
`blob/classic/${this.sanitize(row.id)}${this.guess_ext(blob)}`,
new Uint8Array(blob)
);
}
blobs_done++;
}
this.progress = {name: 'saving'};
let blob = await zip.generateAsync({type: 'blob'});
saveAs(blob, `${this.sanitize(id)}.zip`);
this.progress = null;
}
keypress(event) {
if (event.key == 'Enter') {
this.search();
}
}
async import(event) {
let file = event.target.files[0];
if (!file) {
return;
}
this.progress = {name: 'loading'};
let zip = new JSZip();
file = await zip.loadAsync(file);
let messages = [];
let blobs = [];
file.forEach(function (path, entry) {
if (!entry.dir) {
if (path.startsWith('message/classic/')) {
messages.push(entry);
} else {
blobs.push(entry);
}
}
});
let success = {messages: 0, blobs: 0};
let progress = 0;
let total_messages = 0;
for (let entry of messages) {
let lines = (await entry.async('string')).split('\n');
total_messages += lines.length;
for (let line of lines) {
if (!line.length) {
continue;
}
let message = JSON.parse(line);
this.progress = {
name: 'messages',
value: progress++,
max: total_messages,
};
if (await tfrpc.rpc.store_message(message.value)) {
success.messages++;
}
}
}
progress = 0;
for (let blob of blobs) {
this.progress = {name: 'blobs', value: progress++, max: blobs.length};
if (await tfrpc.rpc.store_blob(await blob.async('arraybuffer'))) {
success.blobs++;
}
}
this.progress = undefined;
this.result = `imported ${success.messages} messages and ${success.blobs} blobs`;
}
render() {
let progress;
if (this.progress) {
if (this.progress.max) {
progress = html`<div>
<label for="progress">${this.progress.name}</label
><progress
value=${this.progress.value}
max=${this.progress.max}
></progress>
</div>`;
} else {
progress = html`<div><span>${this.progress.name}</span></div>`;
}
}
return html`<h1>SSB 👟net</h1>
<code>${this.result}</code>
${progress}
<h2>Import</h2>
<input type="file" id="import" @change=${this.import}></input>
<h2>Export</h2>
<input type="text" id="search" @keypress=${this.keypress}></input>
<input type="button" value="Search Users" @click=${this.search}></input>
<ul>
${Object.entries(this.feeds).map(
([id, name]) => html`
<li>
${this.progress
? undefined
: html`<input type="button" value="Export" @click=${() => this.export(id)}></input>`}
${name}
<code style="color: #ccc">${id}</code>
</li>
`
)}
</ul>
`;
}
}
customElements.define('tf-sneaker-app', TfSneakerAppElement);

5
apps/ssb.json Normal file
View File

@ -0,0 +1,5 @@
{
"type": "tildefriends-app",
"emoji": "🦀",
"previous": "&0Lxm4IgS3mpvSccP3bg7wNPACtLKMTbie51ea/vJbeg=.sha256"
}

127
apps/ssb/app.js Normal file
View File

@ -0,0 +1,127 @@
import * as tfrpc from '/tfrpc.js';
let g_database;
let g_hash;
tfrpc.register(async function localStorageGet(key) {
return app.localStorageGet(key);
});
tfrpc.register(async function localStorageSet(key, value) {
return app.localStorageSet(key, value);
});
tfrpc.register(async function databaseGet(key) {
return g_database ? g_database.get(key) : undefined;
});
tfrpc.register(async function databaseSet(key, value) {
return g_database ? g_database.set(key, value) : undefined;
});
tfrpc.register(async function createIdentity() {
return ssb.createIdentity();
});
tfrpc.register(async function getServerIdentity() {
return ssb.getServerIdentity();
});
tfrpc.register(async function getIdentities() {
return ssb.getIdentities();
});
tfrpc.register(async function getAllIdentities() {
return ssb.getAllIdentities();
});
tfrpc.register(async function following(ids, depth) {
return ssb.following(ids, depth);
});
tfrpc.register(async function getBroadcasts() {
return ssb.getBroadcasts();
});
tfrpc.register(async function getConnections() {
return ssb.connections();
});
tfrpc.register(async function getStoredConnections() {
return ssb.storedConnections();
});
tfrpc.register(async function forgetStoredConnection(connection) {
return ssb.forgetStoredConnection(connection);
});
tfrpc.register(async function createTunnel(portal, target) {
return ssb.createTunnel(portal, target);
});
tfrpc.register(async function connect(token) {
await ssb.connect(token);
});
tfrpc.register(async function closeConnection(id) {
await ssb.closeConnection(id);
});
tfrpc.register(async function query(sql, args) {
let result = [];
await ssb.sqlAsync(sql, args, function callback(row) {
result.push(row);
});
return result;
});
tfrpc.register(async function appendMessage(id, message) {
return ssb.appendMessageWithIdentity(id, message);
});
core.register('message', async function message_handler(message) {
if (message.event == 'hashChange') {
g_hash = message.hash;
await tfrpc.rpc.hashChanged(message.hash);
}
});
tfrpc.register(function getHash(id, message) {
return g_hash;
});
tfrpc.register(function setHash(hash) {
return app.setHash(hash);
});
core.register('onMessage', async function (id) {
await tfrpc.rpc.notifyNewMessage(id);
});
tfrpc.register(async function store_blob(blob) {
if (Array.isArray(blob)) {
blob = Uint8Array.from(blob);
}
return await ssb.blobStore(blob);
});
tfrpc.register(async function get_blob(id) {
return utf8Decode(await ssb.blobGet(id));
});
tfrpc.register(async function store_message(message) {
return await ssb.storeMessage(message);
});
tfrpc.register(function apps() {
return core.apps();
});
tfrpc.register(async function try_decrypt(id, content) {
return await ssb.privateMessageDecrypt(id, content);
});
tfrpc.register(async function encrypt(id, recipients, content) {
return await ssb.privateMessageEncrypt(id, recipients, content);
});
tfrpc.register(async function getActiveIdentity() {
return await ssb.getActiveIdentity();
});
tfrpc.register(async function sync() {
return await ssb.sync();
});
tfrpc.register(async function url() {
return core.url;
});
core.register('onBroadcastsChanged', async function () {
await tfrpc.rpc.set('broadcasts', await ssb.getBroadcasts());
});
core.register('onConnectionsChanged', async function () {
await tfrpc.rpc.set('connections', await ssb.connections());
});
core.register('setActiveIdentity', async function (id) {
await tfrpc.rpc.set('identity', id);
});
async function main() {
if (typeof database !== 'undefined') {
g_database = await database('ssb');
}
await app.setDocument(utf8Decode(await getFile('index.html')));
}
main();

View File

@ -0,0 +1,94 @@
function textNode(text) {
const node = new commonmark.Node('text', undefined);
node.literal = text;
return node;
}
function linkNode(text, link) {
const linkNode = new commonmark.Node('link', undefined);
if (link.startsWith('#')) {
linkNode.destination = `#${encodeURIComponent(link)}`;
} else {
linkNode.destination = link;
}
linkNode.appendChild(textNode(text));
return linkNode;
}
function splitMatches(text, regexp) {
// Regexp must be sticky.
regexp = new RegExp(regexp, 'gm');
let i = 0;
const result = [];
let match = regexp.exec(text);
while (match) {
const matchText = match[0];
if (match.index > i) {
result.push([text.substring(i, match.index), false]);
}
result.push([matchText, true]);
i = match.index + matchText.length;
match = regexp.exec(text);
}
if (i < text.length) {
result.push([text.substring(i, text.length), false]);
}
return result;
}
const regex = new RegExp('(?:https?://[^ ]+[^ .,])|(?:(?<!\\w)#[\\w-]+)|(?:@[A-Za-z0-9+/]+=.ed25519)|(?:[%&][A-Za-z0-9+/]+=.sha256)');
function split(textNodes) {
const text = textNodes.map((n) => n.literal).join('');
const parts = splitMatches(text, regex);
return parts.map((part) => {
if (part[1]) {
return linkNode(part[0], part[0]);
} else {
return textNode(part[0]);
}
});
}
export function transform(parsed) {
const walker = parsed.walker();
let event;
let nodes = [];
while ((event = walker.next())) {
const node = event.node;
if (event.entering && node.type === 'text') {
nodes.push(node);
} else {
if (nodes.length > 0) {
split(nodes)
.reverse()
.forEach((newNode) => {
nodes[0].insertAfter(newNode);
});
nodes.forEach((n) => n.unlink());
nodes = [];
}
}
}
if (nodes.length > 0) {
split(nodes)
.reverse()
.forEach((newNode) => {
nodes[0].insertAfter(newNode);
});
nodes.forEach((n) => n.unlink());
}
return parsed;
}

1
apps/ssb/commonmark.min.js vendored Normal file

File diff suppressed because one or more lines are too long

171
apps/ssb/emojis.js Normal file
View File

@ -0,0 +1,171 @@
import * as tfrpc from '/static/tfrpc.js';
import {html, render} from './lit-all.min.js';
import {styles} from './tf-styles.js';
let g_emojis;
function get_emojis() {
if (g_emojis) {
return Promise.resolve(g_emojis);
}
return fetch('emojis.json').then(function (result) {
g_emojis = result.json();
return g_emojis;
});
}
export async function picker(callback, anchor, author, recent) {
let json = await get_emojis();
let div = document.createElement('div');
div.id = 'emoji_picker';
div.style.color = '#000';
div.style.background = '#fff';
div.style.border = '1px solid #000';
div.style.display = 'flex';
div.style.overflow = 'scroll';
div.style.fontWeight = 'bold';
div.style.fontSize = 'xx-large';
div.style.flex = '1 1';
div.style.flexDirection = 'column';
let input = document.createElement('input');
input.type = 'text';
input.style.display = 'block';
input.style.boxSizing = 'border-box';
input.style.width = '100%';
input.style.margin = '0';
input.style.position = 'relative';
div.appendChild(input);
let list = document.createElement('div');
list.style.overflow = 'scroll';
div.appendChild(list);
div.addEventListener('mousedown', function (event) {
event.stopPropagation();
});
function key_down(event) {
if (event.key == 'Escape') {
cleanup();
}
}
function chosen(event) {
console.log(event.srcElement.innerText);
callback(event.srcElement.innerText);
cleanup();
}
function refresh() {
while (list.firstChild) {
list.removeChild(list.firstChild);
}
let search = input.value.toLowerCase();
let any_at_all = false;
if (recent) {
let emoji_to_name = {};
for (let row of Object.values(json)) {
for (let entry of Object.entries(row)) {
emoji_to_name[entry[1]] = entry[0];
}
}
let header = document.createElement('div');
header.appendChild(document.createTextNode('Recent'));
list.appendChild(header);
let any = false;
for (let entry of recent) {
if (
search &&
search.length &&
(emoji_to_name[entry] || '').toLowerCase().indexOf(search) == -1
) {
continue;
}
let emoji = document.createElement('span');
const k_size = '1.25em';
emoji.style.display = 'inline-block';
emoji.style.overflow = 'hidden';
emoji.style.cursor = 'pointer';
emoji.onclick = chosen;
emoji.title = emoji_to_name[entry] || entry;
emoji.appendChild(document.createTextNode(entry));
list.appendChild(emoji);
any = true;
}
if (!any) {
list.removeChild(header);
}
}
for (let row of Object.entries(json)) {
let header = document.createElement('div');
header.appendChild(document.createTextNode(row[0]));
list.appendChild(header);
let any = false;
for (let entry of Object.entries(row[1])) {
if (
search &&
search.length &&
entry[0].toLowerCase().indexOf(search) == -1
) {
continue;
}
let emoji = document.createElement('span');
const k_size = '1.25em';
emoji.style.display = 'inline-block';
emoji.style.overflow = 'hidden';
emoji.style.cursor = 'pointer';
emoji.onclick = chosen;
emoji.title = entry[0];
emoji.appendChild(document.createTextNode(entry[1]));
list.appendChild(emoji);
any = true;
any_at_all = true;
}
if (!any) {
list.removeChild(header);
}
}
if (!any_at_all) {
list.appendChild(document.createTextNode('No matches found.'));
}
}
refresh();
input.oninput = refresh;
let parent = document.createElement('div');
function cleanup() {
parent.parentElement.removeChild(parent);
window.removeEventListener('keydown', key_down);
document.body.removeEventListener('mousedown', cleanup);
}
let modal = html`
<style>
${styles}
</style>
<div
class="w3-modal"
style="display: block; box-sizing: border-box; z-index: 10"
>
<div class="w3-modal-content w3-card-4">
<div
class="w3-content w3-theme-d1"
style="display: flex; flex-direction: column; max-height: 80vh"
>
<header class="w3-container" style="flex: 0 0">
<h1>Choose a Reaction</h1>
<span class="w3-button w3-display-topright" @click=${cleanup}
>&times;</span
>
</header>
${div}
<footer class="w3-container w3-padding" style="flex: 0 0">
<button class="w3-button" @click=${cleanup}>Close</button>
</footer>
</div>
</div>
</div>
`;
document.body.appendChild(parent);
render(modal, parent);
input.focus();
document.body.addEventListener('mousedown', cleanup);
window.addEventListener('keydown', key_down);
}

1
apps/ssb/emojis.json Normal file

File diff suppressed because one or more lines are too long

3
apps/ssb/filesaver.min.js vendored Normal file
View File

@ -0,0 +1,3 @@
(function(a,b){if("function"==typeof define&&define.amd)define([],b);else if("undefined"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){"use strict";function b(a,b){return"undefined"==typeof b?b={autoBom:!1}:"object"!=typeof b&&(console.warn("Deprecated: Expected third argument to be a object"),b={autoBom:!b}),b.autoBom&&/^\s*(?:text\/\S*|application\/xml|\S*\/\S*\+xml)\s*;.*charset\s*=\s*utf-8/i.test(a.type)?new Blob(["\uFEFF",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open("GET",a),d.responseType="blob",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error("could not download file")},d.send()}function d(a){var b=new XMLHttpRequest;b.open("HEAD",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent("click"))}catch(c){var b=document.createEvent("MouseEvents");b.initMouseEvent("click",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f="object"==typeof window&&window.window===window?window:"object"==typeof self&&self.self===self?self:"object"==typeof global&&global.global===global?global:void 0,a=/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||("object"!=typeof window||window!==f?function(){}:"download"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement("a");g=g||b.name||"download",j.download=g,j.rel="noopener","string"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target="_blank")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:"msSaveOrOpenBlob"in navigator?function(f,g,h){if(g=g||f.name||"download","string"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement("a");i.href=f,i.target="_blank",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open("","_blank"),g&&(g.document.title=g.document.body.innerText="downloading..."),"string"==typeof b)return c(b,d,e);var h="application/octet-stream"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\/[\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&"undefined"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,"data:attachment/file;"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,"undefined"!=typeof module&&(module.exports=g)});
//# sourceMappingURL=FileSaver.min.js.map

File diff suppressed because one or more lines are too long

24
apps/ssb/index.html Normal file
View File

@ -0,0 +1,24 @@
<!doctype html>
<html>
<head>
<title>Tilde Friends</title>
<base target="_top" />
<link rel="stylesheet" href="tribute.css" />
<style>
.tribute-container {
color: #000;
}
</style>
</head>
<body style="margin: 0; padding: 0">
<tf-app></tf-app>
<tf-reactions-modal id="reactions_modal"></tf-reactions-modal>
<script>
window.litDisableBundleWarning = true;
</script>
<script src="filesaver.min.js"></script>
<script src="commonmark.min.js"></script>
<script src="commonmark-hashtag.js" type="module"></script>
<script src="script.js" type="module"></script>
</body>
</html>

120
apps/ssb/lit-all.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

23
apps/ssb/script.js Normal file
View File

@ -0,0 +1,23 @@
import {LitElement, html} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
import * as tf_app from './tf-app.js';
import * as tf_message from './tf-message.js';
import * as tf_user from './tf-user.js';
import * as tf_compose from './tf-compose.js';
import * as tf_news from './tf-news.js';
import * as tf_profile from './tf-profile.js';
import * as tf_reactions_modal from './tf-reactions-modal.js';
import * as tf_tab_news from './tf-tab-news.js';
import * as tf_tab_news_feed from './tf-tab-news-feed.js';
import * as tf_tab_search from './tf-tab-search.js';
import * as tf_tab_connections from './tf-tab-connections.js';
import * as tf_tab_query from './tf-tab-query.js';
import * as tf_tag from './tf-tag.js';
import * as tf_styles from './tf-styles.js';
window.addEventListener('load', function () {
let style = document.createElement('style');
style.innerText = tf_styles.styles;
document.body.appendChild(style);
});

691
apps/ssb/tf-app.js Normal file
View File

@ -0,0 +1,691 @@
import {LitElement, html, css, guard, until} from './lit-all.min.js';
import * as tfrpc from '/static/tfrpc.js';
import {styles} from './tf-styles.js';
class TfElement extends LitElement {
static get properties() {
return {
whoami: {type: String},
hash: {type: String},
tab: {type: String},
broadcasts: {type: Array},
connections: {type: Array},
loading: {type: Boolean},
loading_about: {type: Number},
loaded: {type: Boolean},
following: {type: Array},
users: {type: Object},
ids: {type: Array},
channels: {type: Array},
channels_unread: {type: Object},
channels_latest: {type: Object},
guest: {type: Boolean},
url: {type: String},
private_messages: {type: Array},
recent_reactions: {type: Array},
};
}
static styles = styles;
constructor() {
super();
let self = this;
this.hash = '#';
this.tab = 'news';
this.broadcasts = [];
this.connections = [];
this.following = [];
this.users = {};
this.loaded = false;
this.loading_about = 0;
this.channels = [];
this.channels_unread = {};
this.channels_latest = {};
this.loading_latest = 0;
this.loading_latest_scheduled = 0;
this.recent_reactions = [];
tfrpc.rpc.getBroadcasts().then((b) => {
self.broadcasts = b || [];
});
tfrpc.rpc.getConnections().then((c) => {
self.connections = c || [];
});
tfrpc.rpc.getHash().then((hash) => self.set_hash(hash));
tfrpc.register(function hashChanged(hash) {
self.set_hash(hash);
});
tfrpc.register(async function notifyNewMessage(id) {
await self.fetch_new_message(id);
});
tfrpc.register(function set(name, value) {
if (name === 'broadcasts') {
self.broadcasts = value;
} else if (name === 'connections') {
self.connections = value;
} else if (name === 'identity') {
self.whoami = value;
}
});
this.initial_load();
}
async initial_load() {
let whoami = await tfrpc.rpc.getActiveIdentity();
let ids = (await tfrpc.rpc.getIdentities()) || [];
this.url = await tfrpc.rpc.url();
this.whoami = whoami ?? (ids.length ? ids[0] : undefined);
this.guest = !this.whoami?.length;
this.ids = ids;
await this.load_channels();
}
async load_channels() {
let channels = await tfrpc.rpc.query(
`
SELECT
content ->> 'channel' AS channel,
content ->> 'subscribed' AS subscribed
FROM
messages
WHERE
author = ? AND
content ->> 'type' = 'channel'
ORDER BY sequence
`,
[this.whoami]
);
let channel_map = {};
for (let row of channels) {
if (row.subscribed) {
channel_map[row.channel] = true;
} else {
delete channel_map[row.channel];
}
}
this.channels = Object.keys(channel_map).sort();
}
connectedCallback() {
super.connectedCallback();
this._keydown = this.keydown.bind(this);
window.addEventListener('keydown', this._keydown);
}
disconnectedCallback() {
super.disconnectedCallback();
window.removeEventListener('keydown', this._keydown);
}
keydown(event) {
if (event.altKey && event.key == 'ArrowUp') {
this.next_channel(-1);
event.preventDefault();
} else if (event.altKey && event.key == 'ArrowDown') {
this.next_channel(1);
event.preventDefault();
}
}
next_channel(delta) {
let channel_names = ['', '@', '🔐', ...this.channels.map((x) => '#' + x)];
let index = channel_names.indexOf(this.hash.substring(1));
index = index != -1 ? index + delta : 0;
tfrpc.rpc.setHash(
'#' +
encodeURIComponent(
channel_names[(index + channel_names.length) % channel_names.length]
)
);
}
set_hash(hash) {
this.hash = decodeURIComponent(hash || '#');
if (this.hash.startsWith('#q=')) {
this.tab = 'search';
} else if (this.hash === '#connections') {
this.tab = 'connections';
} else if (this.hash.startsWith('#sql=')) {
this.tab = 'query';
} else {
this.tab = 'news';
}
}
async fetch_about(following, users) {
this.loading_about++;
let ids = Object.keys(following).sort();
const k_cache_version = 3;
let cache = await tfrpc.rpc.databaseGet('about');
let original_cache = cache;
cache = cache ? JSON.parse(cache) : {};
if (cache.version !== k_cache_version) {
cache = {
version: k_cache_version,
about: {},
};
}
let ids_out_of_date = ids.filter(
(x) =>
(users[x]?.seq && !cache.about[x]?.seq) ||
(users[x]?.seq && users[x]?.seq > cache.about[x].seq)
);
for (let id of Object.keys(cache.about)) {
if (ids.indexOf(id) == -1) {
delete cache.about[id];
} else {
users[id] = Object.assign(cache.about[id], users[id] || {});
}
}
console.log(
'loading about for',
ids.length,
'accounts',
ids_out_of_date.length,
'out of date'
);
if (ids_out_of_date.length) {
try {
let rows = await tfrpc.rpc.query(
`
SELECT all_abouts.author, json(json_group_object(all_abouts.key, all_abouts.value)) AS about
FROM (
SELECT
messages.author,
fields.key,
RANK() OVER (PARTITION BY messages.author, fields.key ORDER BY messages.sequence DESC) AS rank,
fields.value
FROM messages JOIN json_each(messages.content) AS fields
WHERE
messages.content ->> '$.type' = 'about' AND
messages.content ->> '$.about' = messages.author AND
NOT fields.key IN ('about', 'type')) all_abouts
JOIN json_each(?) AS following ON all_abouts.author = following.value
WHERE rank = 1
GROUP BY all_abouts.author
`,
[JSON.stringify(ids_out_of_date)]
);
users = users || {};
for (let row of rows) {
users[row.author] = Object.assign(
users[row.author] || {},
JSON.parse(row.about)
);
cache.about[row.author] = Object.assign(
{seq: users[row.author].seq},
JSON.parse(row.about)
);
}
} catch (e) {
console.log(e);
}
}
for (let id of ids_out_of_date) {
if (!cache.about[id]?.seq) {
cache.about[id] = Object.assign(cache.about[id] ?? {}, {
seq: users[id]?.seq ?? 0,
});
}
}
this.loading_about--;
let new_cache = JSON.stringify(cache);
if (new_cache != original_cache) {
let start_time = new Date();
tfrpc.rpc.databaseSet('about', new_cache).then(function () {
console.log('saving about took', (new Date() - start_time) / 1000);
});
}
return Object.assign({}, users);
}
async fetch_new_message(id) {
let messages = await tfrpc.rpc.query(
`
SELECT messages.id, previous, author, sequence, timestamp, hash, json(content) AS content, signature
FROM messages
JOIN json_each(?) AS following ON messages.author = following.value
WHERE messages.id = ?
`,
[JSON.stringify(this.following), id]
);
for (let message of messages) {
if (
message.author == this.whoami &&
JSON.parse(message.content)?.type == 'channel'
) {
this.load_channels();
}
}
this.schedule_load_latest();
}
async _handle_whoami_changed(event) {
let old_id = this.whoami;
let new_id = event.srcElement.selected;
console.log('received', new_id);
if (this.whoami !== new_id) {
console.log(event);
this.whoami = new_id;
console.log(`whoami ${old_id} => ${new_id}`);
await tfrpc.rpc.localStorageSet('whoami', new_id);
}
}
async get_latest_private(following) {
const k_version = 1;
// { "version": 1, "range": [1234, 5678], messages: [ "%1.sha256", "%2.sha256", ... ], latest: rowid }
let cache = JSON.parse(
(await tfrpc.rpc.databaseGet(`private:${this.whoami}`)) ?? '{}'
);
if (cache.version !== k_version) {
cache = {
version: k_version,
messages: [],
range: [],
};
}
let latest = (
await tfrpc.rpc.query('SELECT MAX(rowid) AS latest FROM messages')
)[0].latest;
let ranges = [];
const k_chunk_size = 512;
if (cache.range.length) {
for (let i = cache.range[1]; i < latest; i += k_chunk_size) {
ranges.push([i, Math.min(i + k_chunk_size, latest), true]);
}
for (let i = cache.range[0]; i >= 0; i -= k_chunk_size) {
ranges.push([
Math.max(i - k_chunk_size, 0),
Math.min(cache.range[0], i + k_chunk_size),
false,
]);
}
} else {
for (let i = 0; i < latest; i += k_chunk_size) {
ranges.push([i, Math.min(i + k_chunk_size, latest), true]);
}
}
for (let range of ranges) {
let messages = await tfrpc.rpc.query(
`
SELECT messages.rowid, messages.id, json(content) AS content
FROM messages
WHERE
messages.rowid > ?1 AND
messages.rowid <= ?2 AND
json(messages.content) LIKE '"%'
ORDER BY sequence DESC
`,
[range[0], range[1]]
);
messages = (await this.decrypt(messages)).filter((x) => x.decrypted);
if (messages.length) {
cache.latest = Math.max(
cache.latest ?? 0,
...messages.map((x) => x.rowid)
);
if (range[2]) {
cache.messages = [...cache.messages, ...messages.map((x) => x.id)];
} else {
cache.messages = [...messages.map((x) => x.id), ...cache.messages];
}
}
cache.range[0] = Math.min(cache.range[0] ?? range[0], range[0]);
cache.range[1] = Math.max(cache.range[1] ?? range[1], range[1]);
await tfrpc.rpc.databaseSet(
`private:${this.whoami}`,
JSON.stringify(cache)
);
}
return [cache.latest, cache.messages];
}
async load_channels_latest(following) {
let start_time = new Date();
let latest_private = this.get_latest_private(following);
let channels = await tfrpc.rpc.query(
`
SELECT channels.value AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN json_each(?1) AS channels ON messages.content ->> 'channel' = channels.value
JOIN json_each(?2) AS following ON messages.author = following.value
WHERE
messages.content ->> 'type' = 'post' AND
messages.content ->> 'root' IS NULL AND
messages.author != ?4
GROUP by channel
UNION
SELECT '' AS channel, MAX(messages.rowid) AS rowid FROM messages
JOIN json_each(?2) AS following ON messages.author = following.value
WHERE
messages.content ->> 'type' = 'post' AND
messages.content ->> 'root' IS NULL AND
messages.author != ?4
UNION
SELECT '@' AS channel, MAX(messages.rowid) AS rowid FROM messages_fts(?3)
JOIN messages ON messages.rowid = messages_fts.rowid
JOIN json_each(?2) AS following ON messages.author = following.value
WHERE messages.author != ?4
`,
[
JSON.stringify(this.channels),
JSON.stringify(following),
'"' + this.whoami.replace('"', '""') + '"',
this.whoami,
]
);
this.channels_latest = Object.fromEntries(
channels.map((x) => [x.channel, x.rowid])
);
console.log('channels took', (new Date() - start_time) / 1000.0);
let self = this;
start_time = new Date();
latest_private.then(function (latest) {
self.channels_latest = Object.assign({}, self.channels_latest, {
'🔐': latest[0],
});
console.log('private took', (new Date() - start_time) / 1000.0);
self.private_messages = latest[1];
});
}
_schedule_load_latest_timer() {
--this.loading_latest_scheduled;
this.schedule_load_latest();
}
schedule_load_latest() {
if (!this.loading_latest) {
this.shadowRoot.getElementById('tf-tab-news')?.load_latest();
this.load();
} else if (!this.loading_latest_scheduled) {
this.loading_latest_scheduled++;
setTimeout(this._schedule_load_latest_timer.bind(this), 5000);
}
}
async fetch_user_info(users) {
let info = await tfrpc.rpc.query(
`
SELECT messages_stats.author, messages_stats.max_sequence, messages_stats.max_timestamp AS max_ts FROM messages_stats
JOIN json_each(?) AS following
ON messages_stats.author = following.value
`,
[JSON.stringify(Object.keys(users))]
);
for (let row of info) {
users[row.author] = Object.assign(users[row.author], {
seq: row.max_sequence,
ts: row.max_ts,
});
}
return users;
}
async load_recent_reactions() {
this.recent_reactions = (
await tfrpc.rpc.query(
`
SELECT DISTINCT content ->> '$.vote.expression' AS value
FROM messages
WHERE author = ? AND
content ->> '$.type' = 'vote'
ORDER BY timestamp DESC LIMIT 10
`,
[this.whoami]
)
).map((x) => x.value);
}
async load() {
this.loading_latest = true;
try {
let start_time = new Date();
let whoami = this.whoami;
let following = await tfrpc.rpc.following([whoami], 2);
let old_users = this.users ?? {};
let users = {};
let by_count = [];
for (let [id, v] of Object.entries(following)) {
users[id] = Object.assign(
{
following: v.of,
blocking: v.ob,
followed: v.if,
blocked: v.ib,
follow_depth: following[id]?.d,
},
old_users[id]
);
by_count.push({count: v.of, id: id});
}
let reactions = this.load_recent_reactions();
this.load_channels_latest(Object.keys(following));
this.channels_unread = JSON.parse(
(await tfrpc.rpc.databaseGet('unread')) ?? '{}'
);
this.following = Object.keys(following);
let about_start_time = new Date();
start_time = new Date();
users = await this.fetch_user_info(users);
console.log(
'user info took',
(new Date() - start_time) / 1000.0,
'seconds'
);
this.users = users;
let self = this;
this.fetch_about(following, users).then(function (result) {
self.users = result;
console.log(
'about took',
(new Date() - about_start_time) / 1000.0,
'seconds for',
Object.keys(users).length,
'users'
);
});
console.log(
`load finished ${whoami} => ${this.whoami} in ${(new Date() - start_time) / 1000}`
);
await reactions;
this.whoami = whoami;
this.loaded = whoami;
} finally {
this.loading_latest = false;
}
}
channel_set_unread(event) {
this.channels_unread[event.detail.channel ?? ''] = event.detail.unread;
this.channels_unread = Object.assign({}, this.channels_unread);
tfrpc.rpc.databaseSet('unread', JSON.stringify(this.channels_unread));
}
async decrypt(messages) {
let whoami = this.whoami;
return Promise.all(
messages.map(async function (message) {
let content;
try {
content = JSON.parse(message?.content);
} catch {}
if (typeof content === 'string') {
let decrypted;
try {
decrypted = await tfrpc.rpc.try_decrypt(whoami, content);
} catch {}
if (decrypted) {
try {
message.decrypted = JSON.parse(decrypted);
} catch {
message.decrypted = decrypted;
}
}
}
return message;
})
);
}
render_tab() {
let following = this.following;
let users = this.users;
if (this.tab === 'news') {
return html`
<tf-tab-news
id="tf-tab-news"
.following=${this.following}
whoami=${this.whoami}
.users=${this.users}
hash=${this.hash}
?loading=${this.loading || this.loading_about != 0}
.channels=${this.channels}
.channels_latest=${this.channels_latest}
.channels_unread=${this.channels_unread}
@channelsetunread=${this.channel_set_unread}
.connections=${this.connections}
.private_messages=${this.private_messages}
.recent_reactions=${this.recent_reactions}
></tf-tab-news>
`;
} else if (this.tab === 'connections') {
return html`
<tf-tab-connections
.users=${this.users}
.connections=${this.connections}
.broadcasts=${this.broadcasts}
></tf-tab-connections>
`;
} else if (this.tab === 'search') {
return html`
<tf-tab-search
.following=${this.following}
whoami=${this.whoami}
.users=${this.users}
query=${this.hash?.startsWith('#q=')
? decodeURIComponent(this.hash.substring(3))
: null}
></tf-tab-search>
`;
} else if (this.tab === 'query') {
return html`
<tf-tab-query
.following=${this.following}
whoami=${this.whoami}
.users=${this.users}
query=${this.hash?.startsWith('#sql=')
? decodeURIComponent(this.hash.substring(5))
: null}
></tf-tab-query>
`;
}
}
async set_tab(tab) {
this.tab = tab;
if (tab === 'news') {
await tfrpc.rpc.setHash('#');
} else if (tab === 'connections') {
await tfrpc.rpc.setHash('#connections');
} else if (tab === 'query') {
await tfrpc.rpc.setHash('#sql=');
}
}
refresh() {
tfrpc.rpc.sync();
}
render() {
let self = this;
if (!this.loading && this.whoami && this.loaded !== this.whoami) {
this.loading = true;
this.load().finally(function () {
self.loading = false;
});
}
const k_tabs = {
'📰': 'news',
'📡': 'connections',
'🔍': 'search',
'👩‍💻': 'query',
};
let tabs = html`
<div
class="w3-bar w3-theme-l1"
style="position: static; top: 0; z-index: 10"
>
<button
class=${'w3-bar-item w3-button w3-circle w3-ripple' +
(this.connections?.some((x) => x.flags.one_shot) ? ' w3-spin' : '')}
style="width: 1.5em; height: 1.5em; padding: 8px"
@click=${this.refresh}
>
</button>
${Object.entries(k_tabs).map(
([k, v]) => html`
<button
title=${v}
class="w3-bar-item w3-padding w3-hover-theme tab ${self.tab == v
? 'w3-theme-l2'
: 'w3-theme-l1'}"
@click=${() => self.set_tab(v)}
>
${k}
<span class=${self.tab == v ? '' : 'w3-hide-small'}
>${v.charAt(0).toUpperCase() + v.substring(1)}</span
>
</button>
`
)}
</div>
`;
let contents = this.guest
? html`<div
class="w3-display-middle w3-panel w3-theme-l5 w3-card-4 w3-padding-large w3-round-xlarge w3-xlarge w3-container"
>
<p>⚠️🦀 Must be logged in to Tilde Friends to scuttle here. 🦀⚠️</p>
<footer class="w3-center">
<a
class="w3-button w3-theme-d1"
href=${`/login?return=${encodeURIComponent(this.url)}`}
>Login</a
>
</footer>
</div>`
: !this.loaded || this.loading
? html`<div
class="w3-display-middle w3-panel w3-theme-l5 w3-card-4 w3-padding-large w3-round-xlarge w3-xlarge"
>
<span class="w3-spin" style="display: inline-block">🦀</span>
Loading...
</div>`
: this.render_tab();
return html`
<div
style="width: 100vw; min-height: 100vh; height: 100vh; display: flex; flex-direction: column"
class="w3-theme-dark"
>
<div style="flex: 0 0">${tabs}</div>
<div style="flex: 1 1; overflow: auto; contain: layout">
${contents}
</div>
</div>
`;
}
}
customElements.define('tf-app', TfElement);

631
apps/ssb/tf-compose.js Normal file
View File

@ -0,0 +1,631 @@
import {LitElement, html, unsafeHTML, live} from './lit-all.min.js';
import * as tfutils from './tf-utils.js';
import * as tfrpc from '/static/tfrpc.js';
import {styles} from './tf-styles.js';
import Tribute from './tribute.esm.js';
class TfComposeElement extends LitElement {
static get properties() {
return {
whoami: {type: String},
users: {type: Object},
root: {type: String},
branch: {type: String},
apps: {type: Object},
drafts: {type: Object},
author: {type: String},
channel: {type: String},
new_thread: {type: Boolean},
};
}
static styles = styles;
constructor() {
super();
this.users = {};
this.root = undefined;
this.branch = undefined;
this.apps = undefined;
this.drafts = {};
this.author = undefined;
this.new_thread = false;
}
process_text(text) {
if (!text) {
return '';
}
/* Update mentions. */
let draft = this.get_draft();
let updated = false;
for (let match of text.matchAll(/\[([^\[]+)]\(([@&%][^\)]+)/g)) {
let name = match[1];
let link = match[2];
let balance = 0;
let bracket_end = match.index + match[1].length + '[]'.length - 1;
for (let i = bracket_end; i >= 0; i--) {
if (text.charAt(i) == ']') {
balance++;
} else if (text.charAt(i) == '[') {
balance--;
}
if (balance <= 0) {
name = text.substring(i + 1, bracket_end);
break;
}
}
if (!draft.mentions) {
draft.mentions = {};
}
if (!draft.mentions[link]) {
draft.mentions[link] = {
link: link,
};
}
draft.mentions[link].name = name.startsWith('@')
? name.substring(1)
: name;
updated = true;
}
if (updated) {
setTimeout(() => this.notify(draft), 0);
}
return tfutils.markdown(text);
}
input(event) {
let edit = this.renderRoot.getElementById('edit');
let preview = this.renderRoot.getElementById('preview');
preview.innerHTML = this.process_text(edit.innerText);
let content_warning = this.renderRoot.getElementById('content_warning');
let draft = this.get_draft();
draft.text = edit.innerText;
draft.content_warning = content_warning?.value;
setTimeout(() => this.notify(draft), 0);
}
notify(draft) {
this.dispatchEvent(
new CustomEvent('tf-draft', {
bubbles: true,
composed: true,
detail: {
id: this.branch,
draft: draft,
},
})
);
}
convert_to_format(buffer, type, mime_type) {
return new Promise(function (resolve, reject) {
let img = new Image();
img.onload = function () {
let canvas = document.createElement('canvas');
let width_scale = Math.min(img.width, 1024) / img.width;
let height_scale = Math.min(img.height, 1024) / img.height;
let scale = Math.min(width_scale, height_scale);
canvas.width = img.width * scale;
canvas.height = img.height * scale;
let context = canvas.getContext('2d');
context.drawImage(img, 0, 0, canvas.width, canvas.height);
let data_url = canvas.toDataURL(mime_type);
let result = atob(data_url.split(',')[1])
.split('')
.map((x) => x.charCodeAt(0));
resolve(result);
};
img.onerror = function (event) {
reject(new Error('Failed to load image.'));
};
let raw = Array.from(new Uint8Array(buffer))
.map((b) => String.fromCharCode(b))
.join('');
let original = `data:${type};base64,${btoa(raw)}`;
img.src = original;
});
}
async add_file(file) {
try {
let draft = this.get_draft();
let self = this;
let buffer = await file.arrayBuffer();
let type = file.type;
if (type.startsWith('image/')) {
let best_buffer;
let best_type;
for (let format of ['image/png', 'image/jpeg', 'image/webp']) {
let test_buffer = await self.convert_to_format(
buffer,
file.type,
format
);
if (!best_buffer || test_buffer.length < best_buffer.length) {
best_buffer = test_buffer;
best_type = format;
}
}
buffer = best_buffer;
type = best_type;
} else {
buffer = Array.from(new Uint8Array(buffer));
}
let id = await tfrpc.rpc.store_blob(buffer);
let name = type.split('/')[0] + ':' + file.name;
if (!draft.mentions) {
draft.mentions = {};
}
draft.mentions[id] = {
link: id,
name: name,
type: type,
size: buffer.length ?? buffer.byteLength,
};
let edit = self.renderRoot.getElementById('edit');
edit.innerText += `\n![${name}](${id})`;
self.input();
} catch (e) {
alert(e?.message);
}
}
paste(event) {
let self = this;
for (let item of event.clipboardData.items) {
if (item.type?.startsWith('image/')) {
let file = item.getAsFile();
if (!file) {
continue;
}
self.add_file(file);
break;
}
}
event.preventDefault();
document.execCommand(
'insertText',
false,
event.clipboardData.getData('text/plain')
);
}
async submit() {
let self = this;
let draft = this.get_draft();
let edit = this.renderRoot.getElementById('edit');
let message = {
type: 'post',
text: edit.innerText,
channel: this.channel,
};
if (this.root || this.branch) {
message.root = this.new_thread ? (this.branch ?? this.root) : this.root;
message.branch = this.branch;
}
let reply = Object.fromEntries(
(
await tfrpc.rpc.query(
`
SELECT messages.id, messages.author FROM messages
JOIN json_each(?) AS refs ON messages.id = refs.value
`,
[JSON.stringify([this.root, this.branch])]
)
).map((row) => [row.id, row.author])
);
if (Object.keys(reply).length) {
message.reply = reply;
}
if (Object.values(draft.mentions || {}).length) {
message.mentions = Object.values(draft.mentions);
}
if (draft.content_warning !== undefined) {
message.contentWarning = draft.content_warning;
}
console.log('Would post:', message);
if (draft.encrypt_to) {
let to = new Set(draft.encrypt_to);
to.add(this.whoami);
to = [...to];
message.recps = to;
console.log('message is now', message);
message = await tfrpc.rpc.encrypt(
this.whoami,
to,
JSON.stringify(message)
);
console.log('encrypted as', message);
}
try {
await tfrpc.rpc.appendMessage(this.whoami, message);
self.notify(undefined);
} catch (error) {
alert(error.message);
}
}
discard() {
this.notify(undefined);
}
attach() {
let self = this;
let input = document.createElement('input');
input.type = 'file';
input.addEventListener('change', function (event) {
input.parentNode.removeChild(input);
let file = event.target.files[0];
self.add_file(file);
});
document.body.appendChild(input);
input.click();
}
async autocomplete(text, callback) {
this.last_autocomplete = text;
let results = [];
try {
let rows = await tfrpc.rpc.query(
`
SELECT json(messages.content) AS content FROM messages_fts(?)
JOIN messages ON messages.rowid = messages_fts.rowid
WHERE json(messages.content) LIKE ?
ORDER BY timestamp DESC LIMIT 10
`,
['"' + text.replace('"', '""') + '"', `%![%${text}%](%)%`]
);
for (let row of rows) {
for (let match of row.content.matchAll(/!\[([^\]]*)\]\((&.*?)\)/g)) {
if (match[1].toLowerCase().indexOf(text.toLowerCase()) != -1) {
results.push({key: match[1], value: match[2]});
}
}
}
} finally {
if (this.last_autocomplete === text) {
callback(results);
}
}
}
firstUpdated() {
let values = Object.entries(this.users).map((x) => ({
key: x[1].name ?? x[0],
value: x[0],
}));
if (this.author) {
values = [].concat(
[
{
key: this.users[this.author]?.name,
value: this.author,
},
],
values
);
}
let tribute = new Tribute({
iframe: this.shadowRoot,
collection: [
{
values: values,
selectTemplate: function (item) {
return item
? `[@${item.original.key}](${item.original.value})`
: undefined;
},
},
{
trigger: '&',
values: this.autocomplete,
selectTemplate: function (item) {
return item
? `![${item.original.key}](${item.original.value})`
: undefined;
},
},
],
});
tribute.attach(this.renderRoot.getElementById('edit'));
}
updated() {
super.updated();
let edit = this.renderRoot.getElementById('edit');
if (this.last_updated_text !== edit.innerText) {
let preview = this.renderRoot.getElementById('preview');
preview.innerHTML = this.process_text(edit.innerText);
this.last_updated_text = edit.innerText;
}
let encrypt = this.renderRoot.getElementById('encrypt_to');
if (encrypt) {
let tribute = new Tribute({
iframe: this.shadowRoot,
values: Object.entries(this.users).map((x) => ({
key: x[1].name,
value: x[0],
})),
selectTemplate: function (item) {
return item.original.value;
},
});
tribute.attach(encrypt);
}
}
remove_mention(id) {
let draft = this.get_draft();
delete draft.mentions[id];
setTimeout(() => this.notify(draft), 0);
}
render_mention(mention) {
let self = this;
return html` <div style="display: flex; flex-direction: row">
<div style="align-self: center; margin: 0.5em">
<button
class="w3-button w3-theme-d1"
title="Remove ${mention.name} mention"
@click=${() => self.remove_mention(mention.link)}
>
🚮
</button>
</div>
<div style="display: flex; flex-direction: column">
<h3>${mention.name}</h3>
<div style="padding-left: 1em">
${Object.entries(mention)
.filter((x) => x[0] != 'name')
.map(
(x) =>
html`<div>
<span style="font-weight: bold">${x[0]}</span>: ${x[1]}
</div>`
)}
</div>
</div>
</div>`;
}
render_attach_app() {
let self = this;
async function attach_selected_app() {
let name = self.renderRoot.getElementById('select').value;
let id = self.apps[name];
let mentions = {};
mentions[id] = {
name: name,
link: id,
type: 'application/tildefriends',
};
if (name && id) {
let app = JSON.parse(await tfrpc.rpc.get_blob(id));
for (let entry of Object.entries(app.files)) {
mentions[entry[1]] = {
name: entry[0],
link: entry[1],
};
}
}
let draft = self.get_draft();
draft.mentions = Object.assign(draft.mentions || {}, mentions);
self.requestUpdate();
self.notify(draft);
self.apps = null;
}
if (this.apps) {
return html`
<div class="w3-card-4 w3-margin w3-padding">
<select id="select" class="w3-select w3-theme-d1">
${Object.keys(self.apps).map(
(app) => html`<option value=${app}>${app}</option>`
)}
</select>
<button class="w3-button w3-theme-d1" @click=${attach_selected_app}>
Attach
</button>
<button
class="w3-button w3-theme-d1"
@click=${() => (this.apps = null)}
>
Cancel
</button>
</div>
`;
}
}
render_attach_app_button() {
let self = this;
async function attach_app() {
self.apps = await tfrpc.rpc.apps();
}
if (!this.apps) {
return html`<button class="w3-button w3-theme-d1" @click=${attach_app}>
Attach App
</button>`;
} else {
return html`<button
class="w3-button w3-theme-d1"
@click=${() => (this.apps = null)}
>
Discard App
</button>`;
}
}
set_content_warning(value) {
let draft = this.get_draft();
draft.content_warning = value;
this.notify(draft);
this.requestUpdate();
}
render_content_warning() {
let self = this;
let draft = this.get_draft();
if (draft.content_warning !== undefined) {
return html`
<div class="w3-container w3-padding">
<p>
<input type="checkbox" class="w3-check w3-theme-d1" id="cw" @change=${() => self.set_content_warning(undefined)} checked="checked"></input>
<label for="cw">CW</label>
</p>
<input type="text" class="w3-input w3-border w3-theme-d1" id="content_warning" placeholder="Enter a content warning here." @input=${self.input} value=${draft.content_warning}></input>
</div>
`;
} else {
return html`
<input type="checkbox" class="w3-check w3-theme-d1" id="cw" @change=${() => self.set_content_warning('')}></input>
<label for="cw">CW</label>
`;
}
}
render_new_thread() {
let self = this;
if (
this.root !== undefined &&
this.branch !== undefined &&
this.root != this.branch
) {
return html`
<input type="checkbox" class="w3-check w3-theme-d1" id="new_thread" @change=${() => (self.new_thread = !self.new_thread)} ?checked=${self.new_thread}></input>
<label for="new_thread">New Thread</label>
`;
}
}
get_draft() {
return this.drafts[this.branch || ''] || {};
}
update_encrypt(event) {
let input = event.srcElement;
let matches = input.value.match(/@.*?\.ed25519/g);
if (matches) {
let draft = this.get_draft();
let to = [...new Set(matches.concat(draft.encrypt_to))];
this.set_encrypt(to);
input.value = '';
}
}
render_encrypt() {
let draft = this.get_draft();
if (draft.encrypt_to === undefined) {
return;
}
return html`
<div style="display: flex; flex-direction: row; width: 100%">
<label for="encrypt_to">🔐 To:</label>
<input type="text" id="encrypt_to" class="w3-input w3-theme-d1 w3-border" style="display: flex; flex: 1 1" @input=${this.update_encrypt}></input>
<button class="w3-button w3-theme-d1" @click=${() => this.set_encrypt(undefined)}>🚮</button>
</div>
<ul>
${draft.encrypt_to.map(
(x) => html`
<li>
<tf-user id=${x} .users=${this.users}></tf-user>
<input type="button" class="w3-button w3-theme-d1" value="🚮" @click=${() => this.set_encrypt(draft.encrypt_to.filter((id) => id != x))}></input>
</li>`
)}
</ul>
`;
}
set_encrypt(encrypt) {
let draft = this.get_draft();
draft.encrypt_to = encrypt;
this.notify(draft);
this.requestUpdate();
}
render() {
let self = this;
let draft = self.get_draft();
let content_warning =
draft.content_warning !== undefined
? html`<div class="w3-panel w3-round-xlarge w3-theme-d2">
<p id="content_warning_preview">${draft.content_warning}</p>
</div>`
: undefined;
let encrypt =
draft.encrypt_to !== undefined
? undefined
: html`<button
class="w3-button w3-theme-d1"
@click=${() => this.set_encrypt([])}
>
🔐
</button>`;
let result = html`
<style>
.w3-input:empty::before {
content: attr(placeholder);
}
.w3-input:empty:focus::before {
content: '';
}
</style>
<div
class="w3-card-4 w3-theme-d4 w3-padding w3-margin-top w3-margin-bottom"
style="box-sizing: border-box"
>
<header class="w3-container">
${this.channel !== undefined
? html`<p>To #${this.channel}:</p>`
: undefined}
${this.render_encrypt()}
</header>
<div class="w3-container w3-padding-small">
<div class="w3-half">
<span
class="w3-input w3-theme-d1 w3-border"
style="resize: vertical; width: 100%; overflow: hidden; white-space: pre-wrap"
placeholder="Write a post here."
id="edit"
@input=${this.input}
@paste=${this.paste}
contenteditable="plaintext-only"
.innerText=${live(draft.text ?? '')}
></span>
</div>
<div class="w3-half w3-container">
${content_warning}
<p id="preview"></p>
</div>
</div>
${Object.values(draft.mentions || {}).map((x) =>
self.render_mention(x)
)}
<footer class="w3-container">
${this.render_attach_app()} ${this.render_content_warning()}
${this.render_new_thread()}
<button
class="w3-button w3-theme-d1"
id="submit"
@click=${this.submit}
>
Submit
</button>
<button class="w3-button w3-theme-d1" @click=${this.attach}>
Attach
</button>
${this.render_attach_app_button()} ${encrypt}
<button class="w3-button w3-theme-d1" @click=${this.discard}>
Discard
</button>
</footer>
</div>
`;
return result;
}
}
customElements.define('tf-compose', TfComposeElement);

Some files were not shown because too many files have changed in this diff Show More