# gm-libs, যে প্যাকেজে শুরু Webanion-এর প্রতিটি ফ্রন্টএন্ড ও ব্যাকএন্ড

Company: Webanion
Service: অতিরিক্ত সেবা
Period: 2026-06 - present
Tech: NestJS, TypeScript, Node.js, PostgreSQL, OpenFGA, Temporal, Docker, Software Architecture, SaaS, Verdaccio
Web: https://webanion.com
Canonical: https://webanion.com/bn/portfolio/gm-libs-reusable-nestjs-packages-for-auth-data-and-crud

ভার্সন করা, ফ্রেমওয়ার্ক-নিরপেক্ষ প্যাকেজের একটি পরিবার, যা থেকে Webanion-এর প্রতিটি ফ্রন্টএন্ড ও ব্যাকএন্ড শুরু হয়, সার্ভারে একটি NestJS স্তর আর ক্লায়েন্টে React, Vue ও Expo বাইন্ডিংসহ: পাসকি ও সিঙ্গল সাইন-অনসহ অথেনটিকেশন, ফিচার ফ্ল্যাগ, অডিট ট্রেইল, মাল্টি-টেন্যান্ট ডেটা, এনক্রিপশন, ফাইল, ডকুমেন্ট, বার্তা, রিয়েল-টাইম ও অফলাইন, ওয়েবহুক, ওয়ার্কার আর একটি UI কিট। প্রতিটি থাকে নিজস্ব প্রাইভেট রিপোজিটরিতে, নিজস্ব রিলিজসহ, ইনস্টল হয় স্টুডিওর প্রাইভেট npm রেজিস্ট্রি থেকে, আর স্টুডিওর কনসোল দেখায় কোন কনজিউমার কোন রিলিজে পিছিয়ে আছে।

## পুরো গল্পটা

অথেনটিকেশন, অডিট আর ফিচার ফ্ল্যাগ একবার সমাধান করে, ভার্সন দিয়ে, সবখানে আবার ব্যবহার করলে কেন একটি স্টুডিওর ক্লায়েন্টরা লাভবান হন।

### প্রতিটি ব্যাকএন্ড শুরু হচ্ছিল শূন্য থেকে

<p>ক্লায়েন্ট যে ব্যাকএন্ডের জন্য টাকা দেন, ক্লায়েন্টের কাছে গুরুত্বপূর্ণ কোনো কাজ করার আগেই তার প্রত্যেকটির একই ভিত লাগে: সাইন ইন, সেশন, পারমিশন, কনফিগারেশন, ফাইল স্টোরেজ, ইমেইল, PDF, ব্যাকগ্রাউন্ড জব আর একটি অডিট ট্রেইল। প্রতিটি প্রজেক্টের জন্য নতুন করে লিখলে এই অংশগুলোতে কয়েক সপ্তাহ চলে যায়, প্রজেক্ট থেকে প্রজেক্টে এগুলো আলাদা হয়, আর প্রত্যেকটির থাকে নিজস্ব বাগ।</p><p>gm-libs হলো এর উত্তর: যে কাজে এই ভিতের কোড আগেই নিজেকে প্রমাণ করেছে, সেখান থেকে তুলে এনে ভার্সন, ডকুমেন্টেশন ও চেঞ্জলগসহ প্যাকেজ হিসেবে মজবুত করা, আর স্টুডিও যে ফ্রন্টএন্ড ও ব্যাকএন্ডগুলো বানায় সেগুলোতে বারবার ব্যবহার করা।</p>

### সাইন ইন আর পারমিশন, একবারেই সমাধান

<p>অথেনটিকেশন প্যাকেজে আছে Argon2id দিয়ে পাসওয়ার্ড হ্যাশিং, রোটেট হওয়া রিফ্রেশ সেশনসহ স্বল্পমেয়াদি অ্যাক্সেস টোকেন, আর OpenFGA-র ওপর সম্পর্কভিত্তিক পারমিশন, ফলে “শাখার কর্মীরা শুধু নিজের শাখা দেখবেন” এমন একটি নিয়ম কোডজুড়ে ছড়িয়ে থাকা চেক নয়, বরং একটি ঘোষিত মডেল। এতে আরও আছে অ্যাকাউন্ট লিংকিংসহ সোশ্যাল ও OIDC সাইন ইন, পাসওয়ার্ড ছাড়া সাইন ইন, মাল্টি-ফ্যাক্টর অথেনটিকেশন, পাসকি আর সিঙ্গল সাইন-অন। নতুন একটি ব্যাকএন্ড একটি মডিউল ইমপোর্ট করেই এর সবকিছু পেয়ে যায়।</p><p>ক্লায়েন্টের জন্য এর মানে এমন নিরাপত্তা, যা আগেই একটি ফাইন্যান্স প্ল্যাটফর্মে মজবুত ও পরীক্ষিত হয়েছে, ডেডলাইনের চাপে নতুন করে বানানো নয়।</p>

### নিরাপদে চালু হয় ফিচার

<p>ফ্ল্যাগ প্যাকেজ ঠিক করে প্রতিটি টেন্যান্ট, শাখা, রোল বা ব্যক্তির জন্য কী দেখানো হবে আর কী চলবে, আর এটি কখনও কোনো রিকোয়েস্ট আটকে রাখে না: ফ্ল্যাগ পড়া হয় মেমরি থেকে, আর ফ্ল্যাগ সার্ভারে পৌঁছানো না গেলে প্রতিটি ফ্ল্যাগ ফিরে যায় একটি নিরাপদ ডিফল্টে, যা টিম অন্য কিছু না বেছে নিলে বন্ধ থাকে। এটি অথরাইজেশনের জায়গা নেয় না, তার সঙ্গে জোড়া বেঁধে কাজ করে, তাই ফ্ল্যাগ আর পারমিশন দুটোই হ্যাঁ না বললে কিছুই দেখা যায় না।</p><p>ক্লায়েন্টরা একটি ফিচার আগে একটি শাখা বা একজন ব্যক্তির জন্য চালু করে নজর রাখতে পারেন, তারপর নতুন ডিপ্লয় ছাড়াই সেটি আরও বড় পরিসরে ছড়াতে পারেন, আর Al-Insaf দল নিজেদের ফিচারগুলো এভাবেই চালায়।</p>

### এমন অডিট ট্রেইল, যা কাউকে ধীর করে না

<p>অডিট প্যাকেজ প্রতিটি রাইট অপারেশনে কে কী করেছে, কোথায় আর কখন, তা রেকর্ড করে, ক্যাটাগরি ও গুরুত্বের মাত্রা অনুযায়ী ভাগ করে, আর প্রতিটি এন্ট্রি রিকোয়েস্টের পথ থেকে সরিয়ে দেয়, যাতে সেগুলো ব্যাচে লেখা হয়। অডিট স্টোর ধীর হলে বা বিকল হলে তা লগ করা হয়, কিন্তু সিস্টেম ব্যবহার করা মানুষটিকে কখনো আটকে রাখে না, আর এ কারণেই গুরুত্বপূর্ণ সবকিছু অডিট করা নিরাপদ।</p>

### প্রতিটি প্যাকেজ, একটি কাজ

<p>অথ, ফ্ল্যাগ আর অডিটের পাশাপাশি এই পরিবার একটি ফ্রন্টএন্ড ও একটি ব্যাকএন্ডের বাকি প্রয়োজনগুলোও মেটায়, প্রতিটি প্যাকেজ একটি কাজ করে এবং একইভাবে যুক্ত হয়: নিচে ফ্রেমওয়ার্ক-নিরপেক্ষ কোড, সার্ভারের জন্য একটি NestJS স্তর, আর যেখানে কোনো প্যাকেজ ক্লায়েন্ট পর্যন্ত পৌঁছায় সেখানে React, Vue ও Expo বাইন্ডিং।</p><ul><li><strong>ভিত ও ডেটা:</strong> core (এরর, রিকোয়েস্ট কনটেক্সট, ক্রেডেনশিয়াল আড়াল করা লগার, কোনো সিক্রেট না থাকলে সঙ্গে সঙ্গে থেমে যাওয়া টাইপড কনফিগারেশন, টাকার হিসাব, পেজিনেশন, রেট লিমিটিং, আইডেমপোটেন্সি, হেলথ) আর db (মাল্টি-টেন্যান্ট Postgres, প্রতিটি টেন্যান্টের জন্য আলাদা ডাটাবেস, মাইগ্রেশন ও মডেলসহ)।</li><li><strong>পরিচয় ও অ্যাক্সেস:</strong> auth, flags, audit, আর নিয়মিত বদলানো কী দিয়ে ফিল্ড ও সিক্রেটের এনভেলপ এনক্রিপশনের জন্য crypto।</li><li><strong>ফাইল, ডকুমেন্ট ও বার্তা:</strong> স্টোরেজ ও সাইন করা আপলোডের জন্য media, pdf, স্ট্রিমিং CSV ও XLSX এক্সপোর্ট এবং যাচাই করা ইমপোর্টের জন্য tabular, ইমেইল, SMS, পুশ ও টিম চ্যাটের জন্য notifications, আর রিয়েল-টাইম কথোপকথনের জন্য chat।</li><li><strong>রিয়েল টাইম ও অফলাইন:</strong> প্রমাণীকৃত চ্যানেলভিত্তিক ইভেন্টের জন্য realtime, React, Vue ও Expo-র জন্য আবার নিজে থেকে যুক্ত হওয়া একটি ক্লায়েন্টসহ, আর offline, প্রতিটি ব্যবহারকারীর ক্যাশ ও ঠিক একবার পাঠানো একটি রাইট কিউয়ের জন্য, ব্রাউজারে এবং Expo অ্যাপে।</li><li><strong>ইন্টিগ্রেশন ও রানটাইম:</strong> Standard Webhooks স্পেক মেনে সাইন করা webhooks, Temporal-এর জন্য worker, মজবুত হেডলেস ব্রাউজার ও ভেতরের ঠিকানা ফিরিয়ে দেওয়া আউটবাউন্ড ফেচের জন্য web, স্ট্রিমিং ও এনক্রিপ্টেড ডাটাবেস ব্যাকআপের জন্য datavault, আর MCP সার্ভার বানানোর জন্য mcp।</li><li><strong>ইন্টারফেস:</strong> ui, ডিজাইন টোকেন থেকে React, Vue, Next.js ও Expo কম্পোনেন্ট পর্যন্ত।</li></ul><p>এগুলোর পাশে devkit হলো সেই যাচাই, যা প্রতিটি লাইব্রেরি রিলিজের আগে চালায়। প্রতিটি প্যাকেজ থাকে নিজস্ব প্রাইভেট রিপোজিটরিতে, নিজস্ব রিলিজসহ, তাই কোনো ক্লায়েন্টের সিস্টেম তখনই বদলায় যখন তার দল নতুন ভার্সন নেয়।</p>

### একটি ফিক্স, প্রতিটি সিস্টেমে

<p>স্টুডিওর ফ্রন্টএন্ড ও ব্যাকএন্ডগুলো একই ভিতের ওপর দাঁড়িয়ে আছে বলে একবার করা একটি সিকিউরিটি ফিক্স বা উন্নতি একটি ভার্সন বাম্পের মাধ্যমে সবগুলোতে পৌঁছে যায়, সঙ্গে থাকে একটি চেঞ্জলগ, যাতে লেখা থাকে কী বদলেছে এবং কেন। প্রতিটি রিলিজে সিমেন্টিক ভার্সন মেনে চলা হয়, তাই অন্য কোনো ক্লায়েন্টের নতুন কিছু দরকার হয়েছিল বলে কোনো ক্লায়েন্টের সিস্টেম ভেঙে যায় না, আর কোন কনজিউমার এখনও কোনো রিলিজ নেয়নি, কনসোল সেদিনই তা দেখিয়ে দেয়।</p><p>ক্লায়েন্টদের জন্য ফলাফল হলো দ্রুত ডেলিভারি, কম অপ্রত্যাশিত ঝামেলা, আর এমন অংশ দিয়ে তৈরি পণ্য যা আগেই অন্য জায়গায় প্রোডাকশন পেরিয়ে এসেছে, যার মধ্যে আছে <a href="/portfolio/al-insaf-cooperative-finance-platform-with-ledger-and-loans">Al-Insaf-এর গল্পে</a> থাকা লেজার-মানের ফাইন্যান্স প্ল্যাটফর্ম।</p>

### প্রতিটি প্যাকেজ, প্রকাশিত ও নজরে রাখা

<p>প্রতিটি প্যাকেজ ইনস্টল হয় স্টুডিওর প্রাইভেট npm রেজিস্ট্রি থেকে, আর স্টুডিওর কনসোল সেই রেজিস্ট্রি পড়ে ঠিক যেভাবে একজন কনজিউমার পড়ে। এটি রেজিস্ট্রিকে পিং করে, প্রতিটি প্যাকেজের প্রতিটি ভার্সন তার প্রকাশের সময়, প্যাক করা আকার ও ইন্টেগ্রিটিসহ পড়ে, আর কনজিউমারদের নিজস্ব ম্যানিফেস্ট তাদের ডিফল্ট ব্রাঞ্চ থেকে পড়ে যাচাই করে প্রতিটি ডিপেন্ডেন্সি সর্বশেষ রিলিজে পৌঁছায় কি না। একটি লাইব্রেরি পরিবার ততটাই কাজের, যতটা প্রমাণ থাকে যে সেটি ব্যবহার করা প্রতিটি সিস্টেম হালনাগাদ, আর সেই প্রমাণ থাকে এখানেই।</p><p>ছবি নেওয়ার দিন, ৩০ সেপ্টেম্বর ২০২৬, ভিউটিতে দেখা গিয়েছিল রেজিস্ট্রি চালু, প্রতিটি প্যাকেজ প্রকাশিত, রেজিস্ট্রির নিজের একটি সাম্প্রতিক ব্যাকআপ, আর স্টুডিওর নিজস্ব টুলস ছাড়া প্রতিটি কনজিউমার সর্বশেষ রিলিজে, সেই টুলস তখনও core ও pdf-এর পুরোনো রিলিজে ছিল।</p>

### GitHub Release থেকে npm install পর্যন্ত, স্টুডিওর রেজিস্ট্রির মধ্য দিয়ে

<p>কোনো লাইব্রেরিতে একটি ট্যাগ দিলে GitHub-এ তার রিলিজ চলে এবং রিলিজে একটি প্যাক করা ফাইল যুক্ত হয়। ক্লাস্টারের ভেতরের একটি সিঙ্ক প্রতি পাঁচ মিনিটে ঠিক সেই ফাইলটিই প্রকাশ করে, ফলে রিলিজ আর রেজিস্ট্রিতে একই বাইট থাকে, যা প্রতি রাতে আবার যাচাই করা হয়। পড়তে লগইন লাগে, আর পাবলিক নামটি কোনো লেখা গ্রহণ করে না। GitHub Packages বাদ দেওয়া হয়েছিল, কারণ লাইব্রেরিগুলো আর তাদের কনজিউমাররা আলাদা আলাদা অর্গানাইজেশনে থাকে।</p>
