@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.
Files changed (133) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/LICENSE +21 -0
  3. package/README.md +399 -0
  4. package/README.tr.md +397 -0
  5. package/SECURITY.md +36 -0
  6. package/TEST_REPORT.md +50 -0
  7. package/bin/guildgate-doctor.mjs +91 -0
  8. package/bin/guildgate-writing-check.mjs +73 -0
  9. package/dist/action.d.ts +65 -0
  10. package/dist/action.d.ts.map +1 -0
  11. package/dist/action.js +4 -0
  12. package/dist/action.js.map +1 -0
  13. package/dist/cache.d.ts +23 -0
  14. package/dist/cache.d.ts.map +1 -0
  15. package/dist/cache.js +53 -0
  16. package/dist/cache.js.map +1 -0
  17. package/dist/crypto.d.ts +15 -0
  18. package/dist/crypto.d.ts.map +1 -0
  19. package/dist/crypto.js +87 -0
  20. package/dist/crypto.js.map +1 -0
  21. package/dist/discord/authorizer.d.ts +41 -0
  22. package/dist/discord/authorizer.d.ts.map +1 -0
  23. package/dist/discord/authorizer.js +101 -0
  24. package/dist/discord/authorizer.js.map +1 -0
  25. package/dist/discord/oauth.d.ts +64 -0
  26. package/dist/discord/oauth.d.ts.map +1 -0
  27. package/dist/discord/oauth.js +226 -0
  28. package/dist/discord/oauth.js.map +1 -0
  29. package/dist/discord/permissions.d.ts +85 -0
  30. package/dist/discord/permissions.d.ts.map +1 -0
  31. package/dist/discord/permissions.js +99 -0
  32. package/dist/discord/permissions.js.map +1 -0
  33. package/dist/discord.d.ts +4 -0
  34. package/dist/discord.d.ts.map +1 -0
  35. package/dist/discord.js +4 -0
  36. package/dist/discord.js.map +1 -0
  37. package/dist/errors.d.ts +43 -0
  38. package/dist/errors.d.ts.map +1 -0
  39. package/dist/errors.js +57 -0
  40. package/dist/errors.js.map +1 -0
  41. package/dist/express.d.ts +3 -0
  42. package/dist/express.d.ts.map +1 -0
  43. package/dist/express.js +3 -0
  44. package/dist/express.js.map +1 -0
  45. package/dist/fastify.d.ts +3 -0
  46. package/dist/fastify.d.ts.map +1 -0
  47. package/dist/fastify.js +3 -0
  48. package/dist/fastify.js.map +1 -0
  49. package/dist/http/express.d.ts +24 -0
  50. package/dist/http/express.d.ts.map +1 -0
  51. package/dist/http/express.js +60 -0
  52. package/dist/http/express.js.map +1 -0
  53. package/dist/http/fastify.d.ts +25 -0
  54. package/dist/http/fastify.d.ts.map +1 -0
  55. package/dist/http/fastify.js +57 -0
  56. package/dist/http/fastify.js.map +1 -0
  57. package/dist/i18n.d.ts +5 -0
  58. package/dist/i18n.d.ts.map +1 -0
  59. package/dist/i18n.js +66 -0
  60. package/dist/i18n.js.map +1 -0
  61. package/dist/index.d.ts +13 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +13 -0
  64. package/dist/index.js.map +1 -0
  65. package/dist/kernel.d.ts +83 -0
  66. package/dist/kernel.d.ts.map +1 -0
  67. package/dist/kernel.js +395 -0
  68. package/dist/kernel.js.map +1 -0
  69. package/dist/memory-store.d.ts +13 -0
  70. package/dist/memory-store.d.ts.map +1 -0
  71. package/dist/memory-store.js +261 -0
  72. package/dist/memory-store.js.map +1 -0
  73. package/dist/realtime/hub.d.ts +42 -0
  74. package/dist/realtime/hub.d.ts.map +1 -0
  75. package/dist/realtime/hub.js +152 -0
  76. package/dist/realtime/hub.js.map +1 -0
  77. package/dist/realtime/outbox.d.ts +12 -0
  78. package/dist/realtime/outbox.d.ts.map +1 -0
  79. package/dist/realtime/outbox.js +18 -0
  80. package/dist/realtime/outbox.js.map +1 -0
  81. package/dist/realtime.d.ts +3 -0
  82. package/dist/realtime.d.ts.map +1 -0
  83. package/dist/realtime.js +3 -0
  84. package/dist/realtime.js.map +1 -0
  85. package/dist/redis.d.ts +49 -0
  86. package/dist/redis.d.ts.map +1 -0
  87. package/dist/redis.js +233 -0
  88. package/dist/redis.js.map +1 -0
  89. package/dist/resilience.d.ts +23 -0
  90. package/dist/resilience.d.ts.map +1 -0
  91. package/dist/resilience.js +85 -0
  92. package/dist/resilience.js.map +1 -0
  93. package/dist/security.d.ts +21 -0
  94. package/dist/security.d.ts.map +1 -0
  95. package/dist/security.js +94 -0
  96. package/dist/security.js.map +1 -0
  97. package/dist/session.d.ts +32 -0
  98. package/dist/session.d.ts.map +1 -0
  99. package/dist/session.js +97 -0
  100. package/dist/session.js.map +1 -0
  101. package/dist/stores.d.ts +73 -0
  102. package/dist/stores.d.ts.map +1 -0
  103. package/dist/stores.js +4 -0
  104. package/dist/stores.js.map +1 -0
  105. package/dist/testing.d.ts +32 -0
  106. package/dist/testing.d.ts.map +1 -0
  107. package/dist/testing.js +60 -0
  108. package/dist/testing.js.map +1 -0
  109. package/dist/types.d.ts +183 -0
  110. package/dist/types.d.ts.map +1 -0
  111. package/dist/types.js +4 -0
  112. package/dist/types.js.map +1 -0
  113. package/docs/WRITING_STYLE.md +118 -0
  114. package/docs/architecture.md +83 -0
  115. package/docs/custom-stores.md +111 -0
  116. package/docs/owner-management.md +44 -0
  117. package/docs/research-notes.md +61 -0
  118. package/docs/setup.md +104 -0
  119. package/docs/threat-model.md +79 -0
  120. package/docs/tr/arastirma-notlari.md +41 -0
  121. package/docs/tr/guvenlik-bildirimi.md +7 -0
  122. package/docs/tr/kurulum.md +63 -0
  123. package/docs/tr/mimari.md +59 -0
  124. package/docs/tr/sahip-yonetimi.md +7 -0
  125. package/docs/tr/tehdit-modeli.md +39 -0
  126. package/docs/tr/veritabani-suruculeri.md +23 -0
  127. package/docs/tr/yazim-kilavuzu.md +116 -0
  128. package/docs/uml/action-sequence.mmd +39 -0
  129. package/docs/uml/components.mmd +84 -0
  130. package/docs/uml/deployment.mmd +19 -0
  131. package/docs/uml/oauth-sequence.mmd +30 -0
  132. package/docs/uml/realtime-sequence.mmd +28 -0
  133. package/package.json +90 -0
@@ -0,0 +1,60 @@
1
+ export function createExpressHandler(kernel, action, options) {
2
+ return async (request, response, next) => {
3
+ try {
4
+ const envelope = {
5
+ method: request.method.toUpperCase(),
6
+ path: request.path || request.originalUrl || "/",
7
+ input: options?.input?.(request) ?? request.body,
8
+ headers: request.headers,
9
+ cookies: request.cookies,
10
+ ip: request.ip,
11
+ origin: header(request.headers, "origin"),
12
+ userAgent: header(request.headers, "user-agent"),
13
+ locale: options?.locale?.(request) ?? header(request.headers, "accept-language"),
14
+ sessionToken: request.cookies?.[kernel.cookie.name],
15
+ csrfToken: header(request.headers, "x-csrf-token"),
16
+ idempotencyKey: header(request.headers, "idempotency-key"),
17
+ };
18
+ const result = await kernel.execute(action, envelope);
19
+ response.setHeader("X-Request-Id", result.meta.requestId);
20
+ if (result.meta.clearSessionCookie)
21
+ response.setHeader("Set-Cookie", kernel.clearSessionCookie());
22
+ if (result.meta.replacementSessionToken)
23
+ response.setHeader("Set-Cookie", kernel.sessionCookie(result.meta.replacementSessionToken));
24
+ if (result.meta.replacementCsrfToken)
25
+ response.setHeader("X-CSRF-Token", result.meta.replacementCsrfToken);
26
+ if (result.meta.postCommitIssues?.length) {
27
+ response.setHeader("X-GuildGate-Post-Commit-Issues", result.meta.postCommitIssues.length);
28
+ }
29
+ if (result.meta.rateLimit) {
30
+ response.setHeader("RateLimit-Limit", result.meta.rateLimit.limit);
31
+ response.setHeader("RateLimit-Remaining", result.meta.rateLimit.remaining);
32
+ response.setHeader("RateLimit-Reset", Math.ceil(result.meta.rateLimit.resetAtMs / 1000));
33
+ }
34
+ if (!result.ok) {
35
+ if (result.error.details?.retryAfterMs && typeof result.error.details.retryAfterMs === "number") {
36
+ response.setHeader("Retry-After", Math.max(1, Math.ceil(result.error.details.retryAfterMs / 1000)));
37
+ }
38
+ response.status(result.error.status).json({
39
+ error: {
40
+ code: result.error.code,
41
+ message: result.error.message,
42
+ retryable: result.error.retryable,
43
+ details: result.error.details,
44
+ requestId: result.meta.requestId,
45
+ },
46
+ });
47
+ return;
48
+ }
49
+ response.status(200).json({ data: result.data, requestId: result.meta.requestId });
50
+ }
51
+ catch (error) {
52
+ next(error);
53
+ }
54
+ };
55
+ }
56
+ function header(headers, name) {
57
+ const value = headers[name] ?? headers[name.toLowerCase()];
58
+ return Array.isArray(value) ? value[0] : value;
59
+ }
60
+ //# sourceMappingURL=express.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"express.js","sourceRoot":"","sources":["../../src/http/express.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { DefinedAction } from "../action.js";
2
+ import type { GuildGateKernel } from "../kernel.js";
3
+ export interface FastifyRequestLike {
4
+ method: string;
5
+ url: string;
6
+ headers: Record<string, string | string[] | undefined>;
7
+ cookies?: Record<string, string | undefined>;
8
+ ip?: string;
9
+ body?: unknown;
10
+ params?: unknown;
11
+ query?: unknown;
12
+ raw?: {
13
+ signal?: AbortSignal;
14
+ };
15
+ }
16
+ export interface FastifyReplyLike {
17
+ code(status: number): FastifyReplyLike;
18
+ header(name: string, value: string | number): FastifyReplyLike;
19
+ send(payload: unknown): unknown;
20
+ }
21
+ export declare function createFastifyHandler<I, O>(kernel: GuildGateKernel, action: DefinedAction<I, O>, options?: {
22
+ input?: (request: FastifyRequestLike) => unknown;
23
+ locale?: (request: FastifyRequestLike) => string | undefined;
24
+ }): (request: FastifyRequestLike, reply: FastifyReplyLike) => Promise<unknown>;
25
+ //# sourceMappingURL=fastify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../../src/http/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGpD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,MAAM,CAAC;IACf,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAC7C,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,GAAG,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACvC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,gBAAgB,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC;CACjC;AAED,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,CAAC,EACvC,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,EAC3B,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,OAAO,CAAC;IACjD,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,MAAM,GAAG,SAAS,CAAC;CAC9D,GACA,CAAC,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,OAAO,CAAC,CAmC5E"}
@@ -0,0 +1,57 @@
1
+ export function createFastifyHandler(kernel, action, options) {
2
+ return async (request, reply) => {
3
+ const envelope = {
4
+ method: request.method.toUpperCase(),
5
+ path: request.url.split("?")[0] ?? request.url,
6
+ input: options?.input?.(request) ?? request.body,
7
+ headers: request.headers,
8
+ cookies: request.cookies,
9
+ ip: request.ip,
10
+ origin: header(request.headers, "origin"),
11
+ userAgent: header(request.headers, "user-agent"),
12
+ locale: options?.locale?.(request) ?? header(request.headers, "accept-language"),
13
+ sessionToken: request.cookies?.[kernel.cookie.name],
14
+ csrfToken: header(request.headers, "x-csrf-token"),
15
+ idempotencyKey: header(request.headers, "idempotency-key"),
16
+ signal: request.raw?.signal,
17
+ };
18
+ const result = await kernel.execute(action, envelope);
19
+ applyMeta(kernel, reply, result.meta);
20
+ if (!result.ok) {
21
+ if (result.error.details?.retryAfterMs && typeof result.error.details.retryAfterMs === "number") {
22
+ reply.header("Retry-After", Math.max(1, Math.ceil(result.error.details.retryAfterMs / 1000)));
23
+ }
24
+ return reply.code(result.error.status).send({
25
+ error: {
26
+ code: result.error.code,
27
+ message: result.error.message,
28
+ retryable: result.error.retryable,
29
+ details: result.error.details,
30
+ requestId: result.meta.requestId,
31
+ },
32
+ });
33
+ }
34
+ return reply.code(200).send({ data: result.data, requestId: result.meta.requestId });
35
+ };
36
+ }
37
+ function applyMeta(kernel, reply, meta) {
38
+ reply.header("X-Request-Id", meta.requestId);
39
+ if (meta.clearSessionCookie)
40
+ reply.header("Set-Cookie", kernel.clearSessionCookie());
41
+ if (meta.replacementSessionToken)
42
+ reply.header("Set-Cookie", kernel.sessionCookie(meta.replacementSessionToken));
43
+ if (meta.replacementCsrfToken)
44
+ reply.header("X-CSRF-Token", meta.replacementCsrfToken);
45
+ if (meta.postCommitIssues?.length)
46
+ reply.header("X-GuildGate-Post-Commit-Issues", meta.postCommitIssues.length);
47
+ if (meta.rateLimit) {
48
+ reply.header("RateLimit-Limit", meta.rateLimit.limit);
49
+ reply.header("RateLimit-Remaining", meta.rateLimit.remaining);
50
+ reply.header("RateLimit-Reset", Math.ceil(meta.rateLimit.resetAtMs / 1000));
51
+ }
52
+ }
53
+ function header(headers, name) {
54
+ const value = headers[name] ?? headers[name.toLowerCase()];
55
+ return Array.isArray(value) ? value[0] : value;
56
+ }
57
+ //# sourceMappingURL=fastify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fastify.js","sourceRoot":"","sources":["../../src/http/fastify.ts"],"names":[],"mappings":"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"}
package/dist/i18n.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import type { SupportedLocale } from "./types.js";
2
+ export declare function resolveLocale(value: string | undefined, fallback: SupportedLocale): SupportedLocale;
3
+ export declare function messageFor(code: string, locale: SupportedLocale): string;
4
+ export declare function getMessages(locale: SupportedLocale): Readonly<Record<string, string>>;
5
+ //# sourceMappingURL=i18n.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.d.ts","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAyDlD,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,eAAe,GAAG,eAAe,CAGnG;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,MAAM,CAExE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAErF"}
package/dist/i18n.js ADDED
@@ -0,0 +1,66 @@
1
+ const messages = {
2
+ en: {
3
+ AUTHENTICATION_REQUIRED: "Sign in before continuing.",
4
+ SESSION_EXPIRED: "Your session expired. Sign in again.",
5
+ SESSION_REVOKED: "This session is no longer active.",
6
+ CSRF_INVALID: "The request could not be verified.",
7
+ ORIGIN_NOT_ALLOWED: "This request came from an unapproved origin.",
8
+ GUILD_ACCESS_DENIED: "You cannot manage this server.",
9
+ USER_PERMISSION_MISSING: "Your Discord account does not have the required server permission.",
10
+ BOT_PERMISSION_MISSING: "The bot does not have the permission needed for this operation.",
11
+ BOT_NOT_IN_GUILD: "The bot is not installed in this server.",
12
+ RATE_LIMITED: "Too many requests were sent. Try again shortly.",
13
+ INPUT_INVALID: "Some submitted values are invalid.",
14
+ IDEMPOTENCY_KEY_REQUIRED: "This operation needs an Idempotency-Key header.",
15
+ IDEMPOTENCY_CONFLICT: "This idempotency key was already used with different data.",
16
+ IDEMPOTENCY_INFLIGHT: "The same operation is already running.",
17
+ REVISION_CONFLICT: "These settings changed after you opened the page. Reload and review the latest version.",
18
+ RESOURCE_BUSY: "Another operation is editing the same resource.",
19
+ UPSTREAM_TIMEOUT: "A required service did not respond in time.",
20
+ UPSTREAM_UNAVAILABLE: "A required service is currently unavailable.",
21
+ MAINTENANCE_MODE: "Dashboard changes are temporarily paused.",
22
+ SUBJECT_BLOCKED: "Access to this dashboard has been blocked.",
23
+ OAUTH_STATE_INVALID: "The Discord sign-in request expired or was already used.",
24
+ OAUTH_FAILED: "Discord sign-in could not be completed.",
25
+ CONFIGURATION_ERROR: "GuildGate is not configured correctly.",
26
+ INTERNAL_ERROR: "The request failed unexpectedly.",
27
+ },
28
+ tr: {
29
+ AUTHENTICATION_REQUIRED: "Devam etmeden önce giriş yapın.",
30
+ SESSION_EXPIRED: "Oturumunuz sona erdi. Yeniden giriş yapın.",
31
+ SESSION_REVOKED: "Bu oturum artık etkin değil.",
32
+ CSRF_INVALID: "İstek doğrulanamadı.",
33
+ ORIGIN_NOT_ALLOWED: "İstek izin verilmeyen bir kaynaktan geldi.",
34
+ GUILD_ACCESS_DENIED: "Bu sunucuyu yönetemezsiniz.",
35
+ USER_PERMISSION_MISSING: "Discord hesabınız gerekli sunucu yetkisine sahip değil.",
36
+ BOT_PERMISSION_MISSING: "Bot bu işlem için gereken yetkiye sahip değil.",
37
+ BOT_NOT_IN_GUILD: "Bot bu sunucuda kurulu değil.",
38
+ RATE_LIMITED: "Çok fazla istek gönderildi. Kısa süre sonra yeniden deneyin.",
39
+ INPUT_INVALID: "Gönderilen bazı değerler geçersiz.",
40
+ IDEMPOTENCY_KEY_REQUIRED: "Bu işlem Idempotency-Key başlığı gerektiriyor.",
41
+ IDEMPOTENCY_CONFLICT: "Bu idempotency anahtarı farklı verilerle daha önce kullanıldı.",
42
+ IDEMPOTENCY_INFLIGHT: "Aynı işlem şu anda çalışıyor.",
43
+ REVISION_CONFLICT: "Ayarlar siz sayfayı açtıktan sonra değişti. Güncel sürümü yeniden yükleyin.",
44
+ RESOURCE_BUSY: "Aynı kaynak üzerinde başka bir işlem çalışıyor.",
45
+ UPSTREAM_TIMEOUT: "Gerekli servis zamanında yanıt vermedi.",
46
+ UPSTREAM_UNAVAILABLE: "Gerekli servis şu anda kullanılamıyor.",
47
+ MAINTENANCE_MODE: "Panel değişiklikleri geçici olarak durduruldu.",
48
+ SUBJECT_BLOCKED: "Bu panel için erişim engellendi.",
49
+ OAUTH_STATE_INVALID: "Discord giriş isteğinin süresi doldu veya istek daha önce kullanıldı.",
50
+ OAUTH_FAILED: "Discord girişi tamamlanamadı.",
51
+ CONFIGURATION_ERROR: "GuildGate doğru yapılandırılmamış.",
52
+ INTERNAL_ERROR: "İstek beklenmeyen bir nedenle tamamlanamadı.",
53
+ },
54
+ };
55
+ export function resolveLocale(value, fallback) {
56
+ if (!value)
57
+ return fallback;
58
+ return value.toLowerCase().startsWith("tr") ? "tr" : "en";
59
+ }
60
+ export function messageFor(code, locale) {
61
+ return messages[locale][code] ?? messages[locale].INTERNAL_ERROR ?? "The request failed.";
62
+ }
63
+ export function getMessages(locale) {
64
+ return messages[locale];
65
+ }
66
+ //# sourceMappingURL=i18n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"i18n.js","sourceRoot":"","sources":["../src/i18n.ts"],"names":[],"mappings":"AAEA,MAAM,QAAQ,GAAoD;IAChE,EAAE,EAAE;QACF,uBAAuB,EAAE,4BAA4B;QACrD,eAAe,EAAE,sCAAsC;QACvD,eAAe,EAAE,mCAAmC;QACpD,YAAY,EAAE,oCAAoC;QAClD,kBAAkB,EAAE,8CAA8C;QAClE,mBAAmB,EAAE,gCAAgC;QACrD,uBAAuB,EAAE,oEAAoE;QAC7F,sBAAsB,EAAE,iEAAiE;QACzF,gBAAgB,EAAE,0CAA0C;QAC5D,YAAY,EAAE,iDAAiD;QAC/D,aAAa,EAAE,oCAAoC;QACnD,wBAAwB,EAAE,iDAAiD;QAC3E,oBAAoB,EAAE,4DAA4D;QAClF,oBAAoB,EAAE,wCAAwC;QAC9D,iBAAiB,EAAE,yFAAyF;QAC5G,aAAa,EAAE,iDAAiD;QAChE,gBAAgB,EAAE,6CAA6C;QAC/D,oBAAoB,EAAE,8CAA8C;QACpE,gBAAgB,EAAE,2CAA2C;QAC7D,eAAe,EAAE,4CAA4C;QAC7D,mBAAmB,EAAE,0DAA0D;QAC/E,YAAY,EAAE,yCAAyC;QACvD,mBAAmB,EAAE,wCAAwC;QAC7D,cAAc,EAAE,kCAAkC;KACnD;IACD,EAAE,EAAE;QACF,uBAAuB,EAAE,iCAAiC;QAC1D,eAAe,EAAE,4CAA4C;QAC7D,eAAe,EAAE,8BAA8B;QAC/C,YAAY,EAAE,sBAAsB;QACpC,kBAAkB,EAAE,4CAA4C;QAChE,mBAAmB,EAAE,6BAA6B;QAClD,uBAAuB,EAAE,yDAAyD;QAClF,sBAAsB,EAAE,gDAAgD;QACxE,gBAAgB,EAAE,+BAA+B;QACjD,YAAY,EAAE,8DAA8D;QAC5E,aAAa,EAAE,oCAAoC;QACnD,wBAAwB,EAAE,gDAAgD;QAC1E,oBAAoB,EAAE,gEAAgE;QACtF,oBAAoB,EAAE,+BAA+B;QACrD,iBAAiB,EAAE,6EAA6E;QAChG,aAAa,EAAE,iDAAiD;QAChE,gBAAgB,EAAE,yCAAyC;QAC3D,oBAAoB,EAAE,wCAAwC;QAC9D,gBAAgB,EAAE,gDAAgD;QAClE,eAAe,EAAE,kCAAkC;QACnD,mBAAmB,EAAE,uEAAuE;QAC5F,YAAY,EAAE,+BAA+B;QAC7C,mBAAmB,EAAE,oCAAoC;QACzD,cAAc,EAAE,8CAA8C;KAC/D;CACF,CAAC;AAEF,MAAM,UAAU,aAAa,CAAC,KAAyB,EAAE,QAAyB;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAC5B,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,MAAuB;IAC9D,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC,cAAc,IAAI,qBAAqB,CAAC;AAC5F,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAuB;IACjD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,13 @@
1
+ export * from "./action.js";
2
+ export * from "./cache.js";
3
+ export * from "./crypto.js";
4
+ export * from "./errors.js";
5
+ export * from "./i18n.js";
6
+ export * from "./kernel.js";
7
+ export * from "./memory-store.js";
8
+ export * from "./resilience.js";
9
+ export * from "./security.js";
10
+ export * from "./session.js";
11
+ export * from "./stores.js";
12
+ export * from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export * from "./action.js";
2
+ export * from "./cache.js";
3
+ export * from "./crypto.js";
4
+ export * from "./errors.js";
5
+ export * from "./i18n.js";
6
+ export * from "./kernel.js";
7
+ export * from "./memory-store.js";
8
+ export * from "./resilience.js";
9
+ export * from "./security.js";
10
+ export * from "./session.js";
11
+ export * from "./stores.js";
12
+ export * from "./types.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,83 @@
1
+ import type { ActionDefinition, DefinedAction } from "./action.js";
2
+ import { CacheManager } from "./cache.js";
3
+ import { type CookieConfig } from "./security.js";
4
+ import { SessionManager } from "./session.js";
5
+ import type { GuildGateStores } from "./stores.js";
6
+ import type { ActionExecutionResult, Clock, EnvironmentName, RealtimeEvent, RequestEnvelope, SessionRecord, SupportedLocale } from "./types.js";
7
+ export interface RealtimePublisher {
8
+ publish(event: RealtimeEvent): Promise<void>;
9
+ }
10
+ export interface GuildGateConfig {
11
+ app: {
12
+ name: string;
13
+ environment: EnvironmentName;
14
+ baseUrl: string;
15
+ };
16
+ owners?: string[];
17
+ locale?: {
18
+ default?: SupportedLocale;
19
+ messages?: Partial<Record<SupportedLocale, Record<string, string>>>;
20
+ };
21
+ security: {
22
+ allowedOrigins: string[];
23
+ csrfSecret: string;
24
+ auditIpSalt: string;
25
+ session: {
26
+ ttlMs: number;
27
+ idleTimeoutMs: number;
28
+ rotateAfterMs: number;
29
+ maximumSessionsPerUser: number;
30
+ };
31
+ cookie?: Partial<CookieConfig>;
32
+ };
33
+ stores: GuildGateStores;
34
+ realtime?: RealtimePublisher;
35
+ audit?: {
36
+ enabled?: boolean;
37
+ redactKeys?: string[];
38
+ failClosedActions?: string[];
39
+ };
40
+ clock?: Clock;
41
+ }
42
+ export interface GuildGateKernel {
43
+ readonly config: GuildGateConfig;
44
+ readonly sessions: SessionManager;
45
+ readonly cache: CacheManager;
46
+ readonly cookie: CookieConfig;
47
+ readonly csrf: {
48
+ issue(sessionIdHash: string): string;
49
+ verify(sessionIdHash: string, token: string | undefined): boolean;
50
+ };
51
+ action<I, O>(definition: ActionDefinition<I, O>): DefinedAction<I, O>;
52
+ execute<I, O>(action: DefinedAction<I, O>, request: RequestEnvelope): Promise<ActionExecutionResult<O>>;
53
+ createSession(input: {
54
+ userId: string;
55
+ locale?: string;
56
+ metadata?: Record<string, unknown>;
57
+ }): Promise<{
58
+ session: SessionRecord;
59
+ sessionToken: string;
60
+ csrfToken: string;
61
+ setCookie: string;
62
+ }>;
63
+ revokeSession(token: string): Promise<void>;
64
+ revokeUserSessions(userId: string): Promise<number>;
65
+ sessionCookie(token: string): string;
66
+ clearSessionCookie(): string;
67
+ owner: {
68
+ setMaintenance(input: {
69
+ enabled: boolean;
70
+ reason?: string;
71
+ allowOwners?: boolean;
72
+ }): Promise<void>;
73
+ block(input: {
74
+ subjectType: "user" | "guild" | "ip";
75
+ subjectId: string;
76
+ reason: string;
77
+ expiresAt?: string;
78
+ }): Promise<void>;
79
+ unblock(subjectType: "user" | "guild" | "ip", subjectId: string): Promise<void>;
80
+ };
81
+ }
82
+ export declare function createGuildGate(config: GuildGateConfig): GuildGateKernel;
83
+ //# sourceMappingURL=kernel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../src/kernel.ts"],"names":[],"mappings":"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"}