Cloud Firestore এমুলেটরের সাথে আপনার অ্যাপ কানেক্ট করুন

Cloud Firestore এমুলেটরের সাথে আপনার অ্যাপ কানেক্ট করার আগে, আপনি সামগ্রিক Firebase Local Emulator Suite ওয়ার্কফ্লো বুঝেছেন কিনা এবং Local Emulator Suite ইনস্টল ও কনফিগার করেছেন কিনা এবং এর CLI কমান্ড পর্যালোচনা করেছেন কিনা তা নিশ্চিত করুন।

Firebase প্রোজেক্ট বেছে নিন

Firebase Local Emulator Suite একটি Firebase প্রোজেক্টের জন্য প্রোডাক্ট এমুলেট করে।

ব্যবহার করার জন্য প্রোজেক্ট বেছে নিতে, এমুলেটর শুরু করার আগে, আপনার ওয়ার্কিং ডিরেক্টরিতে CLI রান firebase use করুন। অথবা, আপনি প্রতিটি এমুলেটর কমান্ডে --project ফ্ল্যাগ পাস করতে পারেন।

Local Emulator Suite আসল Firebase প্রোজেক্ট এবং ডেমো প্রোজেক্টের এমুলেশন সাপোর্ট করে।

প্রোজেক্টের ধরন ফিচার এমুলেটরের সাথে ব্যবহার করুন
রিয়েল

আসল Firebase প্রোজেক্ট হল এমন একটি প্রোজেক্ট যা আপনি তৈরি ও কনফিগার করেছেন (সম্ভবত Firebase কনসোলের মাধ্যমে)।

আসল প্রোজেক্টে লাইভ রিসোর্স থাকে, যেমন ডেটাবেস ইনস্ট্যান্স, স্টোরেজ বাকেট, ফাংশন বা সেই Firebase প্রোজেক্টের জন্য আপনার সেট-আপ করা অন্য যেকোনও রিসোর্স।

আসল Firebase প্রোজেক্ট নিয়ে কাজ করার সময়, আপনি কাজ করে এমন যেকোনও বা সব প্রোডাক্টের জন্য এমুলেটর চালাতে পারবেন।

আপনি এমুলেট করছেন না এমন যেকোনও প্রোডাক্টের জন্য, আপনার অ্যাপ এবং কোড লাইভ রিসোর্সের (ডেটাবেস ইনস্ট্যান্স, স্টোরেজ বাকেট, ফাংশন ইত্যাদি) সাথে ইন্টার‍্যাক্ট করবে।

নমুনা

ডেমো Firebase প্রোজেক্টে কোনও আসল Firebase কনফিগারেশন এবং লাইভ রিসোর্স থাকে না। এইসব প্রোজেক্ট সাধারণত কোডল্যাব বা অন্যান্য টিউটোরিয়ালের মাধ্যমে অ্যাক্সেস করা হয়।

ডেমো প্রোজেক্টের প্রোজেক্ট আইডিতে demo- প্রিফিক্স থাকে।

ডেমো Firebase প্রোজেক্টের সাথে কাজ করার সময়, আপনার অ্যাপ ও কোড শুধুমাত্র এমুলেটরের সাথে ইন্টার‍্যাক্ট করে। আপনার অ্যাপ যদি এমন কোনও রিসোর্সের সাথে ইন্টার‍্যাক্ট করার চেষ্টা করে যার জন্য এমুলেটর চলছে না, তাহলে সেই কোড কাজ করবে না।

আমরা সাজেস্ট করি যে যেখানে সম্ভব সেখানে ডেমো প্রোজেক্ট ব্যবহার করুন। সুবিধার মধ্যে এইসব অন্তর্ভুক্ত আছে:

  • সহজ সেট-আপ, কারণ আপনি Firebase প্রোজেক্ট তৈরি না করেই এমুলেটর চালাতে পারবেন
  • আরও শক্তিশালী নিরাপত্তা, কারণ আপনার কোড যদি ভুলবশত নন-এমুলেটেড (প্রোডাকশন) রিসোর্স ইনভোক করে, তাহলে ডেটা পরিবর্তন, ব্যবহার এবং বিলিংয়ের কোনও সম্ভাবনা থাকে না
  • আরও ভালো অফলাইন সহায়তা, কারণ আপনার SDK কনফিগারেশন ডাউনলোড করার জন্য ইন্টারনেট অ্যাক্সেস করার প্রয়োজন নেই।

এমুলেটরের সাথে কথা বলতে আপনার অ্যাপকে ইনস্ট্রুমেন্ট করুন

চালু করার সময়, Cloud Firestore এমুলেটর একটি ডিফল্ট ডেটাবেস এবং আপনার firebase.json ফাইলের প্রতিটি firestore কনফিগারেশনের জন্য একটি নামযুক্ত ডেটাবেস তৈরি করে।

এছাড়াও, এমুলেটরে কোনও SDK বা REST API কল করার উত্তরে নামযুক্ত ডেটাবেস তৈরি করা হয় যা নির্দিষ্ট ডেটাবেসকে রেফার করে। এই ধরনের অপ্রকাশিতভাবে তৈরি করা ডেটাবেস ওপেন রুল-এর সাথে কাজ করে।

Emulator Suite UI-এ আপনার ডিফল্ট এবং নামযুক্ত ডেটাবেসের সাথে ইন্টার‍্যাক্টিভভাবে কাজ করতে, আপনার ব্রাউজারের অ্যাড্রেস বারে, ডিফল্ট বা নামযুক্ত ডেটাবেস বেছে নিতে URL আপডেট করুন।

  • যেমন, আপনার ডিফল্ট ইনস্ট্যান্সে ডেটা ব্রাউজ করতে, URL আপডেট করে localhost:4000/firestore/default/data করুন
  • ecommerce নামের ইনস্ট্যান্সে ব্রাউজ করতে, localhost:4000/firestore/ecommerce/data-এ আপডেট করুন।

নির্দিষ্ট সংস্করণে এমুলেটর চালু করুন

আপনার firebase.json ফাইলের firestore.edition বিভাগে উল্লেখ করা সংস্করণে এমুলেটর শুরু হবে। এছাড়াও, আপনার firebase.json-এর emulators.firestore.edition বিভাগের অধীনে কোনও সংস্করণ নির্দিষ্ট করার বিকল্প আপনার কাছে আছে। সংস্করণের জন্য সঠিক ভ্যালু হল standard এবং enterprise। আপনি দুটি কনফিগারেশনেই edition উল্লেখ করলে, emulators.firestore.edition প্রাধান্য পাবে।

    {
      ...
      "firestore": {
        "rules": "firestore.rules",
        "indexes": "firestore.indexes.json",
        "edition": "enterprise"
      },
      "emulators": {
        "firestore": {
          "port": 8080,
          "edition": "enterprise" // Takes precedence over `firestore.edition`
        }
      },
      ...
    }

Android, Apple প্ল্যাটফর্ম ও ওয়েব SDK

Cloud Firestore-এর সাথে ইন্টার‍্যাক্ট করার জন্য আপনার অ্যাপ-মধ্যস্থ কনফিগারেশন বা টেস্ট ক্লাস সেট-আপ করুন। মনে রাখবেন যে নিম্নলিখিত স্যাম্পেলে, অ্যাপ কোড ডিফল্ট প্রোজেক্ট ডেটাবেসের সাথে কানেক্ট করছে। ডিফল্ট ডেটাবেস ছাড়াও অতিরিক্ত Cloud Firestore ডেটাবেস সংক্রান্ত উদাহরণের জন্য, একাধিক ডেটাবেসের জন্য নির্দেশিকা দেখুন।

Kotlin
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
val firestore = Firebase.firestore
firestore.useEmulator("10.0.2.2", 8080)

firestore.firestoreSettings = firestoreSettings {
    isPersistenceEnabled = false
}
Java
// 10.0.2.2 is the special IP address to connect to the 'localhost' of
// the host computer from an Android emulator.
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.useEmulator("10.0.2.2", 8080);

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(false)
        .build();
firestore.setFirestoreSettings(settings);
Swift
let settings = Firestore.firestore().settings
settings.host = "127.0.0.1:8080"
settings.cacheSettings = MemoryCacheSettings()
settings.isSSLEnabled = false
Firestore.firestore().settings = settings
Unity
FirebaseFirestore db = FirebaseFirestore.DefaultInstance;
// Connects to the Firestore Emulator running on port 8080
db.Settings.Host = "127.0.0.1:8080";
db.Settings.SslEnabled = false;

Web

import { getFirestore, connectFirestoreEmulator } from "firebase/firestore";

// firebaseApps previously initialized using initializeApp()
const db = getFirestore();
connectFirestoreEmulator(db, '127.0.0.1', 8080);

Web

// Firebase previously initialized using firebase.initializeApp().
var db = firebase.firestore();
if (location.hostname === "localhost") {
  db.useEmulator("127.0.0.1", 8080);
}

এমুলেটর ব্যবহার করে Firestore ইভেন্টের মাধ্যমে ট্রিগার করা Cloud Functions পরীক্ষা করার জন্য অতিরিক্ত সেট-আপের প্রয়োজন নেই। Firestore এবং Cloud Functions এমুলেটর দুটিই যখন চলছে, তারা স্বয়ংক্রিয়ভাবে একসাথে কাজ করে।

Admin SDK সেকেন্ড

FIRESTORE_EMULATOR_HOST এনভায়রনমেন্ট ভেরিয়েবল সেট করা থাকলে, Firebase Admin SDK অটোমেটিক Cloud Firestore এমুলেটরের সাথে কানেক্ট হয়ে যায়:

export FIRESTORE_EMULATOR_HOST="127.0.0.1:8080"

আপনার কোড Cloud Functions এমুলেটরের মধ্যে রান করলে, initializeApp কল করার সময় আপনার প্রোজেক্ট আইডি ও অন্যান্য কনফিগারেশন অটোমেটিক সেট হয়ে যায়।

আপনি যদি চান যে আপনার Admin SDK কোড অন্য পরিবেশে চলা একটি শেয়ার করা এমুলেটরের সাথে কানেক্ট হোক, তাহলে আপনাকে Firebase CLI ব্যবহার করে সেট করা একই প্রোজেক্ট আইডি উল্লেখ করতে হবে। আপনি সরাসরি initializeApp-এ প্রোজেক্ট আইডি পাস করতে পারেন অথবা GCLOUD_PROJECT এনভায়রনমেন্ট ভেরিয়েবল সেট করতে পারেন।

Node.js অ্যাডমিন SDK
admin.initializeApp({ projectId: "your-project-id" });
এনভায়রনমেন্ট ভেরিয়েবল
export GCLOUD_PROJECT="your-project-id"

Cloud Firestore REST API

Cloud Firestore এমুলেটর আপনার ডেটাবেসের সাথে ইন্টার‍্যাক্ট করার জন্য REST এন্ডপয়েন্ট প্রদান করে। সব REST API কল http://localhost:8080/v1 এন্ডপয়েন্টে করা উচিত।

REST কলের সম্পূর্ণ পাথ এই প্যাটার্ন অনুসরণ করে:

http://localhost:8080/v1/projects/{project_id}/databases/{database_id}/documents/{document_path}

যেমন, my-project-id প্রোজেক্টের জন্য users সংগ্রহে থাকা সব ডকুমেন্ট তালিকাভুক্ত করতে, আপনি curl ব্যবহার করতে পারেন:

curl -X GET "http://localhost:8080/v1/projects/my-project-id/databases/(default)/documents/users"

টেস্টের মধ্যে আপনার ডেটাবেস মুছুন

প্রোডাকশন Firestore ডেটাবেস ফ্লাশ করার জন্য কোনও প্ল্যাটফর্ম SDK পদ্ধতি প্রদান করে না, তবে Firestore এমুলেটর আপনাকে বিশেষভাবে এই উদ্দেশ্যে একটি REST এন্ডপয়েন্ট দেয়, যা একটি টেস্ট ফ্রেমওয়ার্ক সেটআপ/টিয়ারডাউন স্টেপ থেকে, একটি টেস্ট ক্লাস থেকে বা শেল থেকে (যেমন, curl সহ) একটি টেস্ট শুরু করার আগে কল করা যেতে পারে। আপনি এমুলেটর প্রসেসটি বন্ধ করার বিকল্প হিসেবে এই পদ্ধতিটি ব্যবহার করতে পারেন।

উপযুক্ত পদ্ধতিতে, HTTP DELETE অপারেশন করুন, আপনার Firebase projectID, যেমন firestore-emulator-example, নিম্নলিখিত এন্ডপয়েন্টে প্রদান করুন:

"http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

স্বাভাবিকভাবেই, আপনার কোডটি REST কনফার্মেশনের জন্য অপেক্ষা করবে যে ফ্লাশ শেষ হয়েছে বা ব্যর্থ হয়েছে।

আপনি শেল থেকে এই অপারেশনটি করতে পারেন:

// Shell alternative…
$ curl -v -X DELETE "http://localhost:8080/emulator/v1/projects/firestore-emulator-example/databases/(default)/documents"

এই ধরনের ধাপ প্রয়োগ করার পরে, আপনি নিজের টেস্টের ক্রম সাজাতে এবং আপনার ফাংশন ট্রিগার করতে পারবেন। আপনি নিশ্চিত থাকতে পারবেন যে রান করার মাঝে পুরনো ডেটা মুছে যাবে এবং আপনি একটি ফ্রেশ বেসলাইন টেস্ট কনফিগারেশন ব্যবহার করছেন।

ডেটা ইমপোর্ট ও এক্সপোর্ট করা

ডেটাবেস এবং Cloud Storage for Firebase এমুলেটর আপনাকে একটি চলমান এমুলেটর ইনস্ট্যান্স থেকে ডেটা এক্সপোর্ট করার অনুমতি দেয়। আপনার ইউনিট টেস্ট বা কন্টিনিউয়াস ইন্টিগ্রেশন ওয়ার্কফ্লোতে ব্যবহার করার জন্য ডেটার একটি বেসলাইন সেট নির্ধারণ করুন, তারপর টিমের মধ্যে শেয়ার করার জন্য এটি এক্সপোর্ট করুন।

firebase emulators:export ./dir

পরীক্ষা করার সময়, এমুলেটর চালু করার সময়, বেসলাইন ডেটা ইমপোর্ট করুন।

firebase emulators:start --import=./dir

আপনি এমুলেটরকে শাটডাউনের সময় ডেটা এক্সপোর্ট করার নির্দেশ দিতে পারেন, হয় এক্সপোর্ট পাথ নির্দিষ্ট করে অথবা --import ফ্ল্যাগে পাস করা পাথ ব্যবহার করে।

firebase emulators:start --import=./dir --export-on-exit

এই ডেটা ইমপোর্ট ও এক্সপোর্ট করার বিকল্পগুলি firebase emulators:exec কমান্ডের সাথেও কাজ করে। আরও জানতে, এমুলেটর কমান্ড রেফারেন্স দেখুন।

নিরাপত্তা সংক্রান্ত নিয়মের অ্যাক্টিভিটি ভিজ্যুয়ালাইজ করুন

প্রোটোটাইপ ও টেস্ট লুপের মাধ্যমে কাজ করার সময়, আপনি Local Emulator Suite-এর দেওয়া ভিজ্যুয়ালাইজেশন টুল ও রিপোর্ট ব্যবহার করতে পারবেন।

অনুরোধ মনিটর ব্যবহার করা

Cloud Firestore এমুলেটর আপনাকে Emulator Suite UI-এ ক্লায়েন্টের অনুরোধগুলি কল্পনা করতে দেয়, যার মধ্যে Firebase Security Rules-এর জন্য মূল্যায়ন ট্রেসিং অন্তর্ভুক্ত রয়েছে।

প্রতিটি অনুরোধের জন্য বিস্তারিত মূল্যায়ন ক্রম দেখতে Firestore > অনুরোধ ট্যাব খুলুন।

Firestore Emulator Requests Monitor, নিরাপত্তা সংক্রান্ত নিয়মের মূল্যায়ন দেখাচ্ছে

নিয়ম মূল্যায়ন রিপোর্ট ভিজ্যুয়ালাইজ করা

আপনার প্রোটোটাইপে নিরাপত্তা সংক্রান্ত নিয়ম যোগ করার সময় আপনি Local Emulator Suite ডিবাগ টুলের সাহায্যে সেগুলি ডিবাগ করতে পারবেন।

একগুচ্ছ টেস্ট চালানোর পরে, আপনি টেস্ট কভারেজ রিপোর্ট অ্যাক্সেস করতে পারবেন যা দেখায় যে আপনার প্রতিটি নিরাপত্তা নিয়ম কীভাবে মূল্যায়ন করা হয়েছে।

রিপোর্ট পেতে, এমুলেটর চলাকালীন এতে এক্সপোজড এন্ডপয়েন্ট কোয়েরি করুন। ব্রাউজার-ফ্রেন্ডলি ভার্সনের জন্য, নিম্নলিখিত URL ব্যবহার করুন:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage.html

এটি আপনার নিয়মকে এক্সপ্রেশন ও সাব-এক্সপ্রেশনে ভাগ করে দেয়। আপনি মূল্যায়নের সংখ্যা ও রিটার্ন করা ভ্যালু সহ আরও তথ্য পেতে মাউসওভার করতে পারেন। এই ডেটার র JSON ভার্সনের জন্য, আপনার কোয়েরিতে নিম্নলিখিত URL অন্তর্ভুক্ত করুন:

http://localhost:8080/emulator/v1/projects/<database_name>:ruleCoverage

এখানে, রিপোর্টের HTML ভার্সন সেইসব মূল্যায়ন হাইলাইট করে যেগুলি অনির্ধারিত এবং শূন্য-মান সংক্রান্ত সমস্যা দেখায়:

Cloud Firestore এমুলেটর কীভাবে প্রোডাকশন থেকে আলাদা

Cloud Firestore এমুলেটর কিছু উল্লেখযোগ্য সীমাবদ্ধতা সহ প্রোডাকশন পরিষেবার আচরণ নির্ভরযোগ্যভাবে প্রতিলিপি করার চেষ্টা করে।

Cloud Firestore-এর জন্য একাধিক ডেটাবেস সাপোর্ট

বর্তমানে, Emulator Suite UI ডিফল্ট ডেটাবেসের জন্য ইন্টার‍্যাক্টিভ ক্রিয়েশন, এডিটিং, ডিলিশন, অনুরোধ মনিটর করা এবং নিরাপত্তা সংক্রান্ত ভিজ্যুয়ালাইজেশন সাপোর্ট করে, তবে অতিরিক্ত নামযুক্ত ডেটাবেস নয়।

তবে, এমুলেটর নিজেই আপনার firebase.json ফাইলের কনফিগারেশনের উপর ভিত্তি করে এবং SDK বা REST API কলের উত্তরে একটি নামযুক্ত ডেটাবেস তৈরি করে।

ট্রানজ্যাকশন

প্রোডাকশনে দেখা যায় এমন সব ট্রানজ্যাকশন সংক্রান্ত আচরণ এমুলেটর বর্তমানে প্রয়োগ করে না। আপনি যখন এমন ফিচার পরীক্ষা করছেন যাতে একটি ডকুমেন্টে একাধিক একইসাথে লেখার কাজ জড়িত থাকে, তখন এমুলেটর লেখার অনুরোধ সম্পূর্ণ করতে ধীর হতে পারে। কিছু ক্ষেত্রে, লক রিলিজ হতে ৩০ সেকেন্ড পর্যন্ত সময় লাগতে পারে। প্রয়োজন হলে, সেই অনুযায়ী টেস্ট টাইম-আউট অ্যাডজাস্ট করার কথা বিবেচনা করুন।

ইন্ডেক্স

এমুলেটর কম্পাউন্ড ইন্ডেক্স ট্র্যাক করে না এবং এর পরিবর্তে যেকোনও সঠিক কোয়েরি এক্সিকিউট করবে। আপনার কোন কোন ইনডেক্স প্রয়োজন হবে তা নির্ধারণ করতে, আসল Cloud Firestore ইনস্ট্যান্সের সাথে আপনার অ্যাপ পরীক্ষা করে দেখতে ভুলবেন না।

সীমা

প্রোডাকশনে প্রয়োগ করা সব সীমা এমুলেটর প্রয়োগ করে না। যেমন, এমুলেটর এমন ট্রানজ্যাকশনের অনুমতি দিতে পারে যা প্রোডাকশন পরিষেবা খুব বড় বলে প্রত্যাখ্যান করবে। ডকুমেন্টেড সীমা সম্পর্কে আপনি জানেন কিনা তা নিশ্চিত করুন এবং সেগুলি এড়িয়ে যাওয়ার জন্য আপনার অ্যাপ ডিজাইন করুন।

এরপর কী করতে হবে?