@abtnode/constant 1.17.8-beta-20260119-102944-6ba93a16 → 1.17.8-beta-20260125-093329-64b43854

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/index.js DELETED
@@ -1,951 +0,0 @@
1
- const NODE_SERVICES = Object.freeze({
2
- AUTH: 'auth',
3
- });
4
-
5
- const ROLES = Object.freeze({
6
- OWNER: 'owner',
7
- ADMIN: 'admin',
8
- MEMBER: 'member',
9
- GUEST: 'guest',
10
- });
11
-
12
- const SERVER_ROLES = Object.freeze({
13
- ...ROLES,
14
- CI: 'ci',
15
- CERTIFICATE: 'certificate',
16
-
17
- // blocklet user or sdk. must start with 'blocklet-
18
- BLOCKLET_OWNER: 'blocklet-owner',
19
- BLOCKLET_ADMIN: 'blocklet-admin',
20
- BLOCKLET_MEMBER: 'blocklet-member',
21
- BLOCKLET_SDK: 'blocklet-sdk',
22
-
23
- // external user
24
- EXTERNAL_BLOCKLET_CONTROLLER: 'external-blocklet-controller',
25
- EXTERNAL_BLOCKLETS_MANAGER: 'external-blocklets-manager',
26
- });
27
-
28
- const SERVICES_ROLES = Object.freeze({
29
- BLOCKLET_GUEST: 'blocklet-guest',
30
- });
31
-
32
- const BLOCKLET_ROLES = [
33
- SERVER_ROLES.BLOCKLET_OWNER,
34
- SERVER_ROLES.BLOCKLET_ADMIN,
35
- SERVER_ROLES.BLOCKLET_MEMBER,
36
- SERVER_ROLES.BLOCKLET_SDK,
37
- ];
38
-
39
- const isBlockletRole = (role) => role && BLOCKLET_ROLES.includes(role);
40
- const isSystemRole = (role) => role && ROLES[(role || '').toUpperCase()];
41
-
42
- const BLOCKLET_MULTIPLE_TENANT_ROLES = [
43
- SERVER_ROLES.BLOCKLET_OWNER,
44
- SERVER_ROLES.BLOCKLET_ADMIN,
45
- SERVER_ROLES.BLOCKLET_MEMBER,
46
- SERVER_ROLES.BLOCKLET_SDK,
47
- SERVICES_ROLES.BLOCKLET_GUEST,
48
- ];
49
-
50
- const isBlockletMultipleTenantRole = (role) => role && BLOCKLET_MULTIPLE_TENANT_ROLES.includes(role);
51
-
52
- const AUTH_CERT_TYPE = {
53
- USER: 'user',
54
- OWNERSHIP_NFT: 'ownership_nft',
55
- BLOCKLET_USER: 'blocklet_user',
56
- BLOCKLET_CONTROLLER: 'blocklet_controller',
57
- };
58
-
59
- const RBAC_CONFIG = {
60
- roles: Object.freeze([
61
- {
62
- name: SERVER_ROLES.OWNER,
63
- title: 'Owner',
64
- description: 'Has full administrative access to the Blocklet Server',
65
- passport: true,
66
- },
67
- {
68
- name: SERVER_ROLES.ADMIN,
69
- title: 'Admin',
70
- description:
71
- 'Has full permissions to manage blocklet and Blocklet Server such as install/remove/start/stop blocklet, manage blocklet URL mapping and certificates, manage blocklet team, manage node integrations and access keys, upgrade node to a new version',
72
- passport: true,
73
- },
74
- {
75
- name: SERVER_ROLES.MEMBER,
76
- title: 'Member',
77
- description:
78
- 'Has permissions to manage blocklets, such as install/remove/start/stop blocklet, manage blocklet URL mapping and certificates',
79
- passport: true,
80
- },
81
- {
82
- name: SERVER_ROLES.GUEST,
83
- title: 'Guest',
84
- description: 'Has all read permissions on Blocklet Server',
85
- passport: true,
86
- },
87
- {
88
- name: SERVER_ROLES.CI,
89
- title: 'CI',
90
- description: 'Deploy blocklet to Blocklet Server',
91
- passport: true,
92
- noHuman: true,
93
- },
94
- {
95
- name: SERVER_ROLES.CERTIFICATE,
96
- title: 'Certificate',
97
- description: 'Manage https certificates for blocklets on the Blocklet Server',
98
- noHuman: true,
99
- },
100
- {
101
- name: SERVER_ROLES.BLOCKLET_OWNER,
102
- title: 'Blocklet Owner',
103
- },
104
- {
105
- name: SERVER_ROLES.BLOCKLET_ADMIN,
106
- title: 'Blocklet Admin',
107
- },
108
- {
109
- name: SERVER_ROLES.BLOCKLET_MEMBER,
110
- title: 'Blocklet Member',
111
- },
112
- {
113
- name: SERVER_ROLES.BLOCKLET_SDK,
114
- title: 'Blocklet SDK',
115
- },
116
- {
117
- name: SERVER_ROLES.EXTERNAL_BLOCKLET_CONTROLLER,
118
- title: 'External Blocklet Controller',
119
- },
120
- {
121
- name: SERVER_ROLES.EXTERNAL_BLOCKLETS_MANAGER,
122
- title: 'External Blocklets Manager',
123
- description: 'Manage external blocklets in the Blocklet Server',
124
- noHuman: true,
125
- },
126
- ]),
127
- permissions: Object.freeze([
128
- {
129
- name: 'query_node',
130
- description:
131
- 'View node data, include dashboard and node settings, log stream for both Blocklet Server and blocklets',
132
- },
133
- {
134
- name: 'mutate_node',
135
- description: 'Change node settings, upgrade node to a new version',
136
- },
137
- {
138
- name: 'query_session',
139
- description: 'Get data from a long running session',
140
- },
141
- {
142
- name: 'mutate_session',
143
- description: 'Start/update/end a long running session',
144
- },
145
- {
146
- name: 'query_accessKey',
147
- description: 'View access keys for Blocklet Server',
148
- },
149
- {
150
- name: 'mutate_accessKey',
151
- description: 'Manage access keys for server and blocklets, such as create/update/delete',
152
- },
153
- {
154
- name: 'query_team',
155
- description: 'View team data(members/roles/permissions) for Blocklet Server and blocklets',
156
- },
157
- {
158
- name: 'mutate_team',
159
- description: 'Manage team data(members/roles/permissions) for Blocklet Server and blocklets',
160
- },
161
- {
162
- name: 'query_blocklets',
163
- description: 'View store and installed blocklets, including blocklet runtime configuration, domains and urls',
164
- },
165
- {
166
- name: 'mutate_blocklets',
167
- description: 'Perform state changing actions on blocklets, such as install/upgrade/config/start/stop/remove',
168
- },
169
- {
170
- name: 'query_router',
171
- description: 'View sites, URL mapping and certificates in service gateway',
172
- },
173
- {
174
- name: 'mutate_router',
175
- description: 'Manage sites, URL mapping and certificates in service gateway',
176
- },
177
- {
178
- name: 'query_certificate',
179
- description: 'View certificates in service gateway',
180
- },
181
- {
182
- name: 'mutate_certificate',
183
- description: 'Manage certificates in service gateway',
184
- },
185
- {
186
- name: 'query_notification',
187
- description: 'View notifications',
188
- },
189
- {
190
- name: 'mutate_notification',
191
- description: 'Manage notifications, such as mark notifications as read',
192
- },
193
- {
194
- name: 'query_webhook',
195
- description: 'View integrations',
196
- },
197
- {
198
- name: 'mutate_webhook',
199
- description: 'Manage integrations',
200
- },
201
- // query_blocklet, mutate_blocklet are only for blocklet members
202
- {
203
- name: 'query_blocklet',
204
- description: 'View a blocklet, including blocklet runtime configuration, domains and urls',
205
- },
206
- {
207
- name: 'mutate_blocklet',
208
- description: 'Perform state changing actions on a blocklet, such as upgrade/config/start/stop',
209
- },
210
- ]),
211
- grants: Object.freeze({
212
- [SERVER_ROLES.GUEST]: [
213
- 'query_blocklets',
214
- 'query_router',
215
- 'query_webhook',
216
- 'query_notification',
217
- 'query_team',
218
- 'query_accessKey',
219
- 'query_node',
220
- 'query_session',
221
- ],
222
- [SERVER_ROLES.MEMBER]: [
223
- SERVER_ROLES.GUEST,
224
- 'mutate_blocklets',
225
- 'mutate_router',
226
- 'mutate_notification',
227
- 'mutate_session',
228
- ],
229
- [SERVER_ROLES.ADMIN]: [
230
- SERVER_ROLES.MEMBER,
231
- 'mutate_team',
232
- 'mutate_webhook',
233
- 'mutate_accessKey',
234
- 'mutate_node',
235
- 'mutate_certificate',
236
- ],
237
- [SERVER_ROLES.OWNER]: [ROLES.ADMIN],
238
- [SERVER_ROLES.CI]: ['query_blocklets', 'mutate_blocklets'],
239
- [SERVER_ROLES.CERTIFICATE]: ['query_certificate', 'mutate_certificate'],
240
-
241
- // blocklet app or blocklet user
242
- [SERVER_ROLES.BLOCKLET_SDK]: ['query_team', 'mutate_team', 'query_blocklet', 'query_accessKey', 'mutate_accessKey'],
243
- [SERVER_ROLES.BLOCKLET_OWNER]: [SERVER_ROLES.BLOCKLET_ADMIN],
244
- [SERVER_ROLES.BLOCKLET_ADMIN]: [
245
- SERVER_ROLES.BLOCKLET_MEMBER,
246
- 'mutate_team',
247
- 'mutate_accessKey',
248
- 'mutate_blocklet',
249
- 'mutate_notification',
250
- ],
251
- [SERVER_ROLES.BLOCKLET_MEMBER]: ['query_team', 'query_blocklet', 'query_notification', 'query_accessKey'],
252
-
253
- // external user
254
- [SERVER_ROLES.EXTERNAL_BLOCKLET_CONTROLLER]: ['query_blocklets', 'mutate_blocklets'],
255
- [SERVER_ROLES.EXTERNAL_BLOCKLETS_MANAGER]: ['query_blocklets', 'mutate_blocklets', 'query_node'],
256
- }),
257
- };
258
-
259
- const DAY_IN_MS = 24 * 60 * 60 * 1000;
260
-
261
- const EVENTS = {
262
- NOTIFICATION_CREATE: 'notification.create',
263
- NOTIFICATION_READ: 'notification.read',
264
- NOTIFICATION_BLOCKLET_READ: 'blocklet.notification.read',
265
- NOTIFICATION_BLOCKLET_CREATE: 'notification.blockletCreate',
266
- NOTIFICATION_BLOCKLET_UPDATE: 'notification.blockletUpdate',
267
- ROUTING_UPDATED: 'routing.updated',
268
- NODE_UPDATED: 'node.updated',
269
- NODE_MAINTAIN_PROGRESS: 'node.upgrade.progress',
270
- NODE_STARTED: 'node.started',
271
- NODE_STOPPED: 'node.stopped',
272
- NODE_ADDED_OWNER: 'node.addedOwner',
273
- NODE_RUNTIME_INFO: 'node.runtimeInfo',
274
- BLOCKLETS_RUNTIME_INFO: 'node.blockletsRuntimeInfo',
275
- DOMAIN_STATUS: 'domain.status',
276
- CERT_ADDED: 'cert.added',
277
- CERT_ISSUED: 'cert.issued',
278
- CERT_UPDATED: 'cert.updated',
279
- CERT_REMOVED: 'cert.removed',
280
- CERT_ERROR: 'cert.error',
281
- RELOAD_GATEWAY: 'gateway.reload',
282
- NOTIFICATION_CREATE_QUEUED: 'notification.create.queued',
283
- UPDATE_DOMAIN_ALIAS: 'router.domain.alias.updated',
284
-
285
- WEBHOOK_ATTEMPT: 'webhook.attempt',
286
- };
287
-
288
- const WHO_CAN_ACCESS = Object.freeze({
289
- OWNER: 'owner',
290
- ADMIN: 'admin',
291
- INVITED: 'invited',
292
- ALL: 'all',
293
- });
294
-
295
- const TEST_STORE_URL = 'https://test.store.blocklet.dev';
296
- const BLOCKLET_STORE_URL = 'https://store.blocklet.dev';
297
- const BLOCKLET_STORE_URL_DEV = 'https://dev.store.blocklet.dev';
298
- const MAIN_CHAIN_ENDPOINT = 'https://main.abtnetwork.io/api/';
299
-
300
- const USER_TYPE = Object.freeze({
301
- DERIVED: 'derived',
302
- WALLET: 'wallet',
303
- });
304
-
305
- const BACKUPS = {
306
- STATUS: {
307
- PROGRESS: null,
308
- SUCCEEDED: 0,
309
- FAILED: 1,
310
- },
311
- // 备份的超时时间是 6 小时
312
- TIMEOUT_HOURS: 6,
313
- // 备份策略
314
- STRATEGY: {
315
- // 自动备份
316
- AUTO: 0,
317
- // 手动备份
318
- MANUAL: 1,
319
- },
320
- JOB: {
321
- // 自动备份的时间间隔,单位为 s,目前是间隔2个小时
322
- INTERVAL: 2 * 60 * 60,
323
- },
324
- };
325
-
326
- const CHECK_UPDATE = {
327
- STATUS: {
328
- PROGRESS: null,
329
- SUCCEEDED: 0,
330
- FAILED: 1,
331
- },
332
- // 备份的超时时间是 6 小时
333
- TIMEOUT_HOURS: 6,
334
- // 备份策略
335
- STRATEGY: {
336
- // 自动备份
337
- AUTO: 0,
338
- // 手动备份
339
- MANUAL: 1,
340
- },
341
- JOB: {
342
- // 自动备份的时间间隔,单位为 s,目前是间隔2个小时
343
- INTERVAL: 2 * 60 * 60,
344
- // 1 天
345
- DAY_INTERVAL: 24 * 60 * 60,
346
- },
347
- };
348
-
349
- // 10s 上报统计一次
350
- const MONITOR_RECORD_INTERVAL_SEC = 20;
351
-
352
- // 保存当天数据, 每天上报 8640 次
353
- const MONITOR_HISTORY_LENGTH = 86400 / MONITOR_RECORD_INTERVAL_SEC;
354
-
355
- const FEDERATED = {
356
- SYNC_LIMIT: 30,
357
- };
358
-
359
- const ROUTING_RESPONSE_TYPES = [
360
- {
361
- text: 'Plain Text',
362
- value: 'text/plain',
363
- },
364
- {
365
- text: 'JSON',
366
- value: 'application/json',
367
- },
368
- {
369
- text: 'XML',
370
- value: 'application/xml',
371
- },
372
- {
373
- text: 'HTML Document',
374
- value: 'text/html',
375
- },
376
- {
377
- text: 'YAML',
378
- value: 'application/x-yaml',
379
- },
380
- {
381
- text: 'TOML',
382
- value: 'application/toml',
383
- },
384
- {
385
- text: 'CSS',
386
- value: 'text/css',
387
- },
388
- {
389
- text: 'JavaScript',
390
- value: 'application/javascript',
391
- },
392
- {
393
- text: 'CSV',
394
- value: 'text/csv',
395
- },
396
- {
397
- text: 'Markdown',
398
- value: 'text/markdown',
399
- },
400
- {
401
- text: 'SVG',
402
- value: 'image/svg+xml',
403
- },
404
- ];
405
-
406
- const SERVERLESS_BLOCKLET_DATA_RETENTION_DAYS = 30;
407
-
408
- const LAUNCH_SESSION_STATUS = Object.freeze({
409
- created: 0,
410
- selected: 10,
411
- connected: 20,
412
- timeout: 25,
413
- paid: 30,
414
- nftMinted: 35,
415
- allocated: 40,
416
- consuming: 46,
417
- installed: 50,
418
- overdue: 60,
419
- canceled: 65,
420
- terminated: 70,
421
- transferred: 90,
422
- });
423
-
424
- // security rule relates
425
- const SECURITY_RULE_DEFAULT_ID = 'default';
426
- const ACCESS_POLICY_PUBLIC = 'public';
427
- const ACCESS_POLICY_INVITED_ONLY = 'invited-only';
428
- const ACCESS_POLICY_OWNER_ONLY = 'owner-only';
429
- const ACCESS_POLICY_ADMIN_ONLY = 'admin-only';
430
- const RESPONSE_HEADER_POLICY_SIMPLE_CORS = 'simple-cors';
431
- const RESPONSE_HEADER_POLICY_SECURITY_HEADER = 'security-header';
432
- const RESPONSE_HEADER_POLICY_SIMPLE_CORS_AND_SECURITY_HEADER = 'simple-cors-and-security-header';
433
-
434
- const EVENT_BUS_EVENT = 'event-bus';
435
-
436
- const NAVIGATION_I18N_FIELDS = Object.freeze(['title', 'description', 'link']);
437
-
438
- // NOTICE: keep sync with @blocklet/constant
439
- const USER_SESSION_STATUS = {
440
- ONLINE: 'online',
441
- OFFLINE: 'offline',
442
- EXPIRED: 'expired',
443
- };
444
-
445
- module.exports = Object.freeze({
446
- // Blocklet Server
447
- NODE_MODES: Object.freeze({
448
- PRODUCTION: 'production',
449
- DEBUG: 'debug',
450
- MAINTENANCE: 'maintenance',
451
- SERVERLESS: 'serverless',
452
- }),
453
-
454
- DEFAULT_DESCRIPTION: 'Web Interface to manage your Blocklet Server',
455
-
456
- NODE_MAINTAIN_PROGRESS: Object.freeze({
457
- SETUP: 'setup', // backup
458
- INSTALLING: 'installing',
459
- VERIFYING: 'verifying',
460
- RESTARTING: 'restarting',
461
- CLEANUP: 'cleanup',
462
- COMPLETE: 'complete',
463
- ROLLBACK: 'rollback',
464
- }),
465
-
466
- VC_TYPE_BLOCKLET_PURCHASE: 'BlockletPurchaseCredential',
467
- VC_TYPE_NODE_PASSPORT: 'ABTNodePassport',
468
- VC_TYPE_GENERAL_PASSPORT: 'NFTPassport',
469
-
470
- NFT_TYPE_SERVER_OWNERSHIP: 'BlockletServerOwnershipNFT',
471
- NFT_TYPE_SERVERLESS: 'BlockletServerServerlessNFT',
472
-
473
- NODE_PACKAGE_NAME: '@abtnode/cli', // deprecated in 1.6.0
474
- NODE_COMMAND_NAME: 'abtnode', // deprecated in 1.6.0
475
- NODE_DATA_DIR_NAME: '_abtnode',
476
- USER_AVATAR_DIR: '/.assets/avatar',
477
- USER_AVATAR_URL_PREFIX: 'bn://avatar',
478
- USER_AVATAR_PATH_PREFIX: '/user/avatar',
479
- USER_MAX_INVITE_DEPTH: 8,
480
-
481
- PROCESS_NAME_DAEMON: 'abt-node-daemon',
482
- PROCESS_NAME_PROXY: 'abt-node-db-hub',
483
- PROCESS_NAME_UPDATER: 'abt-node-updater',
484
- PROCESS_NAME_SERVICE: 'abt-node-service',
485
- PROCESS_NAME_ROUTER: 'abt-node-router',
486
- PROCESS_NAME_LOG_ROTATE: 'abt-node-log-rotate',
487
- PROCESS_NAME_EVENT_HUB: 'abt-node-event-hub',
488
- PROCESS_NAME_PM2_EVENT_HUB: 'abt-node-pm2-event-hub',
489
- PROCESS_NAME_ORPHAN_CLEANUP: 'abt-node-orphan-cleanup',
490
-
491
- // Process script paths for orphan detection
492
- DAEMON_SCRIPT_PATH: 'cli/lib/process/daemon.js',
493
- SERVICE_SCRIPT_PATH: 'cli/lib/process/service.js',
494
-
495
- // Orphan process cleanup settings
496
- ORPHAN_CHECK_DELAY: 60 * 1000, // 60 seconds - delay before checking for orphan processes
497
- ORPHAN_MIN_UPTIME: 60, // 60 seconds - minimum process uptime to be considered orphan
498
-
499
- BLOCKLET_LAUNCHER_URL: 'https://launcher.arcblock.io/',
500
- WEB_WALLET_URL: 'https://web.abtwallet.io',
501
- TEST_STORE_URL,
502
- BLOCKLET_STORE_URL,
503
- BLOCKLET_STORE_URL_DEV,
504
- BLOCKLET_STORE_DID: 'z8ia29UsENBg6tLZUKi2HABj38Cw1LmHZocbQ',
505
- BLOCKLET_STORE_API_PREFIX: '/api',
506
- BLOCKLET_STORE_API_BLOCKLET_PREFIX: '/api/blocklets',
507
- BLOCKLET_STORE_META_PATH: '/api/store.json',
508
- BLOCKLET_STORE: {
509
- id: 'zNKqX7D8ZAYa77HgzpoFfnV3BFbcmSRrE9aT',
510
- name: 'Official Store',
511
- description: 'ArcBlock official store for production ready blocklets',
512
- url: BLOCKLET_STORE_URL,
513
- logoUrl: '/logo.png',
514
- maintainer: 'arcblock',
515
- },
516
- BLOCKLET_STORE_DEV: {
517
- id: 'zNKmfUatDhzfMVACfr3u97eqndj8f1yXXw3m',
518
- name: 'Dev Store',
519
- description: 'ArcBlock official store for demo and example blocklets',
520
- url: BLOCKLET_STORE_URL_DEV,
521
- maintainer: 'arcblock',
522
- logoUrl: '/logo.png',
523
- },
524
- BLOCKLET_TEST_STORE: {
525
- id: 'zNKirQVRx4xbyTPMkvH3kguRfofTJana8WBK',
526
- name: 'Test Store',
527
- description: 'ArcBlock official store for non-production ready blocklets',
528
- url: TEST_STORE_URL,
529
- maintainer: 'arcblock',
530
- logoUrl: '/logo.png',
531
- },
532
-
533
- // application is a container, components have no hierarchy and are tiled in application
534
- APP_STRUCT_VERSION: '2',
535
-
536
- DEFAULT_DID_REGISTRY: 'https://registry.abtnet.io',
537
- DEFAULT_SLP_DOMAIN: 'slp.abtnet.io',
538
- DEFAULT_DID_DOMAIN: 'did.abtnet.io',
539
- DEFAULT_IP_DOMAIN: '*.ip.abtnet.io',
540
- DEFAULT_IP_DOMAIN_SUFFIX: 'ip.abtnet.io',
541
- DEFAULT_WILDCARD_CERT_HOST: 'https://releases.arcblock.io/',
542
- DEFAULT_NFT_DOMAIN_URL: 'https://domain.didlabs.org/',
543
-
544
- DEFAULT_CERTIFICATE_EMAIL: 'certs@arcblock.io',
545
-
546
- CONFIG_FILENAME: 'config.yml',
547
- CONFIG_FILENAME_OLD: 'abtnode.yml',
548
- CONFIG_FOLDER_NAME: '.blocklet-server',
549
- CONFIG_FOLDER_NAME_OLD: '.abtnode',
550
- EXPORTED_FOLDER_NAME: 'exported_blocklet_server',
551
-
552
- DEFAULT_WELLKNOWN_PORT: 8088,
553
-
554
- StatusCode: Object.freeze({
555
- ok: 0,
556
-
557
- blocklet_not_found: 1,
558
- blocklet_not_purchased: 2,
559
-
560
- forbidden: 403,
561
- internal: 500,
562
- timeout: 504,
563
- }),
564
-
565
- // Service Gateway
566
- // eslint-disable-next-line prefer-regex-literals
567
- IP: new RegExp('-(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\-(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}'),
568
- DOMAIN_FOR_IP_SITE: '',
569
- DOMAIN_FOR_IP_SITE_REGEXP: `~^\\d+.\\d+.\\d+.\\d+$`, // eslint-disable-line
570
- DOMAIN_FOR_DEFAULT_SITE: '*',
571
- DOMAIN_FOR_INTERNAL_SITE: '127.0.0.1',
572
- NAME_FOR_WELLKNOWN_SITE: 'wellknown',
573
- WELLKNOWN_PATH_PREFIX: '/.well-known',
574
- WELLKNOWN_ACME_CHALLENGE_PREFIX: '/.well-known/acme-challenge',
575
- WELLKNOWN_DID_RESOLVER_PREFIX: '/.well-known/did.json', // server wellknown endpoint
576
- WELLKNOWN_OAUTH_SERVER: '/.well-known/oauth-authorization-server',
577
- WELLKNOWN_OPENID_SERVER: '/.well-known/openid-configuration',
578
- WELLKNOWN_BLACKLIST_PREFIX: '/.well-known/blacklist',
579
- WELLKNOWN_PING_PREFIX: '/.well-known/ping',
580
- WELLKNOWN_ANALYTICS_PREFIX: '/.well-known/analytics',
581
- WELLKNOWN_SERVICE_PATH_PREFIX: '/.well-known/service',
582
- WELLKNOWN_BLOCKLET_ADMIN_PATH: '/.well-known/service/admin',
583
- WELLKNOWN_BLOCKLET_USER_PATH: '/.well-known/service/user',
584
- WELLKNOWN_BLOCKLET_HEALTH_PATH: '/.well-known/service/health',
585
- WELLKNOWN_BLOCKLET_LOGO_PATH: '/.well-known/service/blocklet/logo',
586
- SLOT_FOR_IP_DNS_SITE: '888-888-888-888',
587
-
588
- DEFAULT_ADMIN_PATH: '/admin',
589
- WELLKNOWN_SERVER_ADMIN_PATH: '/.well-known/server/admin',
590
- DEFAULT_HTTP_PORT: 80,
591
- DEFAULT_HTTPS_PORT: 443,
592
- MAX_UPLOAD_FILE_SIZE: 100, // unit: MB
593
- DEFAULT_DAEMON_PORT: 8089,
594
- MAX_NGINX_WORKER_CONNECTIONS: 10240,
595
-
596
- BLOCKLET_PROXY_PATH_PREFIX: '/.blocklet/proxy',
597
- BLOCKLET_SITE_GROUP_SUFFIX: '.blocklet-domain-group',
598
-
599
- // Time and dates
600
- DAY_IN_MS,
601
- DAEMON_MAX_MEM_LIMIT_IN_MB: 800,
602
- BLOCKLET_MAX_MEM_LIMIT_IN_MB: 800,
603
- CERTIFICATE_EXPIRES_OFFSET: 10 * DAY_IN_MS,
604
- ROUTING_RESPONSE_TYPES,
605
- ROUTING_RULE_TYPES: Object.freeze({
606
- NONE: 'none',
607
- DAEMON: 'daemon',
608
- SERVICE: 'service',
609
- BLOCKLET: 'blocklet',
610
- REDIRECT: 'redirect',
611
- GENERAL_REWRITE: 'rewrite',
612
- GENERAL_PROXY: 'general_proxy',
613
- DIRECT_RESPONSE: 'direct_response',
614
- COMPONENT: 'component',
615
- }),
616
-
617
- // Team
618
- ROLES,
619
- SERVER_ROLES,
620
- BLOCKLET_ROLES,
621
- isBlockletRole,
622
- isSystemRole,
623
- isBlockletMultipleTenantRole,
624
- AUTH_CERT_TYPE,
625
- RBAC_CONFIG,
626
- genPermissionName: (resource, action = 'access') => `${action}_${resource.replace('_', '-')}`, // resource cannot include '_'
627
-
628
- PASSPORT_STATUS: {
629
- VALID: 'valid',
630
- REVOKED: 'revoked',
631
- EXPIRED: 'expired',
632
- },
633
-
634
- // Service
635
- NODE_SERVICES,
636
-
637
- DISK_ALERT_THRESHOLD_PERCENT: 80,
638
-
639
- // EVENTS
640
- EVENTS,
641
-
642
- WHO_CAN_ACCESS,
643
- WHO_CAN_ACCESS_PREFIX_ROLES: 'roles:',
644
-
645
- GATEWAY_RATE_LIMIT: { min: 5, max: 500 },
646
- GATEWAY_RATE_LIMIT_BURST_FACTOR: { min: 1, max: 10 },
647
- GATEWAY_RATE_LIMIT_GLOBAL: { min: 100, max: 5000 },
648
- GATEWAY_RATE_LIMIT_METHODS: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS', 'HEAD'],
649
-
650
- // Store
651
- STORE_DETAIL_PAGE_PATH_PREFIX: '/blocklets',
652
-
653
- MAX_USER_PAGE_SIZE: 100,
654
- // 默认最大 page size
655
- MAX_PAGE_SIZE: 100,
656
-
657
- SERVER_STATUS: {
658
- RUNNING: 1,
659
- STOPPED: 2,
660
- START_FROM_CRASH: 3,
661
- },
662
-
663
- LOG_RETAIN_IN_DAYS: 60,
664
-
665
- BLOCKLET_INSTALL_TYPE: {
666
- STORE: 'store',
667
- URL: 'url',
668
- DEV: 'dev',
669
- CREATE: 'create',
670
- RESTORE: 'restore',
671
- },
672
-
673
- // @link https://docs.nginx.com/nginx/admin-guide/content-cache/content-caching/
674
- // @link https://www.sheshbabu.com/posts/nginx-caching-proxy/
675
- // @link https://www.nginx.com/blog/nginx-caching-guide/
676
- ROUTER_CACHE_GROUPS: {
677
- blockletProxy: {
678
- minSize: '10m',
679
- maxSize: '10g',
680
- period: '30d',
681
- },
682
- // TODO: disabled because we can not bust nginx cache effectively for now
683
- // blockletJs: {
684
- // minSize: '1m',
685
- // maxSize: '64m',
686
- // period: '5m',
687
- // },
688
- },
689
-
690
- MAIN_CHAIN_ENDPOINT,
691
- USER_TYPE,
692
- SERVER_CACHE_TTL: 300 * 1000, // 5 minutes
693
- RBAC_CACHE_TTL: 300 * 1000, // 5 minutes
694
- BLOCKLET_CACHE_TTL: 300 * 1000, // 5 minutes
695
- SESSION_CACHE_TTL: 3600, // 1h: unit seconds
696
- SESSION_TTL: 7 * 86400, // 7d: unit seconds
697
-
698
- BACKUPS,
699
-
700
- CHECK_UPDATE,
701
-
702
- MONITOR_HISTORY_LENGTH,
703
- MONITOR_RECORD_INTERVAL_SEC,
704
-
705
- INSTALL_ACTIONS: {
706
- INSTALL: 'install',
707
- INSTALL_COMPONENT: 'installComponent',
708
- UPGRADE_COMPONENT: 'upgradeComponent',
709
- },
710
-
711
- COPYRIGHT_OWNER: 'ArcBlock',
712
- FEDERATED,
713
- SESSION_TOKEN_STORAGE_KEY: 'login_token',
714
- REFRESH_TOKEN_STORAGE_KEY: 'refresh_token',
715
- SERVERLESS_BLOCKLET_DATA_RETENTION_DAYS,
716
- LAUNCH_SESSION_STATUS,
717
- UNOWNED_DID: 'z'.repeat(35),
718
-
719
- STUDIO_CONNECTED_STORE: 'studio_connected_store',
720
- STUDIO_CONNECTED_AND_DEVELOPED: 'studio_connected_and_developed',
721
-
722
- VERIFY_CODE_LENGTH: 6,
723
- VERIFY_CODE_TTL: 30 * 60 * 1000,
724
- VERIFY_SEND_TTL: 1 * 60 * 1000,
725
-
726
- SECURITY_RULE_DEFAULT_ID,
727
- ACCESS_POLICY_PUBLIC,
728
- ACCESS_POLICY_INVITED_ONLY,
729
- ACCESS_POLICY_OWNER_ONLY,
730
- ACCESS_POLICY_ADMIN_ONLY,
731
- RESPONSE_HEADER_POLICY_SIMPLE_CORS,
732
- RESPONSE_HEADER_POLICY_SECURITY_HEADER,
733
- RESPONSE_HEADER_POLICY_SIMPLE_CORS_AND_SECURITY_HEADER,
734
-
735
- // 无论如何都需要二次验证的接口
736
- MFA_PROTECTED_METHODS: [
737
- 'deleteBlocklet',
738
- 'deleteComponent',
739
- 'rotateSessionKey',
740
- 'upgradeNodeVersion',
741
- 'removeUser',
742
- 'updateUserApproval',
743
- 'deleteRoutingRule',
744
- 'deleteDomainAlias',
745
- 'deleteCertificate',
746
- 'deleteAccessKey',
747
- 'deleteWebHook',
748
- 'deleteBlockletSecurityRule',
749
- 'deleteBlockletResponseHeaderPolicy',
750
- 'deleteBlockletAccessPolicy',
751
- 'configVault',
752
- 'removeOrgMember',
753
- 'deleteOrg',
754
- ],
755
-
756
- // 如果是 multiple tenant 的情况下, 这些白名单不会验证 RBAC
757
- STUDIO_ALLOWED_METHODS: {
758
- getBlocklet: true,
759
- createProject: true,
760
- getProjects: true,
761
- getProject: true,
762
- updateProject: true,
763
- deleteProject: true,
764
- getReleases: true,
765
- getRelease: true,
766
- createRelease: true,
767
- deleteRelease: true,
768
- addBlockletStore: true,
769
- deleteBlockletStore: true,
770
- publishToStore: true,
771
- connectToStore: true,
772
- connectByStudio: true,
773
- disconnectFromStore: true,
774
- getSelectedResources: true,
775
- updateSelectedResources: true,
776
- // FIXME: 梁柱, 下面两个 get 接口, 可以不开放但是前端需要根据情况取消获取这两个接口的调用
777
- getBlockletRuntimeHistory: true,
778
- checkDomains: true,
779
- isDidDomain: true,
780
- },
781
- SDK_ALLOWED_METHODS: {
782
- configBlocklet: true,
783
- configNavigations: true,
784
- addRoutingRule: true,
785
- updateRoutingRule: true,
786
- deleteRoutingRule: true,
787
- },
788
- // 这些接口可以跳过 ACCESS VERIFY
789
- SKIP_ACCESS_VERIFY_METHODS: {
790
- makeAllNotificationsAsRead: true,
791
- readNotifications: true,
792
- unreadNotifications: true,
793
- launchBlockletByLauncher: true,
794
- launchBlockletWithoutWallet: true,
795
- backupBlocklet: true,
796
- destroySelf: true,
797
- connectToAigne: true,
798
- disconnectToAigne: true,
799
- verifyAigneConnection: true,
800
- connectToEndpoint: true,
801
- disconnectFromEndpoint: true,
802
- },
803
- NOTIFICATION_SEND_STATUS: {
804
- PENDING: 0, // 待发送
805
- SENT: 1, // 已发送
806
- FAILED: 2, // 发送失败
807
- },
808
- NOTIFICATION_SEND_FAILED_REASON: {
809
- USER_DISABLED: 'user_disabled', // 用户未开启渠道
810
- CHANNEL_UNAVAILABLE: 'channel_unavailable', // 未开启服务
811
- CHANNEL_DISABLED: 'channel_disabled', // 开发者未选择此渠道
812
- NOT_ONLINE: 'not_online', // 用户未上线 - 只针对于wallet
813
- },
814
- NOTIFICATION_SEND_CHANNEL: {
815
- WALLET: 'app',
816
- EMAIL: 'email',
817
- PUSH: 'push',
818
- WEBHOOK: 'webhook',
819
- },
820
-
821
- BLACKLIST_SCOPE: {
822
- ROUTER: 'router',
823
- },
824
-
825
- EVENT_BUS_EVENT,
826
-
827
- NAVIGATION_I18N_FIELDS,
828
-
829
- PASSPORT_SOURCE: {
830
- INVITE: 'invite',
831
- ISSUE: 'issue',
832
- RECOVER: 'recover',
833
- TRUSTED: 'trusted',
834
- },
835
-
836
- PASSPORT_LOG_ACTION: {
837
- ISSUE: 'issue',
838
- REVOKE: 'revoke',
839
- APPROVE: 'approve',
840
- RECOVER: 'recover',
841
- LOGIN: 'login',
842
- EXPIRED: 'expired',
843
- USED: 'used',
844
- },
845
-
846
- PASSPORT_ISSUE_ACTION: {
847
- ISSUE_ON_INVITE: 'issueOnInvite',
848
- ISSUE_ON_LAUNCH: 'issueOnLaunch',
849
- ISSUE_ON_KYC: 'issueOnKyc',
850
- ISSUE_ON_RECOVER: 'issueOnRecover',
851
- ISSUE_ON_ROTATE_KEY_PAIR: 'issueOnRotateKeyPair',
852
- ISSUE_ON_TRANSFER: 'issueOnTransferPassportForBindWallet',
853
- ISSUE_ON_BLOCKLET_START: 'issueOnBlockletStart',
854
- ISSUE_ON_RECEIVE_TRANSFER_APP_OWNER: 'receiveTransferAppOwner',
855
- ISSUE_ON_AUTH0: 'issueOnAuth0',
856
- ISSUE_ON_SETUP_APP_OWNER: 'issueOnLaunchSetupAppOwner',
857
- ISSUE_ON_EXCHANGE_PASSPORT: 'issueOnExchangePassport',
858
- ISSUE_ON_TRUST_PASSPORT: 'issueOnTrustPassport',
859
- },
860
-
861
- OAUTH_ENDPOINTS: {
862
- AUTHORIZATION: '/authorize',
863
- TOKEN: '/token',
864
- REGISTRATION: '/register',
865
- REVOCATION: '/revoke',
866
- USERINFO: '/userinfo',
867
- JWKS: '/jwks',
868
- LOGOUT: '/logout',
869
- },
870
- OAUTH_CODE_TTL: 10 * 60, // 10 minutes
871
- OAUTH_ACCESS_TOKEN_TTL: 24 * 60 * 60, // 1 day
872
- OAUTH_REFRESH_TOKEN_TTL: 30 * 24 * 60 * 60, // 30 days
873
- OAUTH_CLIENT_SECRET_TTL: 30 * 24 * 60 * 60, // 90 days
874
- OAUTH_SCOPES: {
875
- // User scopes
876
- 'profile:read': 'Read your profile (name, email, avatar)',
877
-
878
- // Blocklet related scopes
879
- 'blocklet:read': 'Read blocklet information and database',
880
- 'blocklet:write': 'Manage blocklet components and configuration',
881
- },
882
- AIGNE_CONFIG_ENCRYPT_SALT: 'AIGNE_CONFIG_ENCRYPT_SALT',
883
- ASSET_CDN_HOST: 'https://cdn.blocklet.io',
884
- CSP_OFFICIAL_SOURCES: [
885
- 'https://*.arcblock.io',
886
- 'https://*.didnames.io',
887
- 'https://*.didwallet.io',
888
- 'https://*.abtnetwork.io',
889
- 'https://*.didspaces.com',
890
- 'https://*.blocklet.dev',
891
- 'https://domain.didlabs.org',
892
- 'https://cdn.blocklet.io',
893
- ],
894
- CSP_SYSTEM_SOURCES: [
895
- 'https://*.did.abtnet.io',
896
- 'https://*.ip.abtnet.io',
897
- 'https://*.slp.abtnet.io',
898
- 'https://*.did.life',
899
- 'https://*.did.rocks',
900
- ],
901
- CSP_THIRD_PARTY_SOURCES: [
902
- 'https://cdnjs.cloudflare.com',
903
- 'https://js.stripe.com',
904
- 'https://ipapi.co',
905
- 'https://unpkg.com',
906
- ],
907
- CSP_ICONIFY_SOURCES: ['https://*.simplesvg.com', 'https://*.iconify.design', 'https://*.unisvg.com'],
908
-
909
- USER_PROFILE_SYNC_FIELDS: [
910
- 'action', // 表示对该 user 的操作
911
- 'did',
912
- 'pk',
913
- 'avatar',
914
- 'fullName',
915
- 'locale',
916
- 'email',
917
- 'connectedAccount',
918
- 'disconnectedAccount',
919
- 'sourceAppPid',
920
- 'inviter',
921
- 'generation',
922
- 'emailVerified',
923
- 'phoneVerified',
924
- 'metadata',
925
- 'address',
926
- 'extra',
927
- ],
928
-
929
- SITE_SYNC_FIELDS: [
930
- 'action',
931
- 'appId',
932
- 'appPid',
933
- 'aliasDid',
934
- 'appName',
935
- 'appDescription',
936
- 'appUrl',
937
- 'aliasDomain',
938
- 'appLogo',
939
- 'appLogoRect',
940
- 'appliedAt',
941
- 'did',
942
- 'pk',
943
- 'serverId',
944
- 'serverVersion',
945
- 'version',
946
- 'isMaster',
947
- 'status',
948
- ],
949
- USER_SESSION_STATUS,
950
- WEBHOOK_CONSECUTIVE_FAILURES_THRESHOLD: 50,
951
- });