2025-04-14 11:56:42 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Appwrite\Network;
|
|
|
|
|
|
|
|
|
|
class Platform
|
|
|
|
|
{
|
|
|
|
|
public const TYPE_UNKNOWN = 'unknown';
|
|
|
|
|
public const TYPE_WEB = 'web';
|
2026-03-27 12:45:58 +00:00
|
|
|
public const TYPE_APPLE = 'apple';
|
2025-04-14 11:56:42 +00:00
|
|
|
public const TYPE_ANDROID = 'android';
|
2026-03-27 12:45:58 +00:00
|
|
|
public const TYPE_WINDOWS = 'windows';
|
|
|
|
|
public const TYPE_LINUX = 'linux';
|
2025-04-14 11:56:42 +00:00
|
|
|
public const TYPE_SCHEME = 'scheme';
|
|
|
|
|
|
|
|
|
|
public const SCHEME_HTTP = 'http';
|
|
|
|
|
public const SCHEME_HTTPS = 'https';
|
2025-07-05 02:29:52 +00:00
|
|
|
public const SCHEME_CHROME_EXTENSION = 'chrome-extension';
|
|
|
|
|
public const SCHEME_FIREFOX_EXTENSION = 'moz-extension';
|
2025-07-05 04:48:40 +00:00
|
|
|
public const SCHEME_SAFARI_EXTENSION = 'safari-web-extension';
|
2025-07-05 02:29:52 +00:00
|
|
|
public const SCHEME_EDGE_EXTENSION = 'ms-browser-extension';
|
2025-04-14 11:56:42 +00:00
|
|
|
public const SCHEME_IOS = 'appwrite-ios';
|
|
|
|
|
public const SCHEME_MACOS = 'appwrite-macos';
|
|
|
|
|
public const SCHEME_WATCHOS = 'appwrite-watchos';
|
|
|
|
|
public const SCHEME_TVOS = 'appwrite-tvos';
|
|
|
|
|
public const SCHEME_ANDROID = 'appwrite-android';
|
|
|
|
|
public const SCHEME_WINDOWS = 'appwrite-windows';
|
|
|
|
|
public const SCHEME_LINUX = 'appwrite-linux';
|
2026-03-19 20:14:24 +00:00
|
|
|
public const SCHEME_TAURI = 'tauri';
|
2025-04-14 11:56:42 +00:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @var array<string, string> Map scheme types to user-friendly platform names.
|
|
|
|
|
*/
|
|
|
|
|
private static array $names = [
|
|
|
|
|
self::SCHEME_HTTP => 'Web',
|
|
|
|
|
self::SCHEME_HTTPS => 'Web',
|
|
|
|
|
self::SCHEME_IOS => 'iOS',
|
|
|
|
|
self::SCHEME_MACOS => 'macOS',
|
|
|
|
|
self::SCHEME_WATCHOS => 'watchOS',
|
|
|
|
|
self::SCHEME_TVOS => 'tvOS',
|
|
|
|
|
self::SCHEME_ANDROID => 'Android',
|
|
|
|
|
self::SCHEME_WINDOWS => 'Windows',
|
|
|
|
|
self::SCHEME_LINUX => 'Linux',
|
2025-07-05 12:29:01 +00:00
|
|
|
self::SCHEME_CHROME_EXTENSION => 'Web (Chrome Extension)',
|
|
|
|
|
self::SCHEME_FIREFOX_EXTENSION => 'Web (Firefox Extension)',
|
|
|
|
|
self::SCHEME_SAFARI_EXTENSION => 'Web (Safari Extension)',
|
|
|
|
|
self::SCHEME_EDGE_EXTENSION => 'Web (Edge Extension)',
|
2026-03-19 20:14:24 +00:00
|
|
|
self::SCHEME_TAURI => 'Web (Tauri)',
|
2025-04-14 11:56:42 +00:00
|
|
|
];
|
|
|
|
|
|
2026-04-09 07:47:42 +00:00
|
|
|
/**
|
|
|
|
|
* Map deprecated platform types to their new consolidated types.
|
|
|
|
|
*
|
|
|
|
|
* The 1.9.x refactor consolidated ~15 platform types into 5 new ones.
|
|
|
|
|
* Existing platforms in the database may still have old type values.
|
|
|
|
|
*
|
|
|
|
|
* @param string $type
|
|
|
|
|
* @return string The mapped type, or the original if not deprecated.
|
|
|
|
|
*/
|
|
|
|
|
public static function mapDeprecatedType(string $type): string
|
|
|
|
|
{
|
|
|
|
|
$mapping = [
|
|
|
|
|
'flutter-web' => self::TYPE_WEB,
|
|
|
|
|
'unity' => self::TYPE_WEB,
|
|
|
|
|
'flutter-ios' => self::TYPE_APPLE,
|
|
|
|
|
'flutter-macos' => self::TYPE_APPLE,
|
|
|
|
|
'apple-ios' => self::TYPE_APPLE,
|
|
|
|
|
'apple-macos' => self::TYPE_APPLE,
|
|
|
|
|
'apple-watchos' => self::TYPE_APPLE,
|
|
|
|
|
'apple-tvos' => self::TYPE_APPLE,
|
|
|
|
|
'react-native-ios' => self::TYPE_APPLE,
|
|
|
|
|
'flutter-android' => self::TYPE_ANDROID,
|
|
|
|
|
'react-native-android' => self::TYPE_ANDROID,
|
|
|
|
|
'flutter-windows' => self::TYPE_WINDOWS,
|
|
|
|
|
'flutter-linux' => self::TYPE_LINUX,
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
return $mapping[$type] ?? $type;
|
|
|
|
|
}
|
|
|
|
|
|
2025-04-14 11:56:42 +00:00
|
|
|
/**
|
|
|
|
|
* Get user-friendly platform name from a scheme.
|
|
|
|
|
*
|
2025-07-03 10:56:56 +00:00
|
|
|
* @param string|null $scheme
|
2025-04-14 11:56:42 +00:00
|
|
|
* @return string Empty string if scheme is not found.
|
|
|
|
|
*/
|
2025-07-03 10:56:56 +00:00
|
|
|
public static function getNameByScheme(?string $scheme): string
|
2025-04-14 11:56:42 +00:00
|
|
|
{
|
|
|
|
|
return self::$names[$scheme] ?? '';
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function getHostnames(array $platforms): array
|
|
|
|
|
{
|
|
|
|
|
$hostnames = [];
|
|
|
|
|
foreach ($platforms as $platform) {
|
2025-07-03 10:56:56 +00:00
|
|
|
$type = strtolower($platform['type'] ?? self::TYPE_UNKNOWN);
|
2025-04-14 11:56:42 +00:00
|
|
|
$hostname = strtolower($platform['hostname'] ?? '');
|
|
|
|
|
$key = strtolower($platform['key'] ?? '');
|
|
|
|
|
|
|
|
|
|
switch ($type) {
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-web':
|
|
|
|
|
case 'unity':
|
2025-04-14 11:56:42 +00:00
|
|
|
case self::TYPE_WEB:
|
2025-06-25 05:30:07 +00:00
|
|
|
if (!empty($hostname)) {
|
|
|
|
|
$hostnames[] = $hostname;
|
|
|
|
|
}
|
2025-04-14 11:56:42 +00:00
|
|
|
break;
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-android':
|
|
|
|
|
case 'react-native-android':
|
2025-04-14 11:56:42 +00:00
|
|
|
case self::TYPE_ANDROID:
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-windows':
|
2026-03-27 12:45:58 +00:00
|
|
|
case self::TYPE_WINDOWS:
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-linux':
|
2026-03-27 12:45:58 +00:00
|
|
|
case self::TYPE_LINUX:
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-ios':
|
|
|
|
|
case 'flutter-macos':
|
|
|
|
|
case 'apple-ios':
|
|
|
|
|
case 'apple-macos':
|
|
|
|
|
case 'apple-watchos':
|
|
|
|
|
case 'apple-tvos':
|
|
|
|
|
case 'react-native-ios':
|
2026-03-27 12:45:58 +00:00
|
|
|
case self::TYPE_APPLE:
|
2025-04-14 11:56:42 +00:00
|
|
|
if (!empty($key)) {
|
|
|
|
|
$hostnames[] = $key;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return array_unique($hostnames);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public static function getSchemes(array $platforms): array
|
|
|
|
|
{
|
|
|
|
|
$schemes = [];
|
|
|
|
|
foreach ($platforms as $platform) {
|
2025-07-03 11:08:22 +00:00
|
|
|
$type = strtolower($platform['type'] ?? self::TYPE_UNKNOWN);
|
|
|
|
|
$scheme = strtolower($platform['key'] ?? '');
|
2025-04-14 11:56:42 +00:00
|
|
|
|
|
|
|
|
switch ($type) {
|
|
|
|
|
case self::TYPE_SCHEME:
|
2025-07-03 11:08:22 +00:00
|
|
|
if (!empty($scheme) && preg_match('/^[a-z][a-z0-9+.-]*$/', $scheme)) {
|
|
|
|
|
$schemes[] = $scheme;
|
|
|
|
|
}
|
2025-04-14 11:56:42 +00:00
|
|
|
break;
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-web':
|
|
|
|
|
case 'unity':
|
2025-07-03 16:09:23 +00:00
|
|
|
case self::TYPE_WEB:
|
|
|
|
|
$schemes[] = self::SCHEME_HTTP;
|
2025-07-03 17:09:12 +00:00
|
|
|
$schemes[] = self::SCHEME_HTTPS;
|
2025-07-03 16:09:23 +00:00
|
|
|
break;
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-android':
|
|
|
|
|
case 'react-native-android':
|
2025-07-03 16:09:23 +00:00
|
|
|
case self::TYPE_ANDROID:
|
|
|
|
|
$schemes[] = self::SCHEME_ANDROID;
|
|
|
|
|
break;
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-ios':
|
|
|
|
|
case 'flutter-macos':
|
|
|
|
|
case 'apple-ios':
|
|
|
|
|
case 'apple-macos':
|
|
|
|
|
case 'apple-watchos':
|
|
|
|
|
case 'apple-tvos':
|
|
|
|
|
case 'react-native-ios':
|
2026-03-27 12:45:58 +00:00
|
|
|
case self::TYPE_APPLE:
|
|
|
|
|
$schemes[] = self::SCHEME_WATCHOS;
|
2025-07-03 16:09:23 +00:00
|
|
|
$schemes[] = self::SCHEME_MACOS;
|
2026-03-27 12:45:58 +00:00
|
|
|
$schemes[] = self::SCHEME_TVOS;
|
|
|
|
|
$schemes[] = self::SCHEME_IOS;
|
2025-07-03 16:09:23 +00:00
|
|
|
break;
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-windows':
|
2026-03-27 12:45:58 +00:00
|
|
|
case self::TYPE_WINDOWS:
|
2025-07-03 16:09:23 +00:00
|
|
|
$schemes[] = self::SCHEME_WINDOWS;
|
|
|
|
|
break;
|
2026-04-09 07:31:58 +00:00
|
|
|
case 'flutter-linux':
|
2026-03-27 12:45:58 +00:00
|
|
|
case self::TYPE_LINUX:
|
2025-07-03 16:09:23 +00:00
|
|
|
$schemes[] = self::SCHEME_LINUX;
|
|
|
|
|
break;
|
2025-04-14 11:56:42 +00:00
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return array_unique($schemes);
|
|
|
|
|
}
|
|
|
|
|
}
|