| 
									
										
										
										
											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/>. | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | package dereferencing | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"net/url" | 
					
						
							|  |  |  | 	"sync" | 
					
						
							| 
									
										
										
										
											2024-02-09 15:24:49 +01:00
										 |  |  | 	"time" | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-24 13:27:42 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/filter/interaction" | 
					
						
							| 
									
										
										
										
											2024-03-04 12:30:12 +00:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/filter/visibility" | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/media" | 
					
						
							| 
									
										
										
										
											2023-05-12 10:15:54 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/state" | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/transport" | 
					
						
							|  |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/typeutils" | 
					
						
							| 
									
										
										
										
											2024-02-09 15:24:49 +01:00
										 |  |  | 	"github.com/superseriousbusiness/gotosocial/internal/util" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // FreshnessWindow represents a duration in which a | 
					
						
							|  |  |  | // Status or Account is still considered to be "fresh" | 
					
						
							|  |  |  | // (ie., not in need of a refresh from remote), if its | 
					
						
							|  |  |  | // last FetchedAt value falls within the window. | 
					
						
							|  |  |  | // | 
					
						
							|  |  |  | // For example, if an Account was FetchedAt 09:00, and it | 
					
						
							|  |  |  | // is now 12:00, then it would be considered "fresh" | 
					
						
							|  |  |  | // according to DefaultAccountFreshness, but not according | 
					
						
							|  |  |  | // to Fresh, which would indicate that the Account requires | 
					
						
							|  |  |  | // refreshing from remote. | 
					
						
							|  |  |  | type FreshnessWindow time.Duration | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	// 6 hours. | 
					
						
							|  |  |  | 	// | 
					
						
							|  |  |  | 	// Default window for doing a | 
					
						
							|  |  |  | 	// fresh dereference of an Account. | 
					
						
							|  |  |  | 	DefaultAccountFreshness = util.Ptr(FreshnessWindow(6 * time.Hour)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 2 hours. | 
					
						
							|  |  |  | 	// | 
					
						
							|  |  |  | 	// Default window for doing a | 
					
						
							|  |  |  | 	// fresh dereference of a Status. | 
					
						
							|  |  |  | 	DefaultStatusFreshness = util.Ptr(FreshnessWindow(2 * time.Hour)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// 5 minutes. | 
					
						
							|  |  |  | 	// | 
					
						
							|  |  |  | 	// Fresh is useful when you're wanting | 
					
						
							|  |  |  | 	// a more up-to-date model of something | 
					
						
							|  |  |  | 	// that exceeds default freshness windows. | 
					
						
							|  |  |  | 	// | 
					
						
							|  |  |  | 	// This is tuned to be quite fresh without | 
					
						
							|  |  |  | 	// causing loads of dereferencing calls. | 
					
						
							|  |  |  | 	Fresh = util.Ptr(FreshnessWindow(5 * time.Minute)) | 
					
						
							| 
									
										
										
										
											2024-03-12 15:34:08 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// 10 seconds. | 
					
						
							|  |  |  | 	// | 
					
						
							|  |  |  | 	// Freshest is useful when you want an | 
					
						
							|  |  |  | 	// immediately up to date model of something | 
					
						
							|  |  |  | 	// that's even fresher than Fresh. | 
					
						
							|  |  |  | 	// | 
					
						
							|  |  |  | 	// Be careful using this one; it can cause | 
					
						
							|  |  |  | 	// lots of unnecessary traffic if used unwisely. | 
					
						
							|  |  |  | 	Freshest = util.Ptr(FreshnessWindow(10 * time.Second)) | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-10-23 10:58:13 +01:00
										 |  |  | // Dereferencer wraps logic and functionality for doing dereferencing | 
					
						
							|  |  |  | // of remote accounts, statuses, etc, from federated instances. | 
					
						
							|  |  |  | type Dereferencer struct { | 
					
						
							| 
									
										
										
										
											2023-05-12 10:15:54 +01:00
										 |  |  | 	state               *state.State | 
					
						
							| 
									
										
										
										
											2023-09-23 17:44:11 +01:00
										 |  |  | 	converter           *typeutils.Converter | 
					
						
							| 
									
										
										
										
											2023-02-10 20:15:23 +00:00
										 |  |  | 	transportController transport.Controller | 
					
						
							| 
									
										
										
										
											2023-05-28 13:08:35 +01:00
										 |  |  | 	mediaManager        *media.Manager | 
					
						
							| 
									
										
										
										
											2024-07-24 13:27:42 +02:00
										 |  |  | 	visFilter           *visibility.Filter | 
					
						
							|  |  |  | 	intFilter           *interaction.Filter | 
					
						
							| 
									
										
										
										
											2023-10-31 11:12:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-22 18:45:48 +01:00
										 |  |  | 	// in-progress dereferencing media / emoji | 
					
						
							|  |  |  | 	derefMedia    map[string]*media.ProcessingMedia | 
					
						
							|  |  |  | 	derefMediaMu  sync.Mutex | 
					
						
							| 
									
										
										
										
											2024-06-06 08:50:14 +00:00
										 |  |  | 	derefEmojis   map[string]*media.ProcessingEmoji | 
					
						
							|  |  |  | 	derefEmojisMu sync.Mutex | 
					
						
							| 
									
										
										
										
											2023-10-31 11:12:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-06 08:50:14 +00:00
										 |  |  | 	// handshakes marks current in-progress handshakes | 
					
						
							|  |  |  | 	// occurring, useful to prevent a deadlock between | 
					
						
							|  |  |  | 	// gotosocial instances attempting to dereference | 
					
						
							|  |  |  | 	// accounts for the first time. when a handshake is | 
					
						
							|  |  |  | 	// currently ongoing we know not to block waiting | 
					
						
							|  |  |  | 	// on certain data and instead return an in-progress | 
					
						
							|  |  |  | 	// form of the data as we currently see it. | 
					
						
							| 
									
										
										
										
											2023-10-31 11:12:22 +00:00
										 |  |  | 	handshakes   map[string][]*url.URL | 
					
						
							|  |  |  | 	handshakesMu sync.Mutex | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-24 13:27:42 +02:00
										 |  |  | // NewDereferencer returns a Dereferencer | 
					
						
							|  |  |  | // initialized with the given parameters. | 
					
						
							| 
									
										
										
										
											2023-10-23 10:58:13 +01:00
										 |  |  | func NewDereferencer( | 
					
						
							|  |  |  | 	state *state.State, | 
					
						
							|  |  |  | 	converter *typeutils.Converter, | 
					
						
							|  |  |  | 	transportController transport.Controller, | 
					
						
							| 
									
										
										
										
											2024-03-04 12:30:12 +00:00
										 |  |  | 	visFilter *visibility.Filter, | 
					
						
							| 
									
										
										
										
											2024-07-24 13:27:42 +02:00
										 |  |  | 	intFilter *interaction.Filter, | 
					
						
							| 
									
										
										
										
											2023-10-23 10:58:13 +01:00
										 |  |  | 	mediaManager *media.Manager, | 
					
						
							|  |  |  | ) Dereferencer { | 
					
						
							|  |  |  | 	return Dereferencer{ | 
					
						
							| 
									
										
										
										
											2023-05-12 10:15:54 +01:00
										 |  |  | 		state:               state, | 
					
						
							| 
									
										
										
										
											2023-09-23 17:44:11 +01:00
										 |  |  | 		converter:           converter, | 
					
						
							| 
									
										
										
										
											2023-02-10 20:15:23 +00:00
										 |  |  | 		transportController: transportController, | 
					
						
							|  |  |  | 		mediaManager:        mediaManager, | 
					
						
							| 
									
										
										
										
											2024-07-24 13:27:42 +02:00
										 |  |  | 		visFilter:           visFilter, | 
					
						
							|  |  |  | 		intFilter:           intFilter, | 
					
						
							| 
									
										
										
										
											2024-07-22 18:45:48 +01:00
										 |  |  | 		derefMedia:          make(map[string]*media.ProcessingMedia), | 
					
						
							| 
									
										
										
										
											2023-02-10 20:15:23 +00:00
										 |  |  | 		derefEmojis:         make(map[string]*media.ProcessingEmoji), | 
					
						
							|  |  |  | 		handshakes:          make(map[string][]*url.URL), | 
					
						
							| 
									
										
										
										
											2021-08-10 13:32:39 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | } |