| 
									
										
										
										
											2023-03-12 16:00:57 +01:00
										 |  |  | // GoToSocial | 
					
						
							|  |  |  | // Copyright (C) GoToSocial Authors admin@gotosocial.org | 
					
						
							|  |  |  | // SPDX-License-Identifier: AGPL-3.0-or-later | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // 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/>. | 
					
						
							| 
									
										
										
										
											2023-01-05 12:43:00 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-01 18:29:25 +02:00
										 |  |  | package stream | 
					
						
							| 
									
										
										
										
											2021-06-19 11:18:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | import "sync" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-04 15:24:19 +02:00
										 |  |  | const ( | 
					
						
							|  |  |  | 	// EventTypeNotification -- a user should be shown a notification | 
					
						
							| 
									
										
										
										
											2021-11-22 19:03:21 +01:00
										 |  |  | 	EventTypeNotification string = "notification" | 
					
						
							| 
									
										
										
										
											2021-10-04 15:24:19 +02:00
										 |  |  | 	// EventTypeUpdate -- a user should be shown an update in their timeline | 
					
						
							| 
									
										
										
										
											2021-11-22 19:03:21 +01:00
										 |  |  | 	EventTypeUpdate string = "update" | 
					
						
							| 
									
										
										
										
											2021-10-04 15:24:19 +02:00
										 |  |  | 	// EventTypeDelete -- something should be deleted from a user | 
					
						
							| 
									
										
										
										
											2021-11-22 19:03:21 +01:00
										 |  |  | 	EventTypeDelete string = "delete" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const ( | 
					
						
							|  |  |  | 	// TimelineLocal -- public statuses from the LOCAL timeline. | 
					
						
							|  |  |  | 	TimelineLocal string = "public:local" | 
					
						
							|  |  |  | 	// TimelinePublic -- public statuses, including federated ones. | 
					
						
							|  |  |  | 	TimelinePublic string = "public" | 
					
						
							|  |  |  | 	// TimelineHome -- statuses for a user's Home timeline. | 
					
						
							|  |  |  | 	TimelineHome string = "user" | 
					
						
							|  |  |  | 	// TimelineNotifications -- notification events. | 
					
						
							|  |  |  | 	TimelineNotifications string = "user:notification" | 
					
						
							|  |  |  | 	// TimelineDirect -- statuses sent to a user directly. | 
					
						
							|  |  |  | 	TimelineDirect string = "direct" | 
					
						
							| 
									
										
										
										
											2023-05-25 10:37:38 +02:00
										 |  |  | 	// TimelineList -- statuses for a user's list timeline. | 
					
						
							|  |  |  | 	TimelineList string = "list" | 
					
						
							| 
									
										
										
										
											2021-10-04 15:24:19 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-11-22 19:03:21 +01:00
										 |  |  | // AllStatusTimelines contains all Timelines that a status could conceivably be delivered to -- useful for doing deletes. | 
					
						
							|  |  |  | var AllStatusTimelines = []string{ | 
					
						
							|  |  |  | 	TimelineLocal, | 
					
						
							|  |  |  | 	TimelinePublic, | 
					
						
							|  |  |  | 	TimelineHome, | 
					
						
							|  |  |  | 	TimelineDirect, | 
					
						
							| 
									
										
										
										
											2023-05-25 10:37:38 +02:00
										 |  |  | 	TimelineList, | 
					
						
							| 
									
										
										
										
											2021-11-22 19:03:21 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-06-19 11:18:55 +02:00
										 |  |  | // StreamsForAccount is a wrapper for the multiple streams that one account can have running at the same time. | 
					
						
							|  |  |  | // TODO: put a limit on this | 
					
						
							|  |  |  | type StreamsForAccount struct { | 
					
						
							|  |  |  | 	// The currently held streams for this account | 
					
						
							|  |  |  | 	Streams []*Stream | 
					
						
							|  |  |  | 	// Mutex to lock/unlock when modifying the slice of streams. | 
					
						
							|  |  |  | 	sync.Mutex | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Stream represents one open stream for a client. | 
					
						
							|  |  |  | type Stream struct { | 
					
						
							|  |  |  | 	// ID of this stream, generated during creation. | 
					
						
							|  |  |  | 	ID string | 
					
						
							| 
									
										
										
										
											2023-05-25 10:37:38 +02:00
										 |  |  | 	// A set of types subscribed to by this stream: user/public/etc. | 
					
						
							|  |  |  | 	// It's a map to ensure no duplicates; the value is ignored. | 
					
						
							|  |  |  | 	StreamTypes map[string]any | 
					
						
							| 
									
										
										
										
											2021-06-19 11:18:55 +02:00
										 |  |  | 	// Channel of messages for the client to read from | 
					
						
							|  |  |  | 	Messages chan *Message | 
					
						
							|  |  |  | 	// Channel to close when the client drops away | 
					
						
							|  |  |  | 	Hangup chan interface{} | 
					
						
							|  |  |  | 	// Only put messages in the stream when Connected | 
					
						
							|  |  |  | 	Connected bool | 
					
						
							|  |  |  | 	// Mutex to lock/unlock when inserting messages, hanging up, changing the connected state etc. | 
					
						
							|  |  |  | 	sync.Mutex | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Message represents one streamed message. | 
					
						
							|  |  |  | type Message struct { | 
					
						
							|  |  |  | 	// All the stream types this message should be delivered to. | 
					
						
							|  |  |  | 	Stream []string `json:"stream"` | 
					
						
							|  |  |  | 	// The event type of the message (update/delete/notification etc) | 
					
						
							|  |  |  | 	Event string `json:"event"` | 
					
						
							|  |  |  | 	// The actual payload of the message. In case of an update or notification, this will be a JSON string. | 
					
						
							|  |  |  | 	Payload string `json:"payload"` | 
					
						
							|  |  |  | } |