HTTP ரூட்கள்
PlainApp, GraphQL API (POST /graphql) உடன் HTTP எண்ட்பாயிண்ட்களின் ஒரு சிறிய தொகுப்பை வெளிப்படுத்துகிறது. இந்த எண்ட்பாயிண்ட்கள் கோப்பு சர்விங், மல்டிபார்ட் அப்லோடுகள், zip ஸ்ட்ரீமிங், DLNA காஸ்டிங், WebSocket நிகழ்வுகள் மற்றும் சிஸ்டம் கட்டுப்பாட்டை கையாளுகின்றன. அனைத்து file/upload/zip எண்ட்பாயிண்ட்களுக்கும் c-id தலைப்பு (மற்றும் பொதுவாக ஒரு மறையாக்கப்பட்ட id query அளவுரு) தேவை.
வகை வரையறைகள்
# Common headers for protected HTTP endpoints:
c-id: <client-id>
# /fs, /proxyfs, /zip/* use an encrypted "id" query parameter produced
# by the GraphQL files()/fileIds() queries. The id is opaque to the client.
# Upload endpoints additionally require an encrypted "info" multipart part:
# info = chaCha20Encrypt(token, json({ dir, size, replace, isAppFile }))
# file = <raw bytes>
# Chunked uploads use:
# info = chaCha20Encrypt(token, json({ fileId, index, size }))
# Status codes follow HTTP semantics:
# 200 OK – success
# 201 Created – upload stored
# 204 No Content – init pending password
# 400 Bad Request – missing/invalid params
# 401 Unauthorized – bad token
# 403 Forbidden – expired/invalid encrypted id
# 404 Not Found – file/entry missing
# 410 Gone – server shutting down
# 429 Too Many Requests – concurrent zip limit hitசெயல்பாடுகள்
POST /graphql
முக்கிய GraphQL எண்ட்பாயிண்ட். அனைத்து GraphQL queries மற்றும் mutations-ஐ c-id + Authorization தலைப்புகளுடன் இங்கே அனுப்பவும். /peer_graphql எண்ட்பாயிண்ட் இணைக்கப்பட்ட சாதனங்களுக்கு இடையே பயன்படுத்தப்படும் peer-to-peer சமமானது.
curl --request POST \
--url http://192.168.1.100:8080/graphql \
--header 'c-id: <client-id>' \
--header 'Authorization: Bearer <api-token>' \
--header 'Content-Type: application/json' \
--data '{"query":"{ app { battery deviceName } }"}'GET /fs
ஒரு கோப்பு, content:// URI, அல்லது தொகுப்பு ஐகானை சர்வ் செய்யவும். id query அளவுரு files()/fileIds() மூலம் திருப்பி அனுப்பப்பட்ட ஒரு மறையாக்கப்பட்ட சரம். தம்ப்நெயில் உருவாக்கம் (?w=&h=&cc=), குறைந்த-த்ரூபுட் போக்குவரத்துக்கு பைட்-ரேஞ்ச் (?offset=&length=), HEIF→PNG மாற்றம், 3gp→MP4 டிரான்ஸ்கோடிங், மற்றும் Content-Disposition இணைப்பு தலைப்புடன் டவுன்லோட் முறை (dl=1) ஆதரவை வழங்குகிறது.
# Original (full size, inline)
curl http://192.168.1.100:8080/fs?id=<encrypted-id> -o file.jpg
# Thumbnail (center-cropped to 200x200)
curl 'http://192.168.1.100:8080/fs?id=<encrypted-id>&w=200&h=200' -o thumb.jpg
# Download (attachment)
curl 'http://192.168.1.100:8080/fs?id=<encrypted-id>&dl=1' -OJ
# Byte range (BLE chunked download)
curl 'http://192.168.1.100:8080/fs?id=<encrypted-id>&offset=0&length=4096' \
-o chunk.binGET /proxyfs
ஒரு peer HTTP URL-ஐ ப்ராக்ஸி செய்யவும். id query அளவுரு ஒரு இணைக்கப்பட்ட peer சாதனத்தில் முழு http(s) URL-ஆக டிக்ரிப்ட் ஆகும்; சர்வர் அப்ஸ்ட்ரீம் பதிலை திருப்பி ஸ்ட்ரீம் செய்கிறது. Wi-Fi Aware மீது peer-to-peer கோப்பு டவுன்லோடுகளுக்கு பயன்படுத்தப்படுகிறது.
curl http://192.168.1.100:8080/proxyfs?id=<encrypted-peer-url> -o peer-file.jpgPOST /upload
multipart/form-data மூலம் ஒரு கோப்பை அப்லோட் செய்யவும். "info" பகுதி (ChaCha20-மறையாக்கப்பட்ட JSON) "file" பகுதிக்கு முன் இருக்க வேண்டும். isAppFile=true ஆக இருக்கும்போது பைட்டுகள் content-addressable AppFileStore-இல் (ஹாஷ் மூலம் டிடுப்ளிகேட் செய்யப்பட்ட) இறக்குமதி செய்யப்படுகின்றன; இல்லையெனில் கோப்பு info.dir/<fileName>-இல் எழுதப்படுகிறது. இறுதி கோப்பு பெயரை திருப்பி அனுப்புகிறது (மேலெழுதுதலைத் தவிர்க்கும்போது "(1)" பின்னொட்டு இருக்கலாம்).
curl --request POST \
--url http://192.168.1.100:8080/upload \
--header 'c-id: <client-id>' \
--form 'info=<encrypted-info-bytes>;type=application/octet-stream' \
--form 'file=@/path/to/local.jpg'POST /upload_chunk
மீட்டெடுக்கக்கூடிய, சங்கிலி அப்லோடின் ஒரு சங்கிலியை அப்லோட் செய்யவும். ஒவ்வொரு சங்கிலியும் டிஸ்கில் upload_tmp/{fileId}/chunk_{index}-இல் எழுதப்படுகிறது. "<index>:<savedSize>" திருப்பி அனுப்புகிறது. அனைத்து சங்கிலிகளும் வந்த பிறகு, இறுதி கோப்பை ஒன்றிணைக்க mergeChunks GraphQL mutation-ஐ அழைக்கவும்.
curl --request POST \
--url http://192.168.1.100:8080/upload_chunk \
--header 'c-id: <client-id>' \
--form 'info=<encrypted-chunk-info-bytes>;type=application/octet-stream' \
--form 'file=@/path/to/chunk_0.bin'GET /zip/dir
ஒரு கோப்பகத்தை zip காப்பகமாக ஸ்ட்ரீம் செய்யவும். id query அளவுரு ஒரு கோப்பக பாதையாக டிக்ரிப்ட் ஆகும். சாதனத்தில் ஒரு நேரத்தில் ஒரே ஒரு zip செயல்பாடு மட்டுமே இயங்கும் — ஒரே நேரத்தில் வரும் கோரிக்கைகள் HTTP 429 பெறும்.
curl 'http://192.168.1.100:8080/zip/dir?id=<encrypted-dir-id>' \
-o folder.zipGET /zip/files
பல கோப்புகளை (அல்லது மீடியா தேடல் முடிவுகளை) ஒரு zip-ஆக ஸ்ட்ரீம் செய்யவும். id { type, query, id, name }-ஆக டிக்ரிப்ட் ஆகும். FILE வகைக்கு கோப்பு பட்டியல் GraphQL files() query மூலம் TempHelper-இல் request.id-ன் கீழ் சேமிக்கப்படுகிறது; மீடியா வகைகளுக்கு சர்வர் searchZipItems(type, query, id)-ஐ இயக்குகிறது.
curl 'http://192.168.1.100:8080/zip/files?id=<encrypted-request>' \
-o selection.zipGET /media/{id}
DLNA மீடியா எண்ட்பாயிண்ட். முன்பு பதிவுசெய்யப்பட்ட மீடியா பாதையை (UrlHelper.getMediaHttpUrl மூலம் பதிவுசெய்யப்பட்ட) TV / DLNA ரெண்டரருக்கு சர்வ் செய்கிறது. URL மூலங்கள் ப்ராக்ஸி செய்யப்படுகின்றன, content:// URIs ஸ்ட்ரீம் செய்யப்படுகின்றன, படங்கள் அப்படியே சர்வ் செய்யப்படுகின்றன, மற்ற அனைத்து கோப்புகளும் DLNA-குறிப்பிட்ட தலைப்புகள் + HTTP 206 ரேஞ்ச் ஆதரவுடன் சர்வ் செய்யப்படுகின்றன அதனால் ரெண்டரர்கள் ஸ்ட்ரீமை ஏற்றுக்கொள்ளும்.
# Play on a DLNA renderer:
curl http://192.168.1.100:8080/media/<id>.mp4 -o video.mp4NOTIFY /callback/cast
DLNA ரெண்டரர் கால்பேக். ரெண்டரரின் நிகழ்வு NOTIFY XML-ஐ பெறுகிறது மற்றும் CastPlayer நிலையை புதுப்பிக்கிறது. TransportState=STOPPED (AVTransportURIMetaData இல்லாமல்) என்ற நிலையில் பிளேயர் தானாக அடுத்த ப்ளேலிஸ்ட் உருப்படிக்கு முன்னேறுகிறது. நிலை புதுப்பிப்புகளுக்கு RelTime / TrackDuration-ஐயும் பார்ஸ் செய்கிறது.
# Sent by the DLNA renderer (not by the client):
NOTIFY /callback/cast HTTP/1.1
Content-Type: text/xml
<?xml ...><e:propertyset>...TransportState val="PLAYING"...</e:propertyset>GET /health
அங்கீகரிக்கப்படாத ஆரோக்கிய-சோதனை எண்ட்பாயிண்ட். செயலி தொகுப்பு பெயரை சாதாரண உரையாக திருப்பி அனுப்புகிறது. HTTP சர்வர் அணுகக்கூடியது என்பதை சரிபார்க்க இதைப் பயன்படுத்தவும்.
curl http://192.168.1.100:8080/healthGET /shutdown
HTTP சர்வரை பணிநிறுத்தவும். localhost-இலிருந்து மட்டுமே அழைக்க முடியும் — தொலைநிலை கோரிக்கைகள் HTTP 403 பெறும். அனைத்து WebSocket அமர்வுகளையும் மூடுகிறது, ஆன்லைன் கிளையன்ட் தொகுப்பை அழிக்கிறது, மற்றும் HTTP சர்வரை அகற்றுகிறது.
# Must be run on the device (e.g. via adb shell):
curl http://localhost:8080/shutdownPOST /init
கிளையன்ட் அமர்வை தொடங்கவும். c-id தலைப்பு தேவை. ஒரு செல்லுபடியாகும் மறையாக்கப்பட்ட பாடி இருந்தால் (கேஷ் செய்யப்பட்ட டோக்கனுடன் டிக்ரிப்ட் செய்யப்பட்ட) அமர்வு அங்கீகரிக்கப்பட்டதாக கருதப்படுகிறது மற்றும் சர்வர் 200 பதிலளிக்கிறது. இல்லையெனில்: கடவுச்சொல் அமைக்கப்படவில்லை என்றால், சர்வர் புதிதாக-மீட்டமைக்கப்பட்ட கடவுச்சொல்லுடன் (200) பதிலளிக்கிறது; கடவுச்சொல் அமைக்கப்பட்டிருந்தால், 204 No Content பதிலளித்து கிளையன்ட் WebSocket உள்நுழைவு பாய்வு மூலம் அங்கீகரிக்க வேண்டும்.
curl --request POST \
--url http://192.168.1.100:8080/init \
--header 'c-id: <client-id>' \
--data-binary '<encrypted-token-bytes>'WS /
முக்கிய WebSocket எண்ட்பாயிண்ட். ஒரு அமர்வை பதிவுசெய்ய ?cid=<client-id>-ஐப் பயன்படுத்தவும்; முதல் பைனரி பிரேம் ஒரு மறையாக்கப்பட்ட டைம்ஸ்டாம்ப் ஆக இருக்க வேண்டும் (அல்லது, ?auth=1 உடன், கடவுச்சொல் கொண்ட ஒரு மறையாக்கப்பட்ட AuthRequest). அங்கீகாரத்திற்குப் பிறகு சர்வர் இந்த சாக்கெட்டின் மீது மறையாக்கப்பட்ட நிகழ்வு பிரேம்களை (அறிவிப்புகள், அரட்டை புதுப்பிப்புகள், போன்றவை) தள்ளுகிறது.
# Browser / JS example
const ws = new WebSocket('ws://192.168.1.100:8080/?cid=<client-id>')
ws.binaryType = 'arraybuffer'
ws.send(encryptWithToken(token, Date.now().toString()))
// Login variant:
const ws = new WebSocket('ws://192.168.1.100:8080/?cid=<client-id>&auth=1')
ws.send(encryptWithPassword(password, JSON.stringify({ password: hash })))WS /status
Peer-இருப்பு WebSocket. இணைக்கப்பட்ட peer-ஐ ஆன்லைனில் குறிக்க ?cid=<peer-id>-ஐப் பயன்படுத்தவும். முதல் பைனரி பிரேம் PeerChatParser-மறையாக்கப்பட்ட கோரிக்கையாக இருக்க வேண்டும்; வெற்றியின் போது சர்வர் "ok" உரையை அனுப்பி சாக்கெட் மூடும் வரை peer-ஐ ஆன்லைனில் குறிக்கிறது.
# Peer-to-peer keepalive (typically opened automatically by the chat
# client after pairing — not usually invoked manually)
const ws = new WebSocket('ws://192.168.1.100:8080/status?cid=<peer-id>')
ws.send(peerEncryptedFrame)