Ini adalah demonstrasi & contoh aplikasi yang dirancang untuk menjadi sistem obrolan berbasis web multi-pengguna yang sederhana.
Ini menyediakan obrolan grup persisten, obrolan pribadi pengguna ke pengguna, daftar pengguna, deteksi idle (jauh dari keyboard) dan beberapa fitur lainnya.
Itu dibangun di beberapa teknologi Azure, termasuk: Web PubSub, Aplikasi Web Statis , dan Penyimpanan Tabel
?? Catatan. Ini dibuat sebagai proyek pribadi, dibuat untuk membantu pembelajaran sambil membangun sesuatu yang menarik. Kode ini dilengkapi dengan semua peringatan yang mungkin Anda harapkan dari proyek semacam itu.
Sasaran:
Kasus penggunaan & fitur utama:
Ini adalah antarmuka web utama yang digunakan oleh pengguna akhir melalui browser.
Sumber untuk ini ditemukan di client/ dan terdiri dari aplikasi ES6 JS murni mandiri yang statis, tidak diperlukan bundling atau Node.js. Itu ditulis menggunakan Vue.js sebagai kerangka pendukung, dan Bulma sebagai kerangka CSS.
Beberapa catatan:
client/js/app.js
menunjukkan cara membuat aplikasi Vue.js dengan komponen turunan menggunakan pendekatan ini. Mayoritas logika klien ada di sini.client/js/components/chat.js
adalah komponen Vue.js yang digunakan untuk meng-host setiap tab obrolan dalam aplikasi.auth/
khusus yang disediakan oleh Static Web Apps digunakan untuk memasukkan pengguna dan mengambil detail pengguna mereka, seperti userId.Ini adalah backend, yang menangani kejadian websocket ke dan dari Azure Web PubSub, dan menyediakan REST API untuk beberapa operasi.
Sumbernya ditemukan di api/ dan terdiri dari Aplikasi Fungsi Azure Node.js. Ini terhubung ke Azure Table Storage untuk mempertahankan obrolan grup dan data pengguna (Table Storage dipilih karena sederhana & murah). Ini tidak dihosting di Aplikasi Fungsi Azure yang berdiri sendiri, melainkan disebarkan ke Aplikasi Web Statis sebagai bagian dari dukungan API tanpa servernya
Ada empat fungsi HTTP yang semuanya dilayani dari jalur /api/
default
eventHandler
- Penerima webhook untuk peristiwa "hulu" yang dikirim dari layanan Azure Web PubSub, berisi sebagian besar logika aplikasi. Tidak dipanggil langsung oleh klien, hanya Sub Azure WebPub.getToken
- Dipanggil oleh klien untuk mendapatkan token akses dan URL untuk terhubung melalui WebSockets ke layanan Azure Web PubSub. Harus dipanggil dengan userId di kueri URL, misalnya GET /api/getToken?userId={user}
getUsers
- Mengembalikan daftar pengguna yang masuk, perhatikan rute untuk fungsi ini adalah /api/users
getChats
- Mengembalikan daftar obrolan grup yang aktif, perhatikan rute untuk fungsi ini adalah /api/chats
Status ditangani dengan state.js
yang merupakan fungsi pengekspor modul ES6 yang mendukung CRUD status untuk pengguna dan obrolan. Modul ini menjalankan semua interaksi dengan Azure Tables, dan menyediakan antarmuka yang relatif transparan, sehingga backend penyimpanan yang berbeda dapat ditukar.
Ada aliran pesan dua arah antara klien dan server melalui Azure Web PubSub dan pengendali peristiwa
Subprotokol json.webpubsub.azure.v1 digunakan daripada WebSockets dasar, subprotokol ini menyediakan sejumlah fitur: pengguna dapat ditambahkan ke grup, klien dapat mengirim peristiwa khusus (menggunakan type: event
), dan juga mengirim pesan langsung ke klien lain tanpa melalui server (menggunakan type: sendToGroup
)
Catatan:
Acara & obrolan dikirim menggunakan subprotokol json.webpubsub.azure.v1
Pesan obrolan yang dikirim dari klien menggunakan sendToGroup
dan muatan JSON khusus dengan tiga bidang message
, fromUserId
& fromUserName
, pesan-pesan ini diteruskan dari klien ke klien oleh Azure Web PubSub, server tidak pernah diberi tahu tentangnya:
{
type : 's endToGroup ',
group : < chatId > ,
dataType : 'j son ',
data : {
message : < message text > ,
fromUserId : < userId > ,
fromUserName : < userName > ,
},
}
Peristiwa yang ditujukan untuk server backend dikirim sebagai pesan WebSocket dari klien melalui subprotokol yang sama dengan jenis event
, dan subjenis aplikasi tertentu, misalnya
{
type : 'e vent ',
event : 'j oinChat ',
dataType : 't ext ',
data : < chatId > ,
}
Jenis acaranya adalah:
Fungsi eventHandler
API backend memiliki kasus untuk setiap peristiwa pengguna ini, bersama dengan penangan untuk peristiwa sistem koneksi & pemutusan.
Pesan yang dikirim dari server memiliki muatan khusus aplikasi Chatr khusus sebagai berikut:
{
chatEvent : < eventType > ,
data : < JSON object type dependant >
}
Dimana eventType
adalah salah satu dari:
Kode klien di client/js/app.js
menangani pesan-pesan ini saat diterima oleh klien, dan bereaksi sesuai dengan itu.
Rencana proyek ini adalah menggunakan Azure Web PubSub dan Azure Static Web Apps , dan menghosting komponen sisi server sebagai serangkaian fungsi tanpa server dalam dukungan API Static Web Apps (yang sebenarnya merupakan Azure Functions ). Azure Static Web Apps dipilih karena memiliki dukungan luar biasa untuk login dan autentikasi pengguna tanpa kode dan tanpa konfigurasi, yang ingin saya manfaatkan.
Beberapa komentar mengenai pendekatan ini:
webPubSubConnection
. Untuk mengirim pesan kembali ke Web PubSub, SDK server cukup digunakan dalam kode fungsi daripada menggunakan pengikatan keluaran webPubSub
. Status di Tabel Azure terdiri dari dua tabel (koleksi) bernama chats
dan users
Karena setiap obrolan berisi objek bersarang di dalam bidang member, setiap obrolan disimpan sebagai string JSON dalam bidang yang disebut data
. PartitionKey tidak digunakan dan di-hardcode ke string "chatr". RowKey dan kolom id di dalam objek data adalah sama.
Contoh entitas data obrolan
{
"id" : " eab4b030-1a3d-499a-bd89-191578395910 " ,
"name" : " This is a group chat " ,
"members" : {
"0987654321" : {
"userId" : " 0987654321 " ,
"userName" : " Another Guy "
},
"1234567890" : {
"userId" : " 1234567890 " ,
"userName" : " Ben "
}
},
"owner" : " 1234567890 "
}
Pengguna disimpan sebagai entitas dengan bidang (kolom) yang dijelaskan di bawah. Karena tidak ada bidang bersarang, maka tidak perlu melakukan enkode sebagai string JSON. Sekali lagi PartitionKey tidak digunakan dan di-hardcode ke string "chatr".
userId
dikembalikan dari titik akhir autentikasi Static Web Appstwitter
, aad
atau github
Lihat makefile
$ make
help This help message
lint ? Lint & format, will not fix but sets exit code on error
lint-fix Lint & format, will try to fix errors and modify code
run ? Run server locally using Static Web Apps CLI
clean ? Clean up project
deploy Deploy everything to Azure using Bicep
tunnel ? Start loophole tunnel to expose localhost
Penerapannya sedikit rumit karena jumlah komponen dan konfigurasi di antara komponen tersebut. deploy
target makefile harus menyebarkan semuanya untuk Anda dalam satu langkah menggunakan templat Bicep yang ada di folder deploy/
Lihat readme di folder penerapan untuk detail dan instruksi
Hal ini mungkin dilakukan tetapi memerlukan sedikit usaha karena layanan Azure Web PubSub harus dapat memanggil titik akhir HTTP di mesin lokasi Anda, sehingga terowongan telah digunakan.
Saat dijalankan secara lokal, CLI Aplikasi Web Statis digunakan dan ini menyediakan titik akhir otentikasi pengguna palsu untuk kami.
Ringkasan langkah-langkahnya adalah:
api/local.settings.sample.json
ke api/local.settings.json
dan edit nilai pengaturan yang diperlukan.loophole http 7071 --hostname chatr
https://{{hostname-of-tunnel-service}}/api/eventHandler
make run
http://localhost:4280/index.html