{"id":20704175,"url":"https://github.com/solidsnack/cloudsat","last_synced_at":"2026-04-25T09:02:12.366Z","repository":{"id":3713197,"uuid":"4785117","full_name":"solidsnack/cloudsat","owner":"solidsnack","description":null,"archived":false,"fork":false,"pushed_at":"2012-05-16T00:46:11.000Z","size":142,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-05T17:08:17.125Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Ruby","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"adobe/brackets","license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/solidsnack.png","metadata":{"files":{"readme":"README","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2012-06-25T17:54:30.000Z","updated_at":"2014-05-22T13:33:00.000Z","dependencies_parsed_at":"2022-09-16T16:43:45.248Z","dependency_job_id":null,"html_url":"https://github.com/solidsnack/cloudsat","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidsnack%2Fcloudsat","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidsnack%2Fcloudsat/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidsnack%2Fcloudsat/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/solidsnack%2Fcloudsat/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/solidsnack","download_url":"https://codeload.github.com/solidsnack/cloudsat/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242973962,"owners_count":20215245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-17T01:11:17.213Z","updated_at":"2026-04-25T09:02:07.348Z","avatar_url":"https://github.com/solidsnack.png","language":"Ruby","funding_links":[],"categories":[],"sub_categories":[],"readme":"A message board for cloud communication.\n\n\nTypes \u0026 Tables\n==============\n\nA Message is a notification from some board member posted to a channel on the\nboard. Messages may be in reply to other messages; the Thread type describes\nthis relationship.\n\nThe Message type as a Postgres table:\n\n        uuid |        timestamp         | poster  |  chan   | message\n       ------+--------------------------+---------+---------+---------\n        uuid | timestamp with time zone | address | address |  text\n\nThe Thread type as a Postgres table:\n\n                         before | disposition | after\n                        --------+-------------+-------\n                          uuid  |    flag     | uuid\n\nAn Address is a simply an LDH domain name which may have an @ and a short\n\"local component\" in front of it. The Disposition flag is one of:\n\n                Ignored   Acknowledged   Problem   Info   End\n\nand is a way to indicate how a reply relates to the history of a process\nspawned as a result of receiving the message.\n\nWhen a client connects, they register subscriptions and an address as a\npre-requisite to sending messages. Their subscriptions form Registered\nrecords:\n\n                 nick   |        timestamp         |  chans\n               ---------+--------------------------+-----------\n                address | timestamp with time zone | [address]\n\nIn the implementation, registrations are tied to a client connection by\ndatabase connection metadata (in Postgres, this is procpid and backend_start\nfrom pg_stat_activity).\n\n\nOperations\n==========\n\nWe can imagine four kinds of \"users\" for the cloud message board:\n\n  * Server bots receive messages, post replies and perform tasks.\n\n  * Task bots post tasks, monitor replies and keep track of task status.\n\n  * Admin bots observe overall error rates and throughput, monitor space usage\n    and truncate tables.\n\n  * Ad hoc bots connect to peform various analytics, not relevant to the\n    operation of the board on a moment to moment basis but of interest to\n    those maintaining the cloud.\n\nFrom the roles above, we can expect that:\n\n  * SELECTs of a very general nature need to be performed from time to time.\n\n  * Deleting older messages, threads and subscriptions is necessary; but is\n    also completely formulaic. A couple stored procedures and a foreign key\n    constraint linking messages to threads is probably enough; we don't expect\n    general DELETEs to be performed at all and thus no bot needs permission to\n    do them.\n\n  * Some very specific SELECTs need to be performed over and over again. For\n    example, checking if there is, in a thread, new messages that indicate\n    completion or failure, new messages that indicate locks being taken and so\n    forth. These will eventually become stored procedures.\n\nData additions are very limited. There are no UPDATEs at all -- message/task\ncancellation is accomplished with a reply having Belay in the disposition\ncolumn, for example; and subscription cancellations involve adding an\nadditional row to the subscriptions table. The two input operations are,\nfundamentally:\n\n  * Posting a reply or a new message.\n\n  * Updating one's subscriptions.\n\nFor a server bots, maybe we only allow replies; so after establishing a\nconnection and registering a subscript, server bots need only two operations:\n\n  * reply, to form a mesasge;\n\n  * inbox, to get a VIEW of relevant messages to SELECT from.\n\nFor task bots its useful to have a `post' function to kick off a thread and a\none or many stored procedures for walking the thread to find things like all\nacknowledgments, all failed tasks, all incomplete tasks.\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolidsnack%2Fcloudsat","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsolidsnack%2Fcloudsat","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsolidsnack%2Fcloudsat/lists"}