@kavtuai/guildgate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/LICENSE +21 -0
- package/README.md +399 -0
- package/README.tr.md +397 -0
- package/SECURITY.md +36 -0
- package/TEST_REPORT.md +50 -0
- package/bin/guildgate-doctor.mjs +91 -0
- package/bin/guildgate-writing-check.mjs +73 -0
- package/dist/action.d.ts +65 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/action.js +4 -0
- package/dist/action.js.map +1 -0
- package/dist/cache.d.ts +23 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +53 -0
- package/dist/cache.js.map +1 -0
- package/dist/crypto.d.ts +15 -0
- package/dist/crypto.d.ts.map +1 -0
- package/dist/crypto.js +87 -0
- package/dist/crypto.js.map +1 -0
- package/dist/discord/authorizer.d.ts +41 -0
- package/dist/discord/authorizer.d.ts.map +1 -0
- package/dist/discord/authorizer.js +101 -0
- package/dist/discord/authorizer.js.map +1 -0
- package/dist/discord/oauth.d.ts +64 -0
- package/dist/discord/oauth.d.ts.map +1 -0
- package/dist/discord/oauth.js +226 -0
- package/dist/discord/oauth.js.map +1 -0
- package/dist/discord/permissions.d.ts +85 -0
- package/dist/discord/permissions.d.ts.map +1 -0
- package/dist/discord/permissions.js +99 -0
- package/dist/discord/permissions.js.map +1 -0
- package/dist/discord.d.ts +4 -0
- package/dist/discord.d.ts.map +1 -0
- package/dist/discord.js +4 -0
- package/dist/discord.js.map +1 -0
- package/dist/errors.d.ts +43 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +57 -0
- package/dist/errors.js.map +1 -0
- package/dist/express.d.ts +3 -0
- package/dist/express.d.ts.map +1 -0
- package/dist/express.js +3 -0
- package/dist/express.js.map +1 -0
- package/dist/fastify.d.ts +3 -0
- package/dist/fastify.d.ts.map +1 -0
- package/dist/fastify.js +3 -0
- package/dist/fastify.js.map +1 -0
- package/dist/http/express.d.ts +24 -0
- package/dist/http/express.d.ts.map +1 -0
- package/dist/http/express.js +60 -0
- package/dist/http/express.js.map +1 -0
- package/dist/http/fastify.d.ts +25 -0
- package/dist/http/fastify.d.ts.map +1 -0
- package/dist/http/fastify.js +57 -0
- package/dist/http/fastify.js.map +1 -0
- package/dist/i18n.d.ts +5 -0
- package/dist/i18n.d.ts.map +1 -0
- package/dist/i18n.js +66 -0
- package/dist/i18n.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -0
- package/dist/kernel.d.ts +83 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +395 -0
- package/dist/kernel.js.map +1 -0
- package/dist/memory-store.d.ts +13 -0
- package/dist/memory-store.d.ts.map +1 -0
- package/dist/memory-store.js +261 -0
- package/dist/memory-store.js.map +1 -0
- package/dist/realtime/hub.d.ts +42 -0
- package/dist/realtime/hub.d.ts.map +1 -0
- package/dist/realtime/hub.js +152 -0
- package/dist/realtime/hub.js.map +1 -0
- package/dist/realtime/outbox.d.ts +12 -0
- package/dist/realtime/outbox.d.ts.map +1 -0
- package/dist/realtime/outbox.js +18 -0
- package/dist/realtime/outbox.js.map +1 -0
- package/dist/realtime.d.ts +3 -0
- package/dist/realtime.d.ts.map +1 -0
- package/dist/realtime.js +3 -0
- package/dist/realtime.js.map +1 -0
- package/dist/redis.d.ts +49 -0
- package/dist/redis.d.ts.map +1 -0
- package/dist/redis.js +233 -0
- package/dist/redis.js.map +1 -0
- package/dist/resilience.d.ts +23 -0
- package/dist/resilience.d.ts.map +1 -0
- package/dist/resilience.js +85 -0
- package/dist/resilience.js.map +1 -0
- package/dist/security.d.ts +21 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +94 -0
- package/dist/security.js.map +1 -0
- package/dist/session.d.ts +32 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +97 -0
- package/dist/session.js.map +1 -0
- package/dist/stores.d.ts +73 -0
- package/dist/stores.d.ts.map +1 -0
- package/dist/stores.js +4 -0
- package/dist/stores.js.map +1 -0
- package/dist/testing.d.ts +32 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +60 -0
- package/dist/testing.js.map +1 -0
- package/dist/types.d.ts +183 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/docs/WRITING_STYLE.md +118 -0
- package/docs/architecture.md +83 -0
- package/docs/custom-stores.md +111 -0
- package/docs/owner-management.md +44 -0
- package/docs/research-notes.md +61 -0
- package/docs/setup.md +104 -0
- package/docs/threat-model.md +79 -0
- package/docs/tr/arastirma-notlari.md +41 -0
- package/docs/tr/guvenlik-bildirimi.md +7 -0
- package/docs/tr/kurulum.md +63 -0
- package/docs/tr/mimari.md +59 -0
- package/docs/tr/sahip-yonetimi.md +7 -0
- package/docs/tr/tehdit-modeli.md +39 -0
- package/docs/tr/veritabani-suruculeri.md +23 -0
- package/docs/tr/yazim-kilavuzu.md +116 -0
- package/docs/uml/action-sequence.mmd +39 -0
- package/docs/uml/components.mmd +84 -0
- package/docs/uml/deployment.mmd +19 -0
- package/docs/uml/oauth-sequence.mmd +30 -0
- package/docs/uml/realtime-sequence.mmd +28 -0
- package/package.json +90 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
# Yazım kuralları
|
|
2
|
+
|
|
3
|
+
Bu dosya GuildGate belgeleri, hata metinleri, örnekler, sürüm notları ve depo sayfaları için yazım kurallarını belirler.
|
|
4
|
+
|
|
5
|
+
Kontrol listesi, 25 Temmuz 2026 tarihinde incelenen Wikipedia **Signs of AI writing** sayfasındaki başlıklardan hazırlanmıştır. Sayfa, bu işaretlerin kesin kanıt olmadığını belirtir. GuildGate bu listeyi yazar tespiti için değil, metin düzenleme kontrolü için kullanır.
|
|
6
|
+
|
|
7
|
+
Kaynak: https://en.wikipedia.org/wiki/Wikipedia:Signs_of_AI_writing
|
|
8
|
+
|
|
9
|
+
## İçerikten çıkarılacak kalıplar
|
|
10
|
+
|
|
11
|
+
1. **Dayanaksız önem yükleme.** Küçük bir fonksiyonun sektörü değiştirdiği, kalıcı miras bıraktığı veya geniş bir dönüşümün parçası olduğu kanıt olmadan yazılmaz.
|
|
12
|
+
2. **Tanınmışlık doldurması.** Basın, uzmanlar veya topluluklardan söz edilecekse kaynak adı ve desteklediği bilgi belirtilir.
|
|
13
|
+
3. **Yüzeysel yorum.** Bir teknik gerçeğe genel anlam eklemek yerine istek, oturum, kayıt veya yönetici üzerindeki etkisi açıklanır.
|
|
14
|
+
4. **Reklam dili.** Teknik bölümde övgü yerine davranış, sınır ve ödünleşim yazılır.
|
|
15
|
+
5. **Belirsiz kaynak.** “Birçok geliştiriciye göre”, “genel olarak bilinir” veya “uzmanlar katılıyor” gibi cümleler kaynak yoksa kaldırılır.
|
|
16
|
+
6. **Hazır gelecek bölümleri.** Projeye özel iş, sorumlu ve kabul ölçütü yoksa “Zorluklar ve gelecek” bölümü eklenmez.
|
|
17
|
+
7. **Konu adını sürekli tekrarlama.** Genel kavramlar özel ad gibi her paragrafta yinelenmez.
|
|
18
|
+
8. **Kanıtsız eğilim.** Artan talep, hızlı benimsenme veya değişen sektör beklentisi gibi ifadeler güncel kaynak olmadan kullanılmaz.
|
|
19
|
+
|
|
20
|
+
## Kelime ve cümle kontrolleri
|
|
21
|
+
|
|
22
|
+
Aşağıdaki İngilizce kelimeler tek başına yasak değildir. Somut bir işlevi saklıyorsa daha açık fiille değiştirilir:
|
|
23
|
+
|
|
24
|
+
- additionally
|
|
25
|
+
- align with
|
|
26
|
+
- boasts
|
|
27
|
+
- bolstered
|
|
28
|
+
- crucial
|
|
29
|
+
- delve
|
|
30
|
+
- emphasizing
|
|
31
|
+
- enduring
|
|
32
|
+
- enhance
|
|
33
|
+
- fostering
|
|
34
|
+
- garner
|
|
35
|
+
- highlight
|
|
36
|
+
- interplay
|
|
37
|
+
- intricate
|
|
38
|
+
- key
|
|
39
|
+
- landscape
|
|
40
|
+
- meticulous
|
|
41
|
+
- pivotal
|
|
42
|
+
- robust
|
|
43
|
+
- showcase
|
|
44
|
+
- tapestry
|
|
45
|
+
- testament
|
|
46
|
+
- underscore
|
|
47
|
+
- valuable
|
|
48
|
+
- vibrant
|
|
49
|
+
|
|
50
|
+
Ayrıca şu alışkanlıklar temizlenir:
|
|
51
|
+
|
|
52
|
+
- “Olmak”, “sahip olmak” veya “yapmak” gibi açık fiillerden kaçıp süslü fiil kullanmak.
|
|
53
|
+
- Anlam gerektirmediği hâlde “yalnızca X değil, aynı zamanda Y”, “X değil Y” veya “X yerine Y” karşıtlığı kurmak.
|
|
54
|
+
- Cümleyi tamamlanmış göstermek için üç sıfat, üç fayda veya üç yan cümle eklemek.
|
|
55
|
+
- Aynı sözcüğü tekrar etmemek uğruna zorlanmış eş anlamlılar kullanmak.
|
|
56
|
+
- Paragrafa hazır giriş cümlesiyle başlamak.
|
|
57
|
+
- Bölümü yeni bilgi vermeyen özet cümlesiyle kapatmak.
|
|
58
|
+
|
|
59
|
+
## Biçim kontrolleri
|
|
60
|
+
|
|
61
|
+
- Her kelimesi büyük harfle başlayan İngilizce başlıklar.
|
|
62
|
+
- Normal kelimeleri veya hemen her maddeyi kalın yazmak.
|
|
63
|
+
- İçeriği zayıf, kalın mini başlıklardan oluşan dikey listeler.
|
|
64
|
+
- Virgül veya nokta yeterliyken sık uzun çizgi kullanmak.
|
|
65
|
+
- Teknik belge, hata, changelog veya güvenlik metninde süs emojisi.
|
|
66
|
+
- Az veriyi büyük göstermek için tablo kullanmak.
|
|
67
|
+
- Kod veya komuta kıvrımlı tırnak kopyalamak.
|
|
68
|
+
- Başlık seviyelerini atlamak.
|
|
69
|
+
- Her başlıktan önce yatay çizgi eklemek.
|
|
70
|
+
- Markdown göstermeyen alana Markdown yapıştırmak.
|
|
71
|
+
|
|
72
|
+
## Kullanıcıya konuşan hazır metinler
|
|
73
|
+
|
|
74
|
+
Yayımlanmış dosyada asistan konuşması bulunmaz:
|
|
75
|
+
|
|
76
|
+
- Devam etme, genişletme veya başka bir konuda yardım teklifleri.
|
|
77
|
+
- Bilgi kesim tarihi açıklamaları.
|
|
78
|
+
- Okuyucunun ne isteyebileceğine ilişkin tahminler.
|
|
79
|
+
- “İşte düzenlenmiş sürüm”, “elbette” veya “umarım yardımcı olur” gibi çerçeve cümleleri.
|
|
80
|
+
- `[isim ekle]`, `[kaynak ekle]` veya `TODO` biçiminde boş yerler.
|
|
81
|
+
- Şablon talimatları.
|
|
82
|
+
- Prompt, üretim yöntemi veya ret açıklaması.
|
|
83
|
+
|
|
84
|
+
## Reddedilecek işaretleme ve kaynak kalıntıları
|
|
85
|
+
|
|
86
|
+
Yayın kontrolü şunları bulmalıdır:
|
|
87
|
+
|
|
88
|
+
- Bozuk Markdown kod blokları, bağlantılar, referanslar veya HTML parçaları.
|
|
89
|
+
- Markdown dosyasında wiki işaretlemesi.
|
|
90
|
+
- `contentReference`, `oaicite`, `turn0search`, `attributableIndex` veya `+1` gibi model içi kaynak dizgileri.
|
|
91
|
+
- Gemini citation span, Grok card, DeepSeek dagger, Perplexity yükleme referansı veya `:::writing` bloğu.
|
|
92
|
+
- Var olmayan şablon, kategori, dosya, import, komut, ortam değişkeni veya paket export’u.
|
|
93
|
+
- Kaynak bağlantısında `utm_source` gibi takip parametreleri.
|
|
94
|
+
- Açılmayan ya da yanındaki cümleyi desteklemeyen DOI, ISBN, paket veya belge bağlantısı.
|
|
95
|
+
- Tanımlanıp kullanılmayan kaynaklar.
|
|
96
|
+
|
|
97
|
+
## Depoya özel kurallar
|
|
98
|
+
|
|
99
|
+
1. Her dosyada tek dil kullanılır. `README.md` İngilizce, `README.tr.md` Türkçedir.
|
|
100
|
+
2. İşlemi yapan adlandırılır. Uygun olduğunda “sistem” yerine çekirdek, sürücü, uygulama, Discord veya yönetici yazılır.
|
|
101
|
+
3. Hata adı belirtilir. “Bir sorun oluştu” yerine `CSRF_INVALID`, `RATE_LIMITED` veya gerçek koşul yazılır.
|
|
102
|
+
4. Garanti ve öneri ayrılır. “Üretimde HTTP origin reddedilir” garantidir. “Birden fazla instance için Redis kullanın” öneridir.
|
|
103
|
+
5. Sorumluluk belirtilir. Transaction, şema göçü, proxy güveni, gizli değer saklama ve yedekleme, GuildGate açıkça uygulamadıkça uygulamaya aittir.
|
|
104
|
+
6. Mutlak güvenlik iddiası kullanılmaz. “Kırılamaz”, “sıfır risk”, “tam güvenli” veya “hatasız” yazılmaz.
|
|
105
|
+
7. Örnekler derlenebilir olmalı veya sözde kod olduğu açıkça belirtilmelidir.
|
|
106
|
+
8. Örnekteki her ortam değişkeni `.env.example` dosyasında bulunmalı ya da örneğin yanında açıklanmalıdır.
|
|
107
|
+
9. Belgede kullanılan her public export, `package.json` ve derlenmiş tip dosyalarında bulunmalıdır.
|
|
108
|
+
10. Paragraflar taranabilir tutulur; tek cümle sırf görünüm için madde listesine bölünmez.
|
|
109
|
+
|
|
110
|
+
## Sürüm öncesi kontrol
|
|
111
|
+
|
|
112
|
+
- Yukarıdaki kelimeler depoda aranır ve her eşleşme incelenir.
|
|
113
|
+
- Model kaynak kalıntıları ve boş köşeli parantezler aranır.
|
|
114
|
+
- Bağlantılar, kod örnekleri, testler, tip kontrolü, paket dry-run ve doctor komutu çalıştırılır.
|
|
115
|
+
- Değişen her sayfa bir kez düzenleme yapmadan okunur. Davranışı açıklamadan önem iddiası kuran cümleler işaretlenir.
|
|
116
|
+
- İnceleyen kişiden “insan gibi duruyor mu” değil, doğru ve sınanabilir olup olmadığını kontrol etmesi istenir.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
sequenceDiagram
|
|
2
|
+
autonumber
|
|
3
|
+
actor Browser
|
|
4
|
+
participant Adapter as HTTP Adapter
|
|
5
|
+
participant Kernel as GuildGate Kernel
|
|
6
|
+
participant Session as SessionStore
|
|
7
|
+
participant Policy as PolicyStore
|
|
8
|
+
participant Limit as RateLimitStore
|
|
9
|
+
participant Idem as IdempotencyStore
|
|
10
|
+
participant Lock as LockStore
|
|
11
|
+
participant App as Application execute()
|
|
12
|
+
participant Cache as CacheStore
|
|
13
|
+
participant Outbox as OutboxStore
|
|
14
|
+
participant Audit as AuditStore
|
|
15
|
+
|
|
16
|
+
Browser->>Adapter: PATCH + cookie + CSRF + idempotency key
|
|
17
|
+
Adapter->>Kernel: execute(action, request)
|
|
18
|
+
Kernel->>Session: resolve(hash(token))
|
|
19
|
+
Session-->>Kernel: session / missing / rotated
|
|
20
|
+
Kernel->>Kernel: exact origin and CSRF checks
|
|
21
|
+
Kernel->>Kernel: parse input and resolve resource
|
|
22
|
+
Kernel->>Policy: maintenance and block checks
|
|
23
|
+
Policy-->>Kernel: current policy decision
|
|
24
|
+
Kernel->>Limit: atomic hit(action subject)
|
|
25
|
+
Limit-->>Kernel: allowed, remaining, reset
|
|
26
|
+
Kernel->>Kernel: application or Discord authorization
|
|
27
|
+
Kernel->>Idem: begin(key, request hash)
|
|
28
|
+
Idem-->>Kernel: started / replay / conflict / inflight
|
|
29
|
+
Kernel->>Lock: acquire(resource lease)
|
|
30
|
+
Lock-->>Kernel: acquired
|
|
31
|
+
Kernel->>App: execute(context, parsed input, abort signal)
|
|
32
|
+
App-->>Kernel: committed result
|
|
33
|
+
Kernel->>Cache: deleteByTags(tags)
|
|
34
|
+
Kernel->>Outbox: enqueue(event)
|
|
35
|
+
Kernel->>Idem: complete(key, result)
|
|
36
|
+
Kernel->>Audit: write(result and policy version)
|
|
37
|
+
Kernel->>Lock: release(compare token)
|
|
38
|
+
Kernel-->>Adapter: typed result and session metadata
|
|
39
|
+
Adapter-->>Browser: response and optional rotated cookie
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
classDiagram
|
|
2
|
+
direction LR
|
|
3
|
+
|
|
4
|
+
class Application {
|
|
5
|
+
+HTTP routes
|
|
6
|
+
+Database transactions
|
|
7
|
+
+Policy decisions
|
|
8
|
+
+Schema validation
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
class GuildGateKernel {
|
|
12
|
+
+action(definition)
|
|
13
|
+
+execute(action, request)
|
|
14
|
+
+createSession(input)
|
|
15
|
+
+revokeUserSessions(userId)
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
class SessionManager {
|
|
19
|
+
+create(input)
|
|
20
|
+
+resolve(token)
|
|
21
|
+
+revokeToken(token)
|
|
22
|
+
+revokeAll(userId)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
class DiscordOAuthClient {
|
|
26
|
+
+beginLogin(input)
|
|
27
|
+
+completeLogin(input)
|
|
28
|
+
+getAccessToken(userId)
|
|
29
|
+
+revoke(userId)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
class DiscordGuildAuthorizer {
|
|
33
|
+
+inspect(input)
|
|
34
|
+
+require(policy)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
class GuildGateStores {
|
|
38
|
+
<<interface>>
|
|
39
|
+
+SessionStore sessions
|
|
40
|
+
+OAuthStateStore oauthStates
|
|
41
|
+
+OAuthCredentialStore credentials
|
|
42
|
+
+RateLimitStore rateLimits
|
|
43
|
+
+CacheStore cache
|
|
44
|
+
+IdempotencyStore idempotency
|
|
45
|
+
+LockStore locks
|
|
46
|
+
+AuditStore audit
|
|
47
|
+
+OutboxStore outbox
|
|
48
|
+
+PolicyStore policies
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
class RealtimeHub {
|
|
52
|
+
+attach(connection)
|
|
53
|
+
+subscribe(channel)
|
|
54
|
+
+publish(event)
|
|
55
|
+
+revokeSession(sessionIdHash)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
class FrameworkAdapter {
|
|
59
|
+
<<interface>>
|
|
60
|
+
+translateRequest()
|
|
61
|
+
+writeResponse()
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
class DiscordAPI {
|
|
65
|
+
<<external>>
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
class DatabaseOrCache {
|
|
69
|
+
<<external>>
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
Application --> FrameworkAdapter
|
|
73
|
+
FrameworkAdapter --> GuildGateKernel
|
|
74
|
+
Application --> GuildGateKernel
|
|
75
|
+
GuildGateKernel --> SessionManager
|
|
76
|
+
GuildGateKernel --> GuildGateStores
|
|
77
|
+
DiscordOAuthClient --> GuildGateKernel
|
|
78
|
+
DiscordOAuthClient --> GuildGateStores
|
|
79
|
+
DiscordOAuthClient --> DiscordAPI
|
|
80
|
+
DiscordGuildAuthorizer --> DiscordOAuthClient
|
|
81
|
+
DiscordGuildAuthorizer --> DiscordAPI
|
|
82
|
+
RealtimeHub --> SessionManager
|
|
83
|
+
RealtimeHub --> GuildGateStores
|
|
84
|
+
GuildGateStores --> DatabaseOrCache
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
flowchart LR
|
|
2
|
+
B[Browser] -->|HTTPS| P[Reverse proxy]
|
|
3
|
+
P --> A1[Dashboard instance A]
|
|
4
|
+
P --> A2[Dashboard instance B]
|
|
5
|
+
|
|
6
|
+
A1 --> D[(Durable database)]
|
|
7
|
+
A2 --> D
|
|
8
|
+
A1 --> R[(Redis or atomic temporary store)]
|
|
9
|
+
A2 --> R
|
|
10
|
+
A1 --> X[Discord API]
|
|
11
|
+
A2 --> X
|
|
12
|
+
|
|
13
|
+
D -->|credentials audit policies outbox| W[Outbox worker]
|
|
14
|
+
W --> Q[Realtime transport or event bus]
|
|
15
|
+
Q --> A1
|
|
16
|
+
Q --> A2
|
|
17
|
+
|
|
18
|
+
note1[Application controls schema migrations backup retention and proxy trust]
|
|
19
|
+
D --- note1
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
sequenceDiagram
|
|
2
|
+
autonumber
|
|
3
|
+
actor Browser
|
|
4
|
+
participant App as Application
|
|
5
|
+
participant OAuth as DiscordOAuthClient
|
|
6
|
+
participant State as OAuthStateStore
|
|
7
|
+
participant Discord as Discord OAuth2 API
|
|
8
|
+
participant Credentials as OAuthCredentialStore
|
|
9
|
+
participant Session as SessionManager
|
|
10
|
+
|
|
11
|
+
Browser->>App: GET /auth/discord
|
|
12
|
+
App->>OAuth: beginLogin(returnTo, locale)
|
|
13
|
+
OAuth->>State: put(hash(state), hash(browser nonce), expiry)
|
|
14
|
+
OAuth-->>App: authorization URL and HttpOnly nonce cookie
|
|
15
|
+
App-->>Browser: Set-Cookie and redirect
|
|
16
|
+
Browser->>Discord: authorization request with state
|
|
17
|
+
Discord-->>Browser: redirect with code and state
|
|
18
|
+
Browser->>App: GET callback + nonce cookie
|
|
19
|
+
App->>OAuth: completeLogin(code, state, nonce)
|
|
20
|
+
OAuth->>State: consume(hash(state))
|
|
21
|
+
State-->>OAuth: one record or null
|
|
22
|
+
OAuth->>Discord: exchange code
|
|
23
|
+
Discord-->>OAuth: access and refresh tokens
|
|
24
|
+
OAuth->>Discord: GET current user and guilds
|
|
25
|
+
Discord-->>OAuth: user and guild list
|
|
26
|
+
OAuth->>Credentials: store encrypted token record
|
|
27
|
+
OAuth->>Session: create new opaque session
|
|
28
|
+
Session-->>OAuth: raw token once and stored hash
|
|
29
|
+
OAuth-->>App: user, guilds, session cookie, local return path
|
|
30
|
+
App-->>Browser: clear nonce cookie, set session cookie, redirect
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
sequenceDiagram
|
|
2
|
+
autonumber
|
|
3
|
+
actor Browser
|
|
4
|
+
participant Transport as WebSocket Transport
|
|
5
|
+
participant Hub as RealtimeHub
|
|
6
|
+
participant Session as SessionManager
|
|
7
|
+
participant Limit as RateLimitStore
|
|
8
|
+
participant Authz as Application Authorizer
|
|
9
|
+
|
|
10
|
+
Browser->>Transport: connection with Origin and session cookie
|
|
11
|
+
Transport->>Hub: attach(connection, origin, session token)
|
|
12
|
+
Hub->>Session: resolve(token)
|
|
13
|
+
Session-->>Hub: active session
|
|
14
|
+
Hub-->>Browser: ready
|
|
15
|
+
Browser->>Transport: subscribe guild:123
|
|
16
|
+
Transport->>Hub: subscribe(connection, channel)
|
|
17
|
+
Hub->>Authz: authorize(session, channel)
|
|
18
|
+
Authz-->>Hub: allowed
|
|
19
|
+
Hub-->>Browser: subscribed
|
|
20
|
+
Browser->>Transport: client message
|
|
21
|
+
Transport->>Hub: acceptMessage(payload)
|
|
22
|
+
Hub->>Limit: atomic message limit hit
|
|
23
|
+
Limit-->>Hub: allowed
|
|
24
|
+
Hub-->>Transport: parsed payload
|
|
25
|
+
Note over Hub: Publish checks channel membership and buffered bytes
|
|
26
|
+
Hub-->>Browser: versioned event
|
|
27
|
+
Session-->>Hub: session revoked by application
|
|
28
|
+
Hub-->>Browser: close 1008
|
package/package.json
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kavtuai/guildgate",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Security and control primitives for Discord bot dashboards.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"author": "kavtuai",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/Kavtuai/guildgate.git"
|
|
11
|
+
},
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/Kavtuai/guildgate/issues"
|
|
14
|
+
},
|
|
15
|
+
"homepage": "https://github.com/Kavtuai/guildgate#readme",
|
|
16
|
+
"keywords": [
|
|
17
|
+
"discord",
|
|
18
|
+
"dashboard",
|
|
19
|
+
"oauth2",
|
|
20
|
+
"security",
|
|
21
|
+
"rate-limit",
|
|
22
|
+
"cache",
|
|
23
|
+
"websocket",
|
|
24
|
+
"typescript"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=22"
|
|
28
|
+
},
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"bin",
|
|
32
|
+
"docs",
|
|
33
|
+
"README.md",
|
|
34
|
+
"README.tr.md",
|
|
35
|
+
"CHANGELOG.md",
|
|
36
|
+
"TEST_REPORT.md",
|
|
37
|
+
"LICENSE",
|
|
38
|
+
"SECURITY.md"
|
|
39
|
+
],
|
|
40
|
+
"exports": {
|
|
41
|
+
".": {
|
|
42
|
+
"types": "./dist/index.d.ts",
|
|
43
|
+
"import": "./dist/index.js"
|
|
44
|
+
},
|
|
45
|
+
"./discord": {
|
|
46
|
+
"types": "./dist/discord.d.ts",
|
|
47
|
+
"import": "./dist/discord.js"
|
|
48
|
+
},
|
|
49
|
+
"./fastify": {
|
|
50
|
+
"types": "./dist/fastify.d.ts",
|
|
51
|
+
"import": "./dist/fastify.js"
|
|
52
|
+
},
|
|
53
|
+
"./express": {
|
|
54
|
+
"types": "./dist/express.d.ts",
|
|
55
|
+
"import": "./dist/express.js"
|
|
56
|
+
},
|
|
57
|
+
"./redis": {
|
|
58
|
+
"types": "./dist/redis.d.ts",
|
|
59
|
+
"import": "./dist/redis.js"
|
|
60
|
+
},
|
|
61
|
+
"./realtime": {
|
|
62
|
+
"types": "./dist/realtime.d.ts",
|
|
63
|
+
"import": "./dist/realtime.js"
|
|
64
|
+
},
|
|
65
|
+
"./testing": {
|
|
66
|
+
"types": "./dist/testing.d.ts",
|
|
67
|
+
"import": "./dist/testing.js"
|
|
68
|
+
}
|
|
69
|
+
},
|
|
70
|
+
"bin": {
|
|
71
|
+
"guildgate-doctor": "bin/guildgate-doctor.mjs",
|
|
72
|
+
"guildgate-writing-check": "bin/guildgate-writing-check.mjs"
|
|
73
|
+
},
|
|
74
|
+
"scripts": {
|
|
75
|
+
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
76
|
+
"build": "npm run clean && tsc -p tsconfig.json",
|
|
77
|
+
"test": "npm run build && npm run writing:check && node --test tests/*.test.mjs",
|
|
78
|
+
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
79
|
+
"pack:check": "npm pack --dry-run",
|
|
80
|
+
"prepublishOnly": "npm test && npm run pack:check",
|
|
81
|
+
"writing:check": "node ./bin/guildgate-writing-check.mjs"
|
|
82
|
+
},
|
|
83
|
+
"publishConfig": {
|
|
84
|
+
"access": "public"
|
|
85
|
+
},
|
|
86
|
+
"devDependencies": {
|
|
87
|
+
"@types/node": "^22.15.0",
|
|
88
|
+
"typescript": "^5.8.3"
|
|
89
|
+
}
|
|
90
|
+
}
|