@engjts/nexus 0.1.8 → 0.1.10

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 (221) hide show
  1. package/dist/advanced/playground/playground.js.map +1 -1
  2. package/dist/advanced/static/generateDirectoryListing.d.ts +1 -1
  3. package/dist/advanced/static/generateDirectoryListing.d.ts.map +1 -1
  4. package/dist/advanced/static/generateDirectoryListing.js +12 -6
  5. package/dist/advanced/static/generateDirectoryListing.js.map +1 -1
  6. package/dist/advanced/static/index.d.ts +2 -0
  7. package/dist/advanced/static/index.d.ts.map +1 -1
  8. package/dist/advanced/static/index.js +4 -1
  9. package/dist/advanced/static/index.js.map +1 -1
  10. package/dist/advanced/static/serveStatic.d.ts.map +1 -1
  11. package/dist/advanced/static/serveStatic.js +7 -1
  12. package/dist/advanced/static/serveStatic.js.map +1 -1
  13. package/dist/index.d.ts +1 -1
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +3 -1
  16. package/dist/index.js.map +1 -1
  17. package/package.json +1 -1
  18. package/BENCHMARK_REPORT.md +0 -343
  19. package/documentation/01-getting-started.md +0 -240
  20. package/documentation/02-context.md +0 -335
  21. package/documentation/03-routing.md +0 -397
  22. package/documentation/04-middleware.md +0 -483
  23. package/documentation/05-validation.md +0 -514
  24. package/documentation/06-error-handling.md +0 -465
  25. package/documentation/07-performance.md +0 -364
  26. package/documentation/08-adapters.md +0 -470
  27. package/documentation/09-api-reference.md +0 -548
  28. package/documentation/10-examples.md +0 -582
  29. package/documentation/11-deployment.md +0 -477
  30. package/documentation/12-sentry.md +0 -620
  31. package/documentation/13-sentry-data-storage.md +0 -996
  32. package/documentation/14-sentry-data-reference.md +0 -457
  33. package/documentation/15-sentry-summary.md +0 -409
  34. package/documentation/16-alerts-system.md +0 -745
  35. package/documentation/17-alert-adapters.md +0 -696
  36. package/documentation/18-alerts-implementation-summary.md +0 -385
  37. package/documentation/19-class-based-routing.md +0 -840
  38. package/documentation/20-websocket-realtime.md +0 -813
  39. package/documentation/21-cache-system.md +0 -510
  40. package/documentation/22-job-queue.md +0 -772
  41. package/documentation/23-sentry-plugin.md +0 -551
  42. package/documentation/24-testing-utilities.md +0 -1287
  43. package/documentation/25-api-versioning.md +0 -533
  44. package/documentation/26-context-store.md +0 -607
  45. package/documentation/27-dependency-injection.md +0 -329
  46. package/documentation/28-lifecycle-hooks.md +0 -521
  47. package/documentation/29-package-structure.md +0 -196
  48. package/documentation/30-plugin-system.md +0 -414
  49. package/documentation/31-jwt-authentication.md +0 -597
  50. package/documentation/32-cli.md +0 -268
  51. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  52. package/documentation/ALERTS-INDEX.md +0 -330
  53. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  54. package/documentation/README.md +0 -178
  55. package/documentation/index.html +0 -34
  56. package/modern_framework_paper.md +0 -1870
  57. package/public/css/style.css +0 -87
  58. package/public/index.html +0 -34
  59. package/public/js/app.js +0 -27
  60. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  61. package/src/advanced/cache/MultiTierCache.ts +0 -194
  62. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  63. package/src/advanced/cache/index.ts +0 -5
  64. package/src/advanced/cache/types.ts +0 -40
  65. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  66. package/src/advanced/graphql/index.ts +0 -22
  67. package/src/advanced/graphql/server.ts +0 -252
  68. package/src/advanced/graphql/types.ts +0 -42
  69. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  70. package/src/advanced/jobs/JobQueue.ts +0 -556
  71. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  72. package/src/advanced/jobs/index.ts +0 -5
  73. package/src/advanced/jobs/types.ts +0 -70
  74. package/src/advanced/observability/APMManager.ts +0 -163
  75. package/src/advanced/observability/AlertManager.ts +0 -109
  76. package/src/advanced/observability/MetricRegistry.ts +0 -151
  77. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  78. package/src/advanced/observability/StructuredLogger.ts +0 -154
  79. package/src/advanced/observability/TracingManager.ts +0 -117
  80. package/src/advanced/observability/adapters.ts +0 -304
  81. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  82. package/src/advanced/observability/index.ts +0 -11
  83. package/src/advanced/observability/types.ts +0 -174
  84. package/src/advanced/playground/extractPathParams.ts +0 -6
  85. package/src/advanced/playground/generateFieldExample.ts +0 -31
  86. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
  87. package/src/advanced/playground/generateSummary.ts +0 -19
  88. package/src/advanced/playground/getTagFromPath.ts +0 -9
  89. package/src/advanced/playground/index.ts +0 -8
  90. package/src/advanced/playground/playground.ts +0 -250
  91. package/src/advanced/playground/types.ts +0 -49
  92. package/src/advanced/playground/zodToExample.ts +0 -16
  93. package/src/advanced/playground/zodToParams.ts +0 -15
  94. package/src/advanced/postman/buildAuth.ts +0 -31
  95. package/src/advanced/postman/buildBody.ts +0 -15
  96. package/src/advanced/postman/buildQueryParams.ts +0 -27
  97. package/src/advanced/postman/buildRequestItem.ts +0 -36
  98. package/src/advanced/postman/buildResponses.ts +0 -11
  99. package/src/advanced/postman/buildUrl.ts +0 -33
  100. package/src/advanced/postman/capitalize.ts +0 -4
  101. package/src/advanced/postman/generateCollection.ts +0 -59
  102. package/src/advanced/postman/generateEnvironment.ts +0 -34
  103. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  104. package/src/advanced/postman/generateFieldExample.ts +0 -45
  105. package/src/advanced/postman/generateName.ts +0 -20
  106. package/src/advanced/postman/generateUUID.ts +0 -11
  107. package/src/advanced/postman/getTagFromPath.ts +0 -10
  108. package/src/advanced/postman/index.ts +0 -28
  109. package/src/advanced/postman/postman.ts +0 -156
  110. package/src/advanced/postman/slugify.ts +0 -7
  111. package/src/advanced/postman/types.ts +0 -140
  112. package/src/advanced/realtime/index.ts +0 -18
  113. package/src/advanced/realtime/websocket.ts +0 -231
  114. package/src/advanced/sentry/index.ts +0 -1236
  115. package/src/advanced/sentry/types.ts +0 -355
  116. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  117. package/src/advanced/static/generateETag.ts +0 -7
  118. package/src/advanced/static/getMimeType.ts +0 -9
  119. package/src/advanced/static/index.ts +0 -32
  120. package/src/advanced/static/isSafePath.ts +0 -13
  121. package/src/advanced/static/publicDir.ts +0 -21
  122. package/src/advanced/static/serveStatic.ts +0 -225
  123. package/src/advanced/static/spa.ts +0 -24
  124. package/src/advanced/static/types.ts +0 -159
  125. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  126. package/src/advanced/swagger/buildOperation.ts +0 -61
  127. package/src/advanced/swagger/buildParameters.ts +0 -61
  128. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  129. package/src/advanced/swagger/buildResponses.ts +0 -54
  130. package/src/advanced/swagger/capitalize.ts +0 -5
  131. package/src/advanced/swagger/convertPath.ts +0 -9
  132. package/src/advanced/swagger/createSwagger.ts +0 -12
  133. package/src/advanced/swagger/generateOperationId.ts +0 -21
  134. package/src/advanced/swagger/generateSpec.ts +0 -105
  135. package/src/advanced/swagger/generateSummary.ts +0 -24
  136. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  137. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  138. package/src/advanced/swagger/index.ts +0 -25
  139. package/src/advanced/swagger/swagger.ts +0 -237
  140. package/src/advanced/swagger/types.ts +0 -206
  141. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  142. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  143. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  144. package/src/advanced/testing/factory.ts +0 -509
  145. package/src/advanced/testing/harness.ts +0 -612
  146. package/src/advanced/testing/index.ts +0 -430
  147. package/src/advanced/testing/load-test.ts +0 -618
  148. package/src/advanced/testing/mock-server.ts +0 -498
  149. package/src/advanced/testing/mock.ts +0 -670
  150. package/src/cli/bin.ts +0 -9
  151. package/src/cli/cli.ts +0 -158
  152. package/src/cli/commands/add.ts +0 -178
  153. package/src/cli/commands/build.ts +0 -73
  154. package/src/cli/commands/create.ts +0 -166
  155. package/src/cli/commands/dev.ts +0 -85
  156. package/src/cli/commands/generate.ts +0 -99
  157. package/src/cli/commands/help.ts +0 -95
  158. package/src/cli/commands/init.ts +0 -91
  159. package/src/cli/commands/version.ts +0 -38
  160. package/src/cli/index.ts +0 -6
  161. package/src/cli/templates/generators.ts +0 -359
  162. package/src/cli/templates/index.ts +0 -680
  163. package/src/cli/utils/exec.ts +0 -52
  164. package/src/cli/utils/file-system.ts +0 -78
  165. package/src/cli/utils/logger.ts +0 -111
  166. package/src/core/adapter.ts +0 -88
  167. package/src/core/application.ts +0 -1453
  168. package/src/core/context-pool.ts +0 -79
  169. package/src/core/context.ts +0 -856
  170. package/src/core/index.ts +0 -94
  171. package/src/core/middleware.ts +0 -272
  172. package/src/core/performance/buffer-pool.ts +0 -108
  173. package/src/core/performance/middleware-optimizer.ts +0 -162
  174. package/src/core/plugin/PluginManager.ts +0 -435
  175. package/src/core/plugin/builder.ts +0 -358
  176. package/src/core/plugin/index.ts +0 -50
  177. package/src/core/plugin/types.ts +0 -214
  178. package/src/core/router/file-router.ts +0 -623
  179. package/src/core/router/index.ts +0 -260
  180. package/src/core/router/radix-tree.ts +0 -242
  181. package/src/core/serializer.ts +0 -397
  182. package/src/core/store/index.ts +0 -30
  183. package/src/core/store/registry.ts +0 -178
  184. package/src/core/store/request-store.ts +0 -240
  185. package/src/core/store/types.ts +0 -233
  186. package/src/core/types.ts +0 -616
  187. package/src/database/adapter.ts +0 -35
  188. package/src/database/adapters/index.ts +0 -1
  189. package/src/database/adapters/mysql.ts +0 -669
  190. package/src/database/database.ts +0 -70
  191. package/src/database/dialect.ts +0 -388
  192. package/src/database/index.ts +0 -12
  193. package/src/database/migrations.ts +0 -86
  194. package/src/database/optimizer.ts +0 -125
  195. package/src/database/query-builder.ts +0 -404
  196. package/src/database/realtime.ts +0 -53
  197. package/src/database/schema.ts +0 -71
  198. package/src/database/transactions.ts +0 -56
  199. package/src/database/types.ts +0 -87
  200. package/src/deployment/cluster.ts +0 -471
  201. package/src/deployment/config.ts +0 -454
  202. package/src/deployment/docker.ts +0 -599
  203. package/src/deployment/graceful-shutdown.ts +0 -373
  204. package/src/deployment/index.ts +0 -56
  205. package/src/index.ts +0 -281
  206. package/src/security/adapter.ts +0 -318
  207. package/src/security/auth/JWTPlugin.ts +0 -234
  208. package/src/security/auth/JWTProvider.ts +0 -316
  209. package/src/security/auth/adapter.ts +0 -12
  210. package/src/security/auth/jwt.ts +0 -234
  211. package/src/security/auth/middleware.ts +0 -188
  212. package/src/security/csrf.ts +0 -220
  213. package/src/security/headers.ts +0 -108
  214. package/src/security/index.ts +0 -60
  215. package/src/security/rate-limit/adapter.ts +0 -7
  216. package/src/security/rate-limit/memory.ts +0 -108
  217. package/src/security/rate-limit/middleware.ts +0 -181
  218. package/src/security/sanitization.ts +0 -75
  219. package/src/security/types.ts +0 -240
  220. package/src/security/utils.ts +0 -52
  221. package/tsconfig.json +0 -39
@@ -1,457 +0,0 @@
1
- # Sentry Data Storage - Quick Reference
2
-
3
- Referensi cepat tentang data yang dikirim ke Sentry dalam Nexus Framework.
4
-
5
- ## 1. Event Metadata (SELALU DIKIRIM)
6
-
7
- | Data | Nilai Contoh | Scope | Sensitivitas |
8
- |------|-------------|-------|-------------|
9
- | `event_id` | `a1b2c3d4` | Unique per event | ❌ Non-sensitive |
10
- | `timestamp` | `1701619200` | Time of error | ❌ Non-sensitive |
11
- | `platform` | `node` | Always Node.js | ❌ Non-sensitive |
12
- | `level` | `error`, `warning`, `info` | Set by dev | ❌ Non-sensitive |
13
- | `environment` | `production`, `staging` | Configuration | ❌ Non-sensitive |
14
- | `release` | `1.0.0` | App version | ❌ Non-sensitive |
15
-
16
- **Kesimpulan**: ✅ Aman untuk dikirim
17
-
18
- ---
19
-
20
- ## 2. Exception/Error Data (JIKA ADA ERROR)
21
-
22
- | Data | Nilai Contoh | Scope | Sensitivitas |
23
- |------|-------------|-------|-------------|
24
- | `exception.type` | `ValidationError` | Error class name | ❌ Non-sensitive |
25
- | `exception.message` | `Email is invalid` | Error message | ⚠️ Bisa sensitive |
26
- | `stacktrace.filename` | `/app/src/handlers/user.ts` | File path | ❌ Non-sensitive |
27
- | `stacktrace.function` | `createUser` | Function name | ❌ Non-sensitive |
28
- | `stacktrace.lineno` | `42` | Line number | ❌ Non-sensitive |
29
- | `stacktrace.context_line` | `const user = await db.find(id);` | Actual code | ⚠️ Bisa reveal logic |
30
-
31
- **Kesimpulan**: ⚠️ Perlu difilter jika ada data sensitif dalam error message
32
-
33
- **Contoh Filtering**:
34
- ```typescript
35
- beforeSend: (event) => {
36
- if (event.exception?.values?.[0]?.value?.includes('password')) {
37
- event.exception.values[0].value = '[REDACTED]';
38
- }
39
- return event;
40
- }
41
- ```
42
-
43
- ---
44
-
45
- ## 3. Server Context (SELALU DIKIRIM)
46
-
47
- | Data | Nilai Contoh | Scope | Sensitivitas |
48
- |------|-------------|-------|-------------|
49
- | `server_name` | `api-server-1` | Hostname | ⚠️ Bisa reveal infrastructure |
50
- | `contexts.runtime.name` | `node` | Node.js | ❌ Non-sensitive |
51
- | `contexts.runtime.version` | `v20.10.0` | Node version | ❌ Non-sensitive |
52
- | `contexts.os.name` | `linux` | Operating system | ⚠️ Infrastructure info |
53
- | `contexts.os.version` | `x64` | Architecture | ⚠️ Infrastructure info |
54
-
55
- **Kesimpulan**: ⚠️ Reveal infrastructure, tapi biasanya aman untuk production
56
-
57
- **Trik**: Gunakan generic name untuk `server_name`:
58
- ```typescript
59
- app.sentry({
60
- serverName: `api-server-${process.env.REGION || 'unknown'}`
61
- });
62
- ```
63
-
64
- ---
65
-
66
- ## 4. User Context (CONDITIONAL - Dari `extractUser`)
67
-
68
- | Data | Nilai Contoh | Scope | Sensitivitas |
69
- |------|-------------|-------|-------------|
70
- | `user.id` | `user-12345` | User identifier | ✅ Safe for PII |
71
- | `user.email` | `john@example.com` | Email address | ⚠️ PII (Personal Identifiable Info) |
72
- | `user.username` | `john_doe` | Username | ⚠️ PII |
73
- | `user.ip_address` | `192.168.1.1` | IP address | ⚠️ PII |
74
- | `user.custom_field` | Any custom data | Custom context | ⚠️ Tergantung data |
75
-
76
- **Kesimpulan**: ⚠️ SENSITIVE - Hanya kirim jika perlu & user setuju
77
-
78
- **Kontrol Data**:
79
- ```typescript
80
- app.sentry({
81
- sendDefaultPii: false // Default
82
- }, {
83
- extractUser: (ctx) => {
84
- if (!ctx.user) return null;
85
-
86
- return {
87
- id: ctx.user.id,
88
- // email: ctx.user.email, // Jangan kirim tanpa persetujuan
89
- // username: ctx.user.name, // Jangan kirim tanpa persetujuan
90
- subscription_tier: ctx.user.plan // Non-PII, safe
91
- };
92
- }
93
- });
94
- ```
95
-
96
- **GDPR Compliance**:
97
- - Email/username adalah PII
98
- - Perlu user consent
99
- - User bisa request deletion
100
-
101
- ---
102
-
103
- ## 5. HTTP Request Context (DARI MIDDLEWARE)
104
-
105
- | Data | Nilai Contoh | Scope | Sensitivitas |
106
- |------|-------------|-------|-------------|
107
- | `request.url` | `https://api.example.com/api/users` | Full URL | ✅ Safe |
108
- | `request.method` | `POST` | HTTP method | ✅ Safe |
109
- | `request.query_string` | `sort=name&limit=10` | Query params | ⚠️ Bisa contain tokens |
110
- | `request.headers.user-agent` | `Mozilla/5.0...` | Browser info | ✅ Safe |
111
- | `request.headers.authorization` | `Bearer token123` | Auth token | 🔴 SENSITIVE |
112
- | `request.data` | `{name: "John", email: "..."}` | Request body | ⚠️ Bisa contain sensitive |
113
-
114
- **Kesimpulan**: 🔴 SENSITIVE - Perlu exclude headers & filter body
115
-
116
- **Kontrol Data**:
117
- ```typescript
118
- app.sentry({}, {
119
- // Include request body?
120
- includeRequestBody: false, // Default
121
-
122
- // Include headers?
123
- includeHeaders: true,
124
-
125
- // Exclude sensitive headers
126
- excludeHeaders: [
127
- 'authorization',
128
- 'cookie',
129
- 'x-api-key',
130
- 'x-auth-token',
131
- 'x-csrf-token',
132
- 'password'
133
- ]
134
- });
135
- ```
136
-
137
- **Contoh Safe**:
138
- ```json
139
- {
140
- "request": {
141
- "url": "https://api.example.com/api/checkout",
142
- "method": "POST",
143
- "headers": {
144
- "user-agent": "Mozilla/5.0...",
145
- "content-type": "application/json"
146
- }
147
- // authorization DIHAPUS
148
- // data DIHAPUS
149
- }
150
- }
151
- ```
152
-
153
- **Contoh NOT Safe**:
154
- ```json
155
- {
156
- "request": {
157
- "headers": {
158
- "authorization": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." // 🔴
159
- },
160
- "data": {
161
- "credit_card": "4111-1111-1111-1111", // 🔴
162
- "password": "super_secret_123" // 🔴
163
- }
164
- }
165
- }
166
- ```
167
-
168
- ---
169
-
170
- ## 6. Tags (GLOBAL + PER-EVENT)
171
-
172
- | Data | Nilai Contoh | Scope | Sensitivitas |
173
- |------|-------------|-------|-------------|
174
- | `tags.http.method` | `POST` | Auto-added | ✅ Safe |
175
- | `tags.http.status_code` | `500` | Auto-added | ✅ Safe |
176
- | `tags.environment` | `production` | Configuration | ✅ Safe |
177
- | `tags.team` | `backend` | Custom | ✅ Safe |
178
- | `tags.feature` | `payments` | Custom | ✅ Safe |
179
- | `tags.user_id` | `user-123` | Custom | ✅ Safe |
180
-
181
- **Kesimpulan**: ✅ Tags safe untuk dikirim, berguna untuk filtering
182
-
183
- **Penggunaan**:
184
- ```typescript
185
- // Global tags
186
- app.sentry({
187
- tags: {
188
- app: 'my-api',
189
- version: '1.0.0',
190
- team: 'backend',
191
- region: 'us-east-1'
192
- }
193
- });
194
-
195
- // Per-event tags
196
- captureException(error, {
197
- tags: {
198
- module: 'payments',
199
- operation: 'charge',
200
- priority: 'high'
201
- }
202
- });
203
- ```
204
-
205
- ---
206
-
207
- ## 7. Extra Context (GLOBAL + PER-EVENT)
208
-
209
- | Data | Nilai Contoh | Scope | Sensitivitas |
210
- |------|-------------|-------|-------------|
211
- | `extra.order_id` | `order-456` | Custom ID | ✅ Safe |
212
- | `extra.user_id` | `user-123` | Custom ID | ✅ Safe |
213
- | `extra.amount` | `99.99` | Amount | ✅ Safe |
214
- | `extra.payment_method` | `credit_card` | Type | ✅ Safe |
215
- | `extra.db_query_time_ms` | `245` | Performance | ✅ Safe |
216
- | `extra.raw_request_body` | Full body object | Custom | 🔴 SENSITIVE |
217
-
218
- **Kesimpulan**: ⚠️ Extra useful tapi careful dengan sensitive data
219
-
220
- **Safe Extra**:
221
- ```typescript
222
- setExtra('checkout_context', {
223
- order_id: 'order-456',
224
- user_tier: 'premium',
225
- cart_items: 3,
226
- total: 99.99,
227
- payment_method: 'credit_card', // Type only, not details
228
- processing_time_ms: 245
229
- });
230
- ```
231
-
232
- **NOT Safe Extra**:
233
- ```typescript
234
- setExtra('raw_request', {
235
- password: 'user_password', // 🔴
236
- credit_card: '4111-1111-1111-1111', // 🔴
237
- full_body: req.body // 🔴 Might contain sensitive data
238
- });
239
- ```
240
-
241
- ---
242
-
243
- ## 8. Breadcrumbs (PER-REQUEST, MAX 100)
244
-
245
- | Data | Nilai Contoh | Scope | Sensitivitas |
246
- |------|-------------|-------|-------------|
247
- | `type` | `http`, `database`, `error` | Event type | ✅ Safe |
248
- | `category` | `http.request`, `db.query` | Category | ✅ Safe |
249
- | `message` | `GET /api/users` | Short message | ✅ Safe |
250
- | `level` | `info`, `warning`, `error` | Severity | ✅ Safe |
251
- | `data.url` | `/api/users` | URL | ✅ Safe |
252
- | `data.status_code` | `200` | HTTP status | ✅ Safe |
253
- | `data.duration_ms` | `45` | Duration | ✅ Safe |
254
- | `data.query` | Full SQL query | SQL statement | ⚠️ Bisa reveal schema |
255
-
256
- **Kesimpulan**: ✅ Breadcrumbs mostly safe, tapi careful dengan SQL queries
257
-
258
- **Safe Breadcrumbs**:
259
- ```typescript
260
- addBreadcrumb({
261
- type: 'http',
262
- category: 'api.call',
263
- message: 'Fetching user',
264
- data: {
265
- method: 'GET',
266
- url: '/api/users/123',
267
- status_code: 200,
268
- duration_ms: 45
269
- }
270
- });
271
-
272
- addBreadcrumb({
273
- type: 'query',
274
- category: 'database',
275
- message: 'Find user by ID',
276
- data: {
277
- operation: 'SELECT',
278
- table: 'users',
279
- duration_ms: 15
280
- // Jangan: full_query: 'SELECT * FROM users WHERE...'
281
- }
282
- });
283
- ```
284
-
285
- ---
286
-
287
- ## 9. Performance Tracing (CONDITIONAL)
288
-
289
- | Data | Nilai Contoh | Scope | Sensitivitas |
290
- |------|-------------|-------|-------------|
291
- | `trace_id` | `a1b2c3d4e5f6` | Unique trace | ✅ Safe |
292
- | `span_id` | `k1l2m3n4` | Unique span | ✅ Safe |
293
- | `op` | `http.server`, `db.query` | Operation | ✅ Safe |
294
- | `status` | `ok`, `error` | Status | ✅ Safe |
295
- | `duration` | `245ms` | Duration | ✅ Safe |
296
- | `tags` | Various | Custom tags | ✅ Safe if no PII |
297
- | `data` | Various | Performance data | ✅ Safe if no sensitive |
298
-
299
- **Kesimpulan**: ✅ Performance data safe, berguna untuk optimization
300
-
301
- ---
302
-
303
- ## Quick Checklist: Apa Boleh/Tidak Boleh
304
-
305
- ### ✅ AMAN untuk dikirim:
306
- - [x] Error messages (non-sensitive)
307
- - [x] Stack traces
308
- - [x] HTTP method & status codes
309
- - [x] URLs (tanpa sensitive query params)
310
- - [x] Timestamps
311
- - [x] Performance metrics (duration, latency)
312
- - [x] Feature flags
313
- - [x] User IDs (anonymous identifiers)
314
- - [x] Error codes
315
- - [x] Tags & breadcrumbs
316
-
317
- ### 🔴 JANGAN dikirim:
318
- - [ ] Passwords
319
- - [ ] API keys & tokens
320
- - [ ] Credit card numbers
321
- - [ ] Full request bodies (tanpa filtering)
322
- - [ ] Authorization headers (kecuali di-sanitize)
323
- - [ ] Database connection strings
324
- - [ ] Private keys
325
- - [ ] Full SQL queries (bisa reveal schema)
326
- - [ ] PII tanpa consent (email, username, IP)
327
-
328
- ### ⚠️ CAREFUL (Filter dulu):
329
- - [ ] Email addresses
330
- - [ ] Phone numbers
331
- - [ ] URLs dengan sensitive query params
332
- - [ ] Custom user data
333
- - [ ] Full error messages (bisa contain sensitive data)
334
-
335
- ---
336
-
337
- ## Contoh Implementasi Aman
338
-
339
- ```typescript
340
- import { createApp } from 'nexus';
341
-
342
- const app = createApp();
343
-
344
- app.sentry({
345
- dsn: process.env.SENTRY_DSN!,
346
- environment: process.env.NODE_ENV,
347
- release: process.env.npm_package_version,
348
-
349
- // Global tags - safe data only
350
- tags: {
351
- app: 'my-api',
352
- team: 'backend',
353
- region: process.env.AWS_REGION
354
- },
355
-
356
- // Global extra - safe data only
357
- extra: {
358
- database: 'postgres',
359
- cache: 'redis',
360
- version: '1.0.0'
361
- },
362
-
363
- // Send default PII? No!
364
- sendDefaultPii: false,
365
-
366
- // Filter events before sending
367
- beforeSend: (event, hint) => {
368
- const error = hint?.originalException;
369
-
370
- // Remove sensitive from error message
371
- if (error?.message) {
372
- event.exception?.values?.forEach(exc => {
373
- exc.value = exc.value
374
- .replace(/token[:=]\s*\S+/gi, 'token=[REDACTED]')
375
- .replace(/password[:=]\s*\S+/gi, 'password=[REDACTED]')
376
- .replace(/apikey[:=]\s*\S+/gi, 'apikey=[REDACTED]');
377
- });
378
- }
379
-
380
- // Remove request body
381
- if (event.request?.data) {
382
- delete event.request.data;
383
- }
384
-
385
- return event;
386
- }
387
- }, {
388
- // Middleware config
389
- includeRequestBody: false,
390
- includeHeaders: true,
391
-
392
- // Exclude sensitive headers
393
- excludeHeaders: [
394
- 'authorization',
395
- 'cookie',
396
- 'x-api-key',
397
- 'x-auth-token',
398
- 'x-csrf-token',
399
- 'proxy-authorization'
400
- ],
401
-
402
- // Ignore health check paths
403
- ignorePaths: ['/health', '/metrics', '/__nexus/health'],
404
-
405
- // Extract only safe user data
406
- extractUser: (ctx) => {
407
- if (!ctx.user) return null;
408
-
409
- return {
410
- id: ctx.user.id, // Safe: user ID
411
- subscription_tier: ctx.user.plan, // Safe: subscription tier
412
- // email: ctx.user.email, // NOT included without consent
413
- // phone: ctx.user.phone // NOT included without consent
414
- };
415
- }
416
- });
417
-
418
- app.listen(3000);
419
- ```
420
-
421
- ---
422
-
423
- ## Troubleshooting
424
-
425
- ### "Terlalu banyak data dikirim"
426
- ```typescript
427
- // Reduce trace sample rate
428
- app.sentry({
429
- tracesSampleRate: 0.05 // 5% instead of 10%
430
- });
431
- ```
432
-
433
- ### "Data sensitif terlihat di Sentry"
434
- ```typescript
435
- // Use beforeSend to filter
436
- beforeSend: (event) => {
437
- // Scrub sensitive data
438
- return event;
439
- }
440
- ```
441
-
442
- ### "Quota Sentry penuh"
443
- ```typescript
444
- // Reduce error sample rate
445
- app.sentry({
446
- sampleRate: 0.5 // 50% instead of 100%
447
- });
448
-
449
- // Or ignore certain errors
450
- app.sentry({
451
- ignoreErrors: [
452
- 'NetworkError',
453
- '404',
454
- 'timeout'
455
- ]
456
- });
457
- ```