@engjts/nexus 0.1.8 → 0.1.9

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 (205) hide show
  1. package/package.json +1 -1
  2. package/BENCHMARK_REPORT.md +0 -343
  3. package/documentation/01-getting-started.md +0 -240
  4. package/documentation/02-context.md +0 -335
  5. package/documentation/03-routing.md +0 -397
  6. package/documentation/04-middleware.md +0 -483
  7. package/documentation/05-validation.md +0 -514
  8. package/documentation/06-error-handling.md +0 -465
  9. package/documentation/07-performance.md +0 -364
  10. package/documentation/08-adapters.md +0 -470
  11. package/documentation/09-api-reference.md +0 -548
  12. package/documentation/10-examples.md +0 -582
  13. package/documentation/11-deployment.md +0 -477
  14. package/documentation/12-sentry.md +0 -620
  15. package/documentation/13-sentry-data-storage.md +0 -996
  16. package/documentation/14-sentry-data-reference.md +0 -457
  17. package/documentation/15-sentry-summary.md +0 -409
  18. package/documentation/16-alerts-system.md +0 -745
  19. package/documentation/17-alert-adapters.md +0 -696
  20. package/documentation/18-alerts-implementation-summary.md +0 -385
  21. package/documentation/19-class-based-routing.md +0 -840
  22. package/documentation/20-websocket-realtime.md +0 -813
  23. package/documentation/21-cache-system.md +0 -510
  24. package/documentation/22-job-queue.md +0 -772
  25. package/documentation/23-sentry-plugin.md +0 -551
  26. package/documentation/24-testing-utilities.md +0 -1287
  27. package/documentation/25-api-versioning.md +0 -533
  28. package/documentation/26-context-store.md +0 -607
  29. package/documentation/27-dependency-injection.md +0 -329
  30. package/documentation/28-lifecycle-hooks.md +0 -521
  31. package/documentation/29-package-structure.md +0 -196
  32. package/documentation/30-plugin-system.md +0 -414
  33. package/documentation/31-jwt-authentication.md +0 -597
  34. package/documentation/32-cli.md +0 -268
  35. package/documentation/ALERTS-COMPLETE-SUMMARY.md +0 -429
  36. package/documentation/ALERTS-INDEX.md +0 -330
  37. package/documentation/ALERTS-QUICK-REFERENCE.md +0 -286
  38. package/documentation/README.md +0 -178
  39. package/documentation/index.html +0 -34
  40. package/modern_framework_paper.md +0 -1870
  41. package/public/css/style.css +0 -87
  42. package/public/index.html +0 -34
  43. package/public/js/app.js +0 -27
  44. package/src/advanced/cache/InMemoryCacheStore.ts +0 -68
  45. package/src/advanced/cache/MultiTierCache.ts +0 -194
  46. package/src/advanced/cache/RedisCacheStore.ts +0 -341
  47. package/src/advanced/cache/index.ts +0 -5
  48. package/src/advanced/cache/types.ts +0 -40
  49. package/src/advanced/graphql/SimpleDataLoader.ts +0 -42
  50. package/src/advanced/graphql/index.ts +0 -22
  51. package/src/advanced/graphql/server.ts +0 -252
  52. package/src/advanced/graphql/types.ts +0 -42
  53. package/src/advanced/jobs/InMemoryQueueStore.ts +0 -68
  54. package/src/advanced/jobs/JobQueue.ts +0 -556
  55. package/src/advanced/jobs/RedisQueueStore.ts +0 -367
  56. package/src/advanced/jobs/index.ts +0 -5
  57. package/src/advanced/jobs/types.ts +0 -70
  58. package/src/advanced/observability/APMManager.ts +0 -163
  59. package/src/advanced/observability/AlertManager.ts +0 -109
  60. package/src/advanced/observability/MetricRegistry.ts +0 -151
  61. package/src/advanced/observability/ObservabilityCenter.ts +0 -304
  62. package/src/advanced/observability/StructuredLogger.ts +0 -154
  63. package/src/advanced/observability/TracingManager.ts +0 -117
  64. package/src/advanced/observability/adapters.ts +0 -304
  65. package/src/advanced/observability/createObservabilityMiddleware.ts +0 -63
  66. package/src/advanced/observability/index.ts +0 -11
  67. package/src/advanced/observability/types.ts +0 -174
  68. package/src/advanced/playground/extractPathParams.ts +0 -6
  69. package/src/advanced/playground/generateFieldExample.ts +0 -31
  70. package/src/advanced/playground/generatePlaygroundHTML.ts +0 -1956
  71. package/src/advanced/playground/generateSummary.ts +0 -19
  72. package/src/advanced/playground/getTagFromPath.ts +0 -9
  73. package/src/advanced/playground/index.ts +0 -8
  74. package/src/advanced/playground/playground.ts +0 -250
  75. package/src/advanced/playground/types.ts +0 -49
  76. package/src/advanced/playground/zodToExample.ts +0 -16
  77. package/src/advanced/playground/zodToParams.ts +0 -15
  78. package/src/advanced/postman/buildAuth.ts +0 -31
  79. package/src/advanced/postman/buildBody.ts +0 -15
  80. package/src/advanced/postman/buildQueryParams.ts +0 -27
  81. package/src/advanced/postman/buildRequestItem.ts +0 -36
  82. package/src/advanced/postman/buildResponses.ts +0 -11
  83. package/src/advanced/postman/buildUrl.ts +0 -33
  84. package/src/advanced/postman/capitalize.ts +0 -4
  85. package/src/advanced/postman/generateCollection.ts +0 -59
  86. package/src/advanced/postman/generateEnvironment.ts +0 -34
  87. package/src/advanced/postman/generateExampleFromZod.ts +0 -21
  88. package/src/advanced/postman/generateFieldExample.ts +0 -45
  89. package/src/advanced/postman/generateName.ts +0 -20
  90. package/src/advanced/postman/generateUUID.ts +0 -11
  91. package/src/advanced/postman/getTagFromPath.ts +0 -10
  92. package/src/advanced/postman/index.ts +0 -28
  93. package/src/advanced/postman/postman.ts +0 -156
  94. package/src/advanced/postman/slugify.ts +0 -7
  95. package/src/advanced/postman/types.ts +0 -140
  96. package/src/advanced/realtime/index.ts +0 -18
  97. package/src/advanced/realtime/websocket.ts +0 -231
  98. package/src/advanced/sentry/index.ts +0 -1236
  99. package/src/advanced/sentry/types.ts +0 -355
  100. package/src/advanced/static/generateDirectoryListing.ts +0 -47
  101. package/src/advanced/static/generateETag.ts +0 -7
  102. package/src/advanced/static/getMimeType.ts +0 -9
  103. package/src/advanced/static/index.ts +0 -32
  104. package/src/advanced/static/isSafePath.ts +0 -13
  105. package/src/advanced/static/publicDir.ts +0 -21
  106. package/src/advanced/static/serveStatic.ts +0 -225
  107. package/src/advanced/static/spa.ts +0 -24
  108. package/src/advanced/static/types.ts +0 -159
  109. package/src/advanced/swagger/SwaggerGenerator.ts +0 -66
  110. package/src/advanced/swagger/buildOperation.ts +0 -61
  111. package/src/advanced/swagger/buildParameters.ts +0 -61
  112. package/src/advanced/swagger/buildRequestBody.ts +0 -21
  113. package/src/advanced/swagger/buildResponses.ts +0 -54
  114. package/src/advanced/swagger/capitalize.ts +0 -5
  115. package/src/advanced/swagger/convertPath.ts +0 -9
  116. package/src/advanced/swagger/createSwagger.ts +0 -12
  117. package/src/advanced/swagger/generateOperationId.ts +0 -21
  118. package/src/advanced/swagger/generateSpec.ts +0 -105
  119. package/src/advanced/swagger/generateSummary.ts +0 -24
  120. package/src/advanced/swagger/generateSwaggerUI.ts +0 -70
  121. package/src/advanced/swagger/generateThemeCss.ts +0 -53
  122. package/src/advanced/swagger/index.ts +0 -25
  123. package/src/advanced/swagger/swagger.ts +0 -237
  124. package/src/advanced/swagger/types.ts +0 -206
  125. package/src/advanced/swagger/zodFieldToOpenAPI.ts +0 -94
  126. package/src/advanced/swagger/zodSchemaToOpenAPI.ts +0 -50
  127. package/src/advanced/swagger/zodToOpenAPI.ts +0 -22
  128. package/src/advanced/testing/factory.ts +0 -509
  129. package/src/advanced/testing/harness.ts +0 -612
  130. package/src/advanced/testing/index.ts +0 -430
  131. package/src/advanced/testing/load-test.ts +0 -618
  132. package/src/advanced/testing/mock-server.ts +0 -498
  133. package/src/advanced/testing/mock.ts +0 -670
  134. package/src/cli/bin.ts +0 -9
  135. package/src/cli/cli.ts +0 -158
  136. package/src/cli/commands/add.ts +0 -178
  137. package/src/cli/commands/build.ts +0 -73
  138. package/src/cli/commands/create.ts +0 -166
  139. package/src/cli/commands/dev.ts +0 -85
  140. package/src/cli/commands/generate.ts +0 -99
  141. package/src/cli/commands/help.ts +0 -95
  142. package/src/cli/commands/init.ts +0 -91
  143. package/src/cli/commands/version.ts +0 -38
  144. package/src/cli/index.ts +0 -6
  145. package/src/cli/templates/generators.ts +0 -359
  146. package/src/cli/templates/index.ts +0 -680
  147. package/src/cli/utils/exec.ts +0 -52
  148. package/src/cli/utils/file-system.ts +0 -78
  149. package/src/cli/utils/logger.ts +0 -111
  150. package/src/core/adapter.ts +0 -88
  151. package/src/core/application.ts +0 -1453
  152. package/src/core/context-pool.ts +0 -79
  153. package/src/core/context.ts +0 -856
  154. package/src/core/index.ts +0 -94
  155. package/src/core/middleware.ts +0 -272
  156. package/src/core/performance/buffer-pool.ts +0 -108
  157. package/src/core/performance/middleware-optimizer.ts +0 -162
  158. package/src/core/plugin/PluginManager.ts +0 -435
  159. package/src/core/plugin/builder.ts +0 -358
  160. package/src/core/plugin/index.ts +0 -50
  161. package/src/core/plugin/types.ts +0 -214
  162. package/src/core/router/file-router.ts +0 -623
  163. package/src/core/router/index.ts +0 -260
  164. package/src/core/router/radix-tree.ts +0 -242
  165. package/src/core/serializer.ts +0 -397
  166. package/src/core/store/index.ts +0 -30
  167. package/src/core/store/registry.ts +0 -178
  168. package/src/core/store/request-store.ts +0 -240
  169. package/src/core/store/types.ts +0 -233
  170. package/src/core/types.ts +0 -616
  171. package/src/database/adapter.ts +0 -35
  172. package/src/database/adapters/index.ts +0 -1
  173. package/src/database/adapters/mysql.ts +0 -669
  174. package/src/database/database.ts +0 -70
  175. package/src/database/dialect.ts +0 -388
  176. package/src/database/index.ts +0 -12
  177. package/src/database/migrations.ts +0 -86
  178. package/src/database/optimizer.ts +0 -125
  179. package/src/database/query-builder.ts +0 -404
  180. package/src/database/realtime.ts +0 -53
  181. package/src/database/schema.ts +0 -71
  182. package/src/database/transactions.ts +0 -56
  183. package/src/database/types.ts +0 -87
  184. package/src/deployment/cluster.ts +0 -471
  185. package/src/deployment/config.ts +0 -454
  186. package/src/deployment/docker.ts +0 -599
  187. package/src/deployment/graceful-shutdown.ts +0 -373
  188. package/src/deployment/index.ts +0 -56
  189. package/src/index.ts +0 -281
  190. package/src/security/adapter.ts +0 -318
  191. package/src/security/auth/JWTPlugin.ts +0 -234
  192. package/src/security/auth/JWTProvider.ts +0 -316
  193. package/src/security/auth/adapter.ts +0 -12
  194. package/src/security/auth/jwt.ts +0 -234
  195. package/src/security/auth/middleware.ts +0 -188
  196. package/src/security/csrf.ts +0 -220
  197. package/src/security/headers.ts +0 -108
  198. package/src/security/index.ts +0 -60
  199. package/src/security/rate-limit/adapter.ts +0 -7
  200. package/src/security/rate-limit/memory.ts +0 -108
  201. package/src/security/rate-limit/middleware.ts +0 -181
  202. package/src/security/sanitization.ts +0 -75
  203. package/src/security/types.ts +0 -240
  204. package/src/security/utils.ts +0 -52
  205. 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
- ```