सुपाबेस पोस्टग्रेज एडाप्टर
tracelet_supabase पैकेज आपके पृष्ठभूमि स्थानों को पोस्टग्रेज आरपीसी फ़ंक्शन या सुपाबेस एज फ़ंक्शन के माध्यम से सीधे सुपाबेस पोस्टग्रेज में सिंक करने के लिए एक ड्रॉप-इन एडाप्टर प्रदान करता है।
इंस्टालेशन
एडाप्टर को अपने pubspec.yaml में जोड़ें:
flutter pub add tracelet_supabaseयह एडॉप्टर supabase_flutter का उपयोग करता है। उपयोग करने से पहले आपको सुपाबेस क्लाइंट को इनिशियलाइज़ करना होगा।
यह काम किस प्रकार करता है
एडॉप्टर ट्रैसलेट के बैटरी-कुशल नेटिव HTTP सिंक इंजन में प्लग होता है: buildHttpConfig आपके सुपबेस रेस्ट एंडपॉइंट पर इंगित करने वाला एक HttpConfig उत्पन्न करता है - या तो /rest/v1/rpc/<function> (RPC) या /functions/v1/<function> (एज फ़ंक्शन) - आपके लिए apikey और Authorization: Bearer <token> हेडर सेट के साथ।
क्योंकि सिंकिंग नेटिव इंजन में चलती है, बैच एक्सपोनेंशियल बैकऑफ़ और ऑफ़लाइन कतार के साथ अपलोड होते हैं तब भी जब ऐप को फोर्स-क्विट किया जाता है। 401 पर, configureTokenRefresh सुपाबेस सत्र को ताज़ा करता है - अग्रभूमि में और हेडलेस पृष्ठभूमि में अलग - और पुनः प्रयास करता है। आप बिल्कुल एक लक्ष्य प्रदान करते हैं: rpcFunction या edgeFunction।
सेटअप और कॉन्फ़िगरेशन
एक तालिका और एक इनजेस्ट फ़ंक्शन बनाएं
स्थान प्राप्त करने के लिए एक तालिका बनाएं, आरएलएस सक्षम करें, और एक पोस्टग्रेज फ़ंक्शन जोड़ें जो आने वाले बैच को सम्मिलित करता है। ट्रैसलेट स्थान ऑब्जेक्ट का एक बैच पोस्ट करता है, इसलिए फ़ंक्शन jsonb सरणी स्वीकार करता है:
-- Table
CREATE TABLE public.locations (
id uuid DEFAULT gen_random_uuid() PRIMARY KEY,
user_id uuid REFERENCES auth.users NOT NULL DEFAULT auth.uid(),
latitude double precision NOT NULL,
longitude double precision NOT NULL,
accuracy double precision,
speed double precision,
timestamp timestamptz NOT NULL,
is_moving boolean,
created_at timestamptz DEFAULT now()
);
ALTER TABLE public.locations ENABLE ROW LEVEL SECURITY;
CREATE POLICY "Users insert their own locations" ON public.locations
FOR INSERT WITH CHECK (auth.uid() = user_id);
-- RPC function: receives the batch as a jsonb array and inserts each row.
-- (The exact field names come from Tracelet's sync payload — see the
-- Tracelet Sync docs for the payload schema.)
CREATE OR REPLACE FUNCTION public.insert_tracelet_locations(payload jsonb)
RETURNS void
LANGUAGE sql
SECURITY INVOKER
AS $$
INSERT INTO public.locations (latitude, longitude, accuracy, speed, timestamp, is_moving)
SELECT
(e->'coords'->>'latitude')::double precision,
(e->'coords'->>'longitude')::double precision,
(e->'coords'->>'accuracy')::double precision,
(e->'coords'->>'speed')::double precision,
(e->>'timestamp')::timestamptz,
(e->>'is_moving')::boolean
FROM jsonb_array_elements(payload) AS e;
$$;अधिक कस्टम प्रोसेसिंग (सत्यापन, फैन-आउट, संवर्धन) को प्राथमिकता दें? इसके बजाय एक सुपाबेस एज फ़ंक्शन तैनात करें और उसका नाम edgeFunction के रूप में पास करें - एडॉप्टर बैच को /functions/v1/<name> पर पोस्ट करेगा।
सुपाबेस को इनिशियलाइज़ करें
अपने main.dart में सुपाबेस क्लाइंट को प्रारंभ करें:
import 'package:supabase_flutter/supabase_flutter.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Supabase.initialize(
url: 'https://xyzcompany.supabase.co',
anonKey: 'public-anon-key',
);
runApp(const MyApp());
}टोकन रिफ्रेश कॉन्फ़िगर करें और HTTP कॉन्फ़िगरेशन बनाएं
configureTokenRefresh() को एक बार कॉल करें, अपने RPC (या एज फ़ंक्शन) को लक्षित करते हुए HttpConfig बनाएं, और इसे Tracelet.ready को पास करें:
import 'package:tracelet_supabase/tracelet_supabase.dart';
import 'package:tracelet/tracelet.dart';
const supabaseUrl = 'https://xyzcompany.supabase.co';
const supabaseAnonKey = 'public-anon-key';
// 1. Keep the Supabase session token fresh in the background (resolves 401s).
await TraceletSupabase.configureTokenRefresh(anonKey: supabaseAnonKey);
// 2. Build the native HTTP config. Provide EITHER rpcFunction OR edgeFunction.
final httpConfig = TraceletSupabase.buildHttpConfig(
supabaseUrl: supabaseUrl,
anonKey: supabaseAnonKey,
rpcFunction: 'insert_tracelet_locations', // ...or: edgeFunction: 'tracelet-ingest'
// autoSync: true, batchSync: true, maxBatchSize: 250 are the defaults
);
// 3. Start Tracelet with the adapter's HTTP config.
await Tracelet.ready(Config(
geo: const GeoConfig(distanceFilter: 50),
http: httpConfig,
));
await Tracelet.start();कस्टम मेटाडेटा संलग्न करना
प्रत्येक स्थान को व्यावसायिक डेटा (जैसे driver_id या trip_id) के साथ टैग करने के लिए, setRouteContext() का उपयोग करें - यह SQLite कतार के माध्यम से प्रत्येक स्थान के साथ यात्रा करता है और आपके फ़ंक्शन को प्राप्त पेलोड में शामिल होता है:
await Tracelet.setRouteContext(RouteContext(
taskId: 'order_123',
custom: {'trip_id': 'trip_456'},
));प्रदर्शन
सिंकिंग ट्रैसलेट के बैच इंजन के माध्यम से चलती है, इसलिए ऑफ़लाइन बिंदुओं का बैकलॉग प्रति बिंदु एक अनुरोध के बजाय बैचों (डिफ़ॉल्ट maxBatchSize: 250) में फ्लश किया जाता है। आपके आरपीसी के अंदर पोस्टग्रेज के बल्क इंसर्ट के साथ संयुक्त, यह डिवाइस बैटरी और डेटाबेस राउंड-ट्रिप दोनों पर उच्च-आवृत्ति ट्रैकिंग (उदाहरण के लिए हर 10 मीटर पर एक बिंदु) को कुशल रखता है।