API রেফারেন্স

HTTP রুট

PlainApp, GraphQL API (POST /graphql) এর পাশাপাশি HTTP এন্ডপয়েন্টের একটি ছোট সেট উজাগর করে। এই এন্ডপয়েন্টগুলি ফাইল সার্ভিং, মাল্টিপার্ট আপলোড, zip স্ট্রিমিং, DLNA কাস্টিং, WebSocket ইভেন্ট এবং সিস্টেম নিয়ন্ত্রণ পরিচালনা করে। সমস্ত file/upload/zip এন্ডপয়েন্টে c-id হেডার (এবং সাধারণত একটি এনক্রিপ্টেড id query প্যারামিটার) প্রয়োজন।

টাইপ ডেফিনিশন

bash
# 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

অপারেশন

http

POST /graphql

মূল GraphQL এন্ডপয়েন্ট। সমস্ত GraphQL queries এবং mutations কে c-id + Authorization হেডার সহ এখানে পাঠান। /peer_graphql এন্ডপয়েন্ট পেয়ার করা ডিভাইসের মধ্যে ব্যবহৃত peer-to-peer সমতুল্য।

bash
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 } }"}'
http

GET /fs

একটি ফাইল, content:// URI, বা প্যাকেজ আইকন সর্ব করুন। id query প্যারামিটার files()/fileIds() দ্বারা ফেরত দেওয়া একটি এনক্রিপ্টেড স্ট্রিং। থাম্বনেইল জেনারেশন (?w=&h=&cc=), কম-থ্রুপুট ট্রান্সপোর্টের জন্য বাইট-রেঞ্জ (?offset=&length=), HEIF→PNG রূপান্তর, 3gp→MP4 ট্রান্সকোডিং, এবং Content-Disposition অ্যাটাচমেন্ট হেডার সহ ডাউনলোড মোড (dl=1) সমর্থন করে।

bash
# 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.bin
http

GET /proxyfs

একটি peer HTTP URL প্রক্সি করুন। id query প্যারামিটার একটি পেয়ার করা peer ডিভাইসে সম্পূর্ণ http(s) URL-এ ডিক্রিপ্ট হয়; সার্ভার আপস্ট্রিম প্রতিক্রিয়া ফিরে স্ট্রিম করে। Wi-Fi Aware-এ peer-to-peer ফাইল ডাউনলোডের জন্য ব্যবহৃত হয়।

bash
curl http://192.168.1.100:8080/proxyfs?id=<encrypted-peer-url> -o peer-file.jpg
http

POST /upload

multipart/form-data এর মাধ্যমে একটি একক ফাইল আপলোড করুন। "info" পার্ট (ChaCha20-এনক্রিপ্টেড JSON) অবশ্যই "file" পার্টের আগে হতে হবে। যখন isAppFile=true তখন বাইটগুলি content-addressable AppFileStore-এ (হ্যাশ দ্বারা ডিডুপ্লিকেটেড) ইম্পোর্ট হয়; অন্যথায় ফাইলটি info.dir/<fileName> এ লেখা হয়। চূড়ান্ত ফাইলের নাম ফেরত দেয় (ওভাররাইট এড়াতে "(1)" সাফিক্স থাকতে পারে)।

bash
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'
http

POST /upload_chunk

রিজিউমেবল, চাঙ্কড আপলোডের একটি চাঙ্ক আপলোড করুন। প্রতিটি চাঙ্ক ডিস্কে upload_tmp/{fileId}/chunk_{index} এ লেখা হয়। "<index>:<savedSize>" ফেরত দেয়। সমস্ত চাঙ্ক এলে, চূড়ান্ত ফাইল একত্রিত করতে mergeChunks GraphQL mutation কল করুন।

bash
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'
http

GET /zip/dir

একটি একক ডিরেক্টরিকে zip আর্কাইভ হিসেবে স্ট্রিম করুন। id query প্যারামিটার একটি ডিরেক্টরি পাথে ডিক্রিপ্ট হয়। ডিভাইসে একসময়ে শুধুমাত্র একটি zip অপারেশন চলে — সমবর্তী অনুরোধগুলি HTTP 429 পায়।

bash
curl 'http://192.168.1.100:8080/zip/dir?id=<encrypted-dir-id>' \
  -o folder.zip
http

GET /zip/files

একাধিক ফাইল (বা মিডিয়া সার্চ ফলাফল) একটি একক zip হিসেবে স্ট্রিম করুন। id { type, query, id, name } এ ডিক্রিপ্ট হয়। FILE টাইপের জন্য ফাইল তালিকা GraphQL files() query দ্বারা TempHelper-এ request.id-এর অধীনে সংরক্ষিত; মিডিয়া টাইপের জন্য সার্ভার searchZipItems(type, query, id) চালায়।

bash
curl 'http://192.168.1.100:8080/zip/files?id=<encrypted-request>' \
  -o selection.zip
http

GET /media/{id}

DLNA মিডিয়া এন্ডপয়েন্ট। পূর্বে নিবন্ধিত মিডিয়া পাথ (UrlHelper.getMediaHttpUrl এর মাধ্যমে নিবন্ধিত) TV / DLNA রেন্ডারারকে সর্ব করে। URL সোর্স প্রক্সি করা হয়, content:// URIs স্ট্রিম করা হয়, ছবিগুলি যেমন আছে সর্ব করা হয়, এবং অন্যান্য সমস্ত ফাইল DLNA-নির্দিষ্ট হেডার + HTTP 206 রেঞ্জ সমর্থন সহ সর্ব করা হয় যাতে রেন্ডারার স্ট্রিম গ্রহণ করে।

bash
# Play on a DLNA renderer:
curl http://192.168.1.100:8080/media/<id>.mp4 -o video.mp4
http

NOTIFY /callback/cast

DLNA রেন্ডারার কলব্যাক। রেন্ডারারের ইভেন্ট NOTIFY XML গ্রহণ করে এবং CastPlayer স্টেট আপডেট করে। TransportState=STOPPED (AVTransportURIMetaData ছাড়া) হলে প্লেয়ার স্বয়ংক্রিয়ভাবে পরবর্তী প্লেলিস্ট আইটেমে এগিয়ে যায়। পজিশন আপডেটের জন্য RelTime / TrackDuration পার্স করে।

bash
# 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>
http

GET /health

অনঅথেন্টিকেটেড হেলথ-চেক এন্ডপয়েন্ট। অ্যাপ প্যাকেজের নাম প্লেইন টেক্সট হিসেবে ফেরত দেয়। HTTP সার্ভার অ্যাক্সেসযোগ্য কিনা যাচাই করতে এটি ব্যবহার করুন।

bash
curl http://192.168.1.100:8080/health
http

GET /shutdown

HTTP সার্ভার বন্ধ করুন। শুধুমাত্র localhost থেকে কল করা যায় — রিমোট অনুরোধগুলি HTTP 403 পায়। সমস্ত WebSocket সেশন বন্ধ করে, অনলাইন ক্লায়েন্ট সেট ক্লিয়ার করে, এবং HTTP সার্ভার ডিসপোজ করে।

bash
# Must be run on the device (e.g. via adb shell):
curl http://localhost:8080/shutdown
http

POST /init

ক্লায়েন্ট সেশন শুরু করুন। c-id হেডার প্রয়োজন। একটি বৈধ এনক্রিপ্টেড বডি উপস্থিত থাকলে (ক্যাশ করা টোকেন সহ ডিক্রিপ্ট করা) সেশনটি অথেন্টিকেটেড বলে বিবেচিত হয় এবং সার্ভার 200 সাড়া দেয়। অন্যথায়: কোনো পাসওয়ার্ড সেট না থাকলে, সার্ভার একটি নতুন-রিসেট পাসওয়ার্ড (200) সহ সাড়া দেয়; পাসওয়ার্ড সেট থাকলে, 204 No Content সাড়া দেয় এবং ক্লায়েন্টকে WebSocket লগইন ফ্লো এর মাধ্যমে অথেন্টিকেট করতে হবে।

bash
curl --request POST \
  --url http://192.168.1.100:8080/init \
  --header 'c-id: <client-id>' \
  --data-binary '<encrypted-token-bytes>'
http

WS /

মূল WebSocket এন্ডপয়েন্ট। একটি সেশন নিবন্ধন করতে ?cid=<client-id> ব্যবহার করুন; প্রথম বাইনারি ফ্রেম অবশ্যই একটি এনক্রিপ্টেড টাইমস্ট্যাম্প হতে হবে (অথবা, ?auth=1 সহ, পাসওয়ার্ড ধারণকারী একটি এনক্রিপ্টেড AuthRequest)। অথেন্টিকেশনের পরে সার্ভার এই সকেটে এনক্রিপ্টেড ইভেন্ট ফ্রেম (নোটিফিকেশন, চ্যাট আপডেট ইত্যাদি) পুশ করে।

bash
# 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 })))
http

WS /status

Peer-প্রেজেন্স WebSocket। পেয়ার করা peer কে অনলাইন চিহ্নিত রাখতে ?cid=<peer-id> ব্যবহার করুন। প্রথম বাইনারি ফ্রেম অবশ্যই PeerChatParser-এনক্রিপ্টেড অনুরোধ হতে হবে; সফল হলে সার্ভার "ok" টেক্সট পাঠায় এবং সকেট বন্ধ না হওয়া পর্যন্ত peer কে অনলাইন চিহ্নিত রাখে।

bash
# 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)