SupDesk SDK पेश हैं
हर गंभीर उत्पाद को अंततः एक एकीकरण परत लिखनी पड़ती है — एक स्क्रिप्ट जो इनबॉक्स से पढ़ती है, एक क्रॉन जॉब जो बोर्ड को सिंक करता है, एक एंडपॉइंट जो आपके अपने UI से फ़ीडबैक दर्ज करता है। जब आप कीबोर्ड पर होते हैं तो SupDesk कंसोल बेहतरीन है। जैसे ही आप इसे स्वचालित करना चाहते हैं, आपको एक API की आवश्यकता होती है, और एक API उतनी ही अच्छी होती है जितने अच्छे आपके पास उससे बात करने वाले क्लाइंट होते हैं।
आज हम उनमें से चार रिलीज़ कर रहे हैं।
SDKs से मिलें
- JavaScript / TypeScript — npm पर
supdesk। बिना किसी संशोधन के Node 18+, Deno, Bun और Cloudflare Workers में चलता है, शून्य रनटाइम निर्भरताओं के साथ। - Python — PyPI पर
supdesk। एक सिंकSupDeskक्लाइंट और एक एसिंकAsyncSupDeskक्लाइंट जो एक ही httpx कोर शेयर करते हैं। - Go —
github.com/rabinapps/supdesk-go। केवल मानक लाइब्रेरी, इसलिए यह हर उस जगह बिल्ड होता है जहाँ Go 1.23+ चलता है — जिसमेंGOOS=wasip1के माध्यम से Cloudflare Workers भी शामिल है। - Dart — pub.dev पर
supdesk। dio पर बना, इसलिए इंटरसेप्टर,CancelToken, और प्रॉक्सी एडाप्टर सब उसी तरह काम करते हैं जैसी आप अपेक्षा करते हैं।
इंस्टॉल करें
npm install supdeskpip install supdeskgo get github.com/rabinapps/supdesk-godependencies:
supdesk: ^0.1.0एक API, चार भाषाएँ
SDKs चार अलग रैपर नहीं हैं; वे हर भाषा में एक ही शब्दार्थ के साथ एक ही API हैं। यदि आप एक में सबमिशन पढ़ सकते हैं, तो आप चारों में पढ़ सकते हैं।
ऑटो-पेजिनेशन। list() एक पेज लौटाता है जो एक एसिंक इटरेबल भी है — for await के साथ हर पेज को ब्राउज़ करें, या जब आपको केवल पहली पेज की आवश्यकता हो तो वही खींचें।
टाइप किए गए संसाधन। सबमिशन, फ़ीडबैक, चेंजलॉग प्रविष्टियाँ, संदेश, वेटलिस्ट साइनअप, बीटा प्रोग्राम और परीक्षार्थी, और हेल्प सेंटर लेख और श्रेणियाँ — प्रत्येक उन विधियों और टाइप किए गए मापदंडों के साथ जिनकी आप अपेक्षा करते हैं, ताकि टाइपो प्रोडक्शन के बजाय कंपाइल टाइम पर ही विफल हो जाएँ।
टाइप की गई त्रुटियाँ। हर विफलता एक ही आधार से निकलती है — JS और Python में SupDeskError, Go में APIError, Dart में SupDeskException — इसलिए एक ही catch सब कुछ संभाल लेता है जबकि instanceof या errors.As अभी भी विशिष्ट मामले तक सीमित रखता है।
वेबहुक। constructEventFromRequest, construct_event_from_headers, ConstructEvent, और constructEventFromHeaders निरंतर समय में SupDesk के हस्ताक्षर को सत्यापित करते हैं, ताकि आप उस पर भरोसा कर सकें जिस पर आपका रिसीवर कार्रवाई करता है।
अंतर्निहित लचीलापन। प्रत्येक क्लाइंट घातीय बैकऑफ और जिटर के साथ पुनः प्रयास करता है, Retry-After का सम्मान करता है, और कभी भी ऐसे मीटर वाले POST का पुनः प्रयास नहीं करता जिसे वह पहले ही स्वीकार कर चुका हो — एक अस्थिर नेटवर्क उपयोगकर्ता के टिकट को दो बार दर्ज नहीं कर सकता।
डिज़ाइन से सर्वर-साइड
SupDesk API कुंजियाँ आपके पूरे प्रोजेक्ट के रूप में प्रमाणित होती हैं, इसलिए SDK ब्राउज़र में चलने से इनकार करते हैं — JS और Dart कंस्ट्रक्टर यदि किसी DOM या क्लाइंट बिल्ड का पता लगाते हैं तो अपवाद फेंकते हैं, और README स्पष्ट रूप से बताते हैं कि क्यों। कुंजी को सर्वर-साइड पर्यावरण चर में रखें, आपके द्वारा नियंत्रित एंडपॉइंट के पीछे।
दो और बातें जो जानने योग्य हैं: पठन हर योजना पर काम करता है, जबकि लेखन (POST/PATCH/DELETE) के लिए एक सशुल्क योजना की आवश्यकता होती है; और कुंजियाँ प्रोजेक्ट-स्कोप वाली होती हैं, इसलिए प्रत्येक वातावरण को उसकी अपनी कुंजी दें और आप बाकी को छुए बिना एक को रद्द कर सकते हैं।
SupDesk कहाँ उपयुक्त बैठता है
SDKs SupDesk SaaS एकीकरण गाइड का बैकएंड आधा हिस्सा हैं — उन उत्पादों के लिए मल्टी-टेनेंट सपोर्ट, API एक्सेस, और वेबहुक जो अपने स्वयं के सिस्टम में सपोर्ट एम्बेड करना चाहते हैं। पूरा संदर्भ API दस्तावेज़ में है।
शुरू करें
वर्कस्पेस सेटिंग्स → API कुंजियाँ से एक API कुंजी प्राप्त करें, अपने स्टैक के लिए क्लाइंट इंस्टॉल करें, और इस पेज पर क्विक स्टार्ट चलाएँ। फिर रेपो को क्लोन करें और README पढ़ें।
बैकएंड एकीकरण के लिए सर्वर-साइड SDK
प्रत्येक SDK के GitHub रिपॉज़िटरी से लाइव कोड उदाहरण लोड किए गए।
import { SupDesk } from "supdesk";
const supdesk = new SupDesk({ apiKey: process.env.SUPDESK_API_KEY! });
// Auto-pages: iterating walks every page for you.
for await (const submission of await supdesk.submissions.list({
status: "open",
})) {
console.log(submission.title);
}
await supdesk.submissions.create({
type: "bug",
title: "Export button does nothing",
email: "user@example.com",
body: "Clicking Export on the reports page has no effect.",
});from supdesk import SupDesk
supdesk = SupDesk() # api_key=... or $SUPDESK_API_KEY
# Auto-pages: iterating walks every page for you.
for submission in supdesk.submissions.list(status="open"):
print(submission.title)
supdesk.submissions.create(
type="bug",
title="Export button does nothing",
email="user@example.com",
body="Clicking Export on the reports page has no effect.",
)import "github.com/rabinapps/supdesk-go/supdesk"
client, err := supdesk.New(os.Getenv("SUPDESK_API_KEY"))
if err != nil {
log.Fatal(err)
}
page, err := client.Submissions.List(ctx, supdesk.SubmissionsListParams{
Status: ptr("open"),
})
if err != nil {
return err
}
// Auto-pages: All walks every page for you.
for sub, err := range page.All(ctx) {
if err != nil {
return err
}
fmt.Println(sub.Title)
}
_, err = client.Submissions.Create(ctx, supdesk.SubmissionsCreateParams{
Type: supdesk.SubmissionTypeBug,
Title: "Export button does nothing",
Email: "user@example.com",
Body: "Clicking Export on the reports page has no effect.",
})import 'dart:io';
import 'package:supdesk/supdesk.dart';
final supdesk = SupDesk(apiKey: Platform.environment['SUPDESK_API_KEY']!);
// Auto-pages: the stream walks every page for you.
final page = await supdesk.submissions.list(status: PostStatus.open);
await for (final submission in page.autoPaging()) {
print(submission.title);
}
await supdesk.submissions.create(
type: SubmissionType.bug,
title: 'Export button does nothing',
email: 'user@example.com',
body: 'Clicking Export on the reports page has no effect.',
);