@blocklet/payment-broker-client 1.20.17

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 (157) hide show
  1. package/examples/README.md +277 -0
  2. package/examples/browser/README.md +119 -0
  3. package/examples/browser/simple-example.js +223 -0
  4. package/examples/nodejs/README.md +180 -0
  5. package/examples/nodejs/deploy-example.mjs +200 -0
  6. package/examples/nodejs/package.json +30 -0
  7. package/lib/adapters/config/browser.d.ts +12 -0
  8. package/lib/adapters/config/browser.d.ts.map +1 -0
  9. package/lib/adapters/config/browser.js +48 -0
  10. package/lib/adapters/config/browser.js.map +1 -0
  11. package/lib/adapters/config/node.d.ts +13 -0
  12. package/lib/adapters/config/node.d.ts.map +1 -0
  13. package/lib/adapters/config/node.js +62 -0
  14. package/lib/adapters/config/node.js.map +1 -0
  15. package/lib/adapters/http/browser.d.ts +12 -0
  16. package/lib/adapters/http/browser.d.ts.map +1 -0
  17. package/lib/adapters/http/browser.js +50 -0
  18. package/lib/adapters/http/browser.js.map +1 -0
  19. package/lib/adapters/http/node.d.ts +12 -0
  20. package/lib/adapters/http/node.d.ts.map +1 -0
  21. package/lib/adapters/http/node.js +30 -0
  22. package/lib/adapters/http/node.js.map +1 -0
  23. package/lib/browser/adapters/config/browser.d.ts +12 -0
  24. package/lib/browser/adapters/config/browser.d.ts.map +1 -0
  25. package/lib/browser/adapters/config/node.d.ts +13 -0
  26. package/lib/browser/adapters/config/node.d.ts.map +1 -0
  27. package/lib/browser/adapters/http/browser.d.ts +12 -0
  28. package/lib/browser/adapters/http/browser.d.ts.map +1 -0
  29. package/lib/browser/adapters/http/node.d.ts +12 -0
  30. package/lib/browser/adapters/http/node.d.ts.map +1 -0
  31. package/lib/browser/browser/factory.d.ts +19 -0
  32. package/lib/browser/browser/factory.d.ts.map +1 -0
  33. package/lib/browser/browser/index.d.ts +9 -0
  34. package/lib/browser/browser/index.d.ts.map +1 -0
  35. package/lib/browser/core/client.d.ts +29 -0
  36. package/lib/browser/core/client.d.ts.map +1 -0
  37. package/lib/browser/core/deployment.d.ts +20 -0
  38. package/lib/browser/core/deployment.d.ts.map +1 -0
  39. package/lib/browser/core/errors.d.ts +15 -0
  40. package/lib/browser/core/errors.d.ts.map +1 -0
  41. package/lib/browser/core/index.d.ts +10 -0
  42. package/lib/browser/core/index.d.ts.map +1 -0
  43. package/lib/browser/core/interfaces.d.ts +24 -0
  44. package/lib/browser/core/interfaces.d.ts.map +1 -0
  45. package/lib/browser/core/logger.d.ts +8 -0
  46. package/lib/browser/core/logger.d.ts.map +1 -0
  47. package/lib/browser/core/polling.d.ts +23 -0
  48. package/lib/browser/core/polling.d.ts.map +1 -0
  49. package/lib/browser/core/session.d.ts +31 -0
  50. package/lib/browser/core/session.d.ts.map +1 -0
  51. package/lib/browser/core/types.d.ts +175 -0
  52. package/lib/browser/core/types.d.ts.map +1 -0
  53. package/lib/browser/core/utils.d.ts +27 -0
  54. package/lib/browser/core/utils.d.ts.map +1 -0
  55. package/lib/browser/factory.d.ts +19 -0
  56. package/lib/browser/factory.d.ts.map +1 -0
  57. package/lib/browser/factory.js +30 -0
  58. package/lib/browser/factory.js.map +1 -0
  59. package/lib/browser/index.d.ts +8 -0
  60. package/lib/browser/index.d.ts.map +1 -0
  61. package/lib/browser/index.js +973 -0
  62. package/lib/browser/index.js.map +1 -0
  63. package/lib/browser/node/factory.d.ts +9 -0
  64. package/lib/browser/node/factory.d.ts.map +1 -0
  65. package/lib/browser/node/index.d.ts +8 -0
  66. package/lib/browser/node/index.d.ts.map +1 -0
  67. package/lib/core/client.d.ts +29 -0
  68. package/lib/core/client.d.ts.map +1 -0
  69. package/lib/core/client.js +150 -0
  70. package/lib/core/client.js.map +1 -0
  71. package/lib/core/deployment.d.ts +20 -0
  72. package/lib/core/deployment.d.ts.map +1 -0
  73. package/lib/core/deployment.js +184 -0
  74. package/lib/core/deployment.js.map +1 -0
  75. package/lib/core/errors.d.ts +15 -0
  76. package/lib/core/errors.d.ts.map +1 -0
  77. package/lib/core/errors.js +21 -0
  78. package/lib/core/errors.js.map +1 -0
  79. package/lib/core/index.d.ts +10 -0
  80. package/lib/core/index.d.ts.map +1 -0
  81. package/lib/core/index.js +32 -0
  82. package/lib/core/index.js.map +1 -0
  83. package/lib/core/interfaces.d.ts +24 -0
  84. package/lib/core/interfaces.d.ts.map +1 -0
  85. package/lib/core/interfaces.js +4 -0
  86. package/lib/core/interfaces.js.map +1 -0
  87. package/lib/core/logger.d.ts +8 -0
  88. package/lib/core/logger.d.ts.map +1 -0
  89. package/lib/core/logger.js +39 -0
  90. package/lib/core/logger.js.map +1 -0
  91. package/lib/core/polling.d.ts +23 -0
  92. package/lib/core/polling.d.ts.map +1 -0
  93. package/lib/core/polling.js +97 -0
  94. package/lib/core/polling.js.map +1 -0
  95. package/lib/core/session.d.ts +31 -0
  96. package/lib/core/session.d.ts.map +1 -0
  97. package/lib/core/session.js +202 -0
  98. package/lib/core/session.js.map +1 -0
  99. package/lib/core/types.d.ts +175 -0
  100. package/lib/core/types.d.ts.map +1 -0
  101. package/lib/core/types.js +48 -0
  102. package/lib/core/types.js.map +1 -0
  103. package/lib/core/utils.d.ts +27 -0
  104. package/lib/core/utils.d.ts.map +1 -0
  105. package/lib/core/utils.js +181 -0
  106. package/lib/core/utils.js.map +1 -0
  107. package/lib/index.d.ts +484 -0
  108. package/lib/index.d.ts.map +1 -0
  109. package/lib/index.esm.js +969 -0
  110. package/lib/index.esm.js.map +1 -0
  111. package/lib/index.js +984 -0
  112. package/lib/index.js.map +1 -0
  113. package/lib/node/adapters/config/browser.d.ts +12 -0
  114. package/lib/node/adapters/config/browser.d.ts.map +1 -0
  115. package/lib/node/adapters/config/node.d.ts +13 -0
  116. package/lib/node/adapters/config/node.d.ts.map +1 -0
  117. package/lib/node/adapters/http/browser.d.ts +12 -0
  118. package/lib/node/adapters/http/browser.d.ts.map +1 -0
  119. package/lib/node/adapters/http/node.d.ts +12 -0
  120. package/lib/node/adapters/http/node.d.ts.map +1 -0
  121. package/lib/node/browser/factory.d.ts +19 -0
  122. package/lib/node/browser/factory.d.ts.map +1 -0
  123. package/lib/node/browser/index.d.ts +9 -0
  124. package/lib/node/browser/index.d.ts.map +1 -0
  125. package/lib/node/core/client.d.ts +29 -0
  126. package/lib/node/core/client.d.ts.map +1 -0
  127. package/lib/node/core/deployment.d.ts +20 -0
  128. package/lib/node/core/deployment.d.ts.map +1 -0
  129. package/lib/node/core/errors.d.ts +15 -0
  130. package/lib/node/core/errors.d.ts.map +1 -0
  131. package/lib/node/core/index.d.ts +10 -0
  132. package/lib/node/core/index.d.ts.map +1 -0
  133. package/lib/node/core/interfaces.d.ts +24 -0
  134. package/lib/node/core/interfaces.d.ts.map +1 -0
  135. package/lib/node/core/logger.d.ts +8 -0
  136. package/lib/node/core/logger.d.ts.map +1 -0
  137. package/lib/node/core/polling.d.ts +23 -0
  138. package/lib/node/core/polling.d.ts.map +1 -0
  139. package/lib/node/core/session.d.ts +31 -0
  140. package/lib/node/core/session.d.ts.map +1 -0
  141. package/lib/node/core/types.d.ts +175 -0
  142. package/lib/node/core/types.d.ts.map +1 -0
  143. package/lib/node/core/utils.d.ts +27 -0
  144. package/lib/node/core/utils.d.ts.map +1 -0
  145. package/lib/node/factory.d.ts +9 -0
  146. package/lib/node/factory.d.ts.map +1 -0
  147. package/lib/node/factory.js +34 -0
  148. package/lib/node/factory.js.map +1 -0
  149. package/lib/node/index.d.ts +8 -0
  150. package/lib/node/index.d.ts.map +1 -0
  151. package/lib/node/index.js +984 -0
  152. package/lib/node/index.js.map +1 -0
  153. package/lib/node/node/factory.d.ts +9 -0
  154. package/lib/node/node/factory.d.ts.map +1 -0
  155. package/lib/node/node/index.d.ts +8 -0
  156. package/lib/node/node/index.d.ts.map +1 -0
  157. package/package.json +98 -0
@@ -0,0 +1,180 @@
1
+ # Payment Kit Broker Client - Node.js Example
2
+
3
+ 这是一个使用 Payment Kit Broker Client 在 Node.js 环境中部署网站的完整示例。
4
+
5
+ ## 功能特性
6
+
7
+ - ✅ 完整的部署流程演示
8
+ - 🔐 Auth Token 认证
9
+ - 🔄 支持恢复中断的部署
10
+ - 🎨 彩色控制台输出
11
+ - 🌐 自动打开支付页面
12
+ - ⚙️ 自定义 Payment Link Key
13
+ - 📊 详细的步骤回调和错误处理
14
+
15
+ ## 安装依赖
16
+
17
+ ```bash
18
+ npm install
19
+ # 或
20
+ pnpm install
21
+ ```
22
+
23
+ ## 环境变量配置
24
+
25
+ 创建 `.env` 文件或设置环境变量:
26
+
27
+ ```bash
28
+ export BASE_URL="https://your-blocklet-url.com"
29
+ export AUTH_TOKEN="your-auth-token-here"
30
+ ```
31
+
32
+ ## 使用方法
33
+
34
+ ### 1. 基本部署
35
+
36
+ ```bash
37
+ npm start
38
+ # 或
39
+ npm run deploy
40
+ ```
41
+
42
+ ### 2. 恢复中断的部署
43
+
44
+ ```bash
45
+ export CACHED_CHECKOUT_ID="cs_your_session_id"
46
+ export CACHED_PAYMENT_URL="https://your-payment-url"
47
+ npm run deploy:resume
48
+ ```
49
+
50
+ ### 3. 使用自定义 Payment Link Key
51
+
52
+ ```bash
53
+ npm run deploy:custom
54
+ ```
55
+
56
+ ### 4. 编程方式使用
57
+
58
+ ```javascript
59
+ import { deployWebsite } from './deploy-example.mjs';
60
+
61
+ try {
62
+ const result = await deployWebsite(
63
+ 'cached-checkout-id', // 可选:缓存的 checkout ID
64
+ 'cached-payment-url', // 可选:缓存的支付 URL
65
+ 'CUSTOM_PAYMENT_KEY' // 可选:自定义 payment link key
66
+ );
67
+
68
+ console.log('部署成功:', result);
69
+ } catch (error) {
70
+ console.error('部署失败:', error);
71
+ }
72
+ ```
73
+
74
+ ## 配置选项
75
+
76
+ ### BrokerClient 配置
77
+
78
+ ```javascript
79
+ const client = new BrokerClient({
80
+ baseUrl: 'https://your-blocklet-url.com', // 必需:Blocklet 基础 URL
81
+ authToken: 'your-auth-token', // 必需:认证令牌
82
+ paymentLinkKey: 'PAYMENT_LINK_ID', // 可选:Payment Link 键名(默认:PAYMENT_LINK_ID)
83
+ timeout: 300000, // 可选:请求超时时间(毫秒)
84
+ polling: { // 可选:轮询配置
85
+ interval: 3000, // 轮询间隔(毫秒)
86
+ maxAttempts: 100, // 最大尝试次数
87
+ backoffStrategy: 'linear', // 退避策略:'linear' | 'exponential'
88
+ },
89
+ });
90
+ ```
91
+
92
+ ### 部署选项
93
+
94
+ ```javascript
95
+ await client.deploy({
96
+ cachedCheckoutId: 'session-id', // 可选:缓存的会话 ID
97
+ cachedPaymentUrl: 'payment-url', // 可选:缓存的支付 URL
98
+ page_info: { // 必需:页面信息
99
+ success_message: { // 必需:成功消息
100
+ en: 'Success message in English',
101
+ zh: '中文成功消息',
102
+ },
103
+ },
104
+ stepCallbacks: { /* ... */ }, // 可选:步骤回调
105
+ onError: (error, step) => { /* ... */ }, // 可选:错误处理
106
+ });
107
+ ```
108
+
109
+ ## 步骤回调
110
+
111
+ 示例包含以下步骤的详细回调:
112
+
113
+ - `PAYMENT_PENDING`: 等待支付
114
+ - `PAYMENT_COMPLETED`: 支付完成
115
+ - `INSTALLATION_STARTING`: 开始安装
116
+ - `INSTALLATION_COMPLETED`: 安装完成
117
+ - `SERVICE_STARTING`: 启动服务
118
+ - `SERVICE_READY`: 服务就绪
119
+ - `ACCESS_PREPARING`: 准备访问权限
120
+ - `ACCESS_READY`: 访问就绪
121
+
122
+ ## 错误处理
123
+
124
+ 示例包含完善的错误处理:
125
+
126
+ - 详细的错误消息
127
+ - 恢复建议
128
+ - 会话 ID 用于恢复部署
129
+ - 彩色控制台输出
130
+
131
+ ## 输出示例
132
+
133
+ ```
134
+ 🚀 Payment Kit Broker Client - Node.js Example
135
+ ================================================
136
+
137
+ 🔧 Base URL: https://example.com
138
+ 🔑 Auth Token: ak_1234567...
139
+ 🔗 Payment Link Key: PAYMENT_LINK_ID
140
+
141
+ ⏳ Step 1/4: Waiting for payment...
142
+ 📋 Session ID: cs_abc123...
143
+ 🔗 Payment link: https://example.com/pay/cs_abc123...
144
+
145
+ 🌐 Opening payment page in browser...
146
+
147
+ ✅ Payment successful!
148
+ 📋 Session ID: cs_abc123...
149
+ 📦 Vendors: 2
150
+
151
+ 📦 Step 2/4: Installing Website...
152
+ 📊 Installing 2 services
153
+
154
+ ✅ Installation complete (100%)
155
+
156
+ 🚀 Step 3/4: Starting Website Services...
157
+ 🔧 Starting 2 services
158
+
159
+ ✅ Services started successfully
160
+
161
+ 🌐 Step 4/4: Getting Website URLs...
162
+
163
+ 🎉 Deployment completed successfully!
164
+
165
+ 🏠 Website URL: https://your-website.com
166
+ 💳 Subscription URL: https://subscription.com
167
+ 📊 Dashboard URL: https://dashboard.com
168
+ ```
169
+
170
+ ## 故障排除
171
+
172
+ 1. **认证错误**: 确保 `AUTH_TOKEN` 环境变量正确设置
173
+ 2. **网络错误**: 检查 `BASE_URL` 是否可访问
174
+ 3. **Payment Link 错误**: 验证 `paymentLinkKey` 对应的环境变量是否存在
175
+ 4. **超时错误**: 增加 `timeout` 配置值
176
+
177
+ ## 相关链接
178
+
179
+ - [Payment Kit Broker Client 文档](../../README.md)
180
+ - [Browser 示例](../browser/README.md)
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env node
2
+
3
+ import chalk from 'chalk';
4
+ import open from 'open';
5
+ import { BrokerClient, STEPS } from '@blocklet/payment-broker-client';
6
+
7
+ // ==================== Configuration ====================
8
+ const BASE_URL = process.env.BASE_URL || 'https://your-blocklet-url.com';
9
+ const AUTH_TOKEN = process.env.AUTH_TOKEN || 'your-auth-token-here';
10
+
11
+ /**
12
+ * Deploy a new website using Payment Kit Broker Client
13
+ * @param {string} cachedCheckoutId - Cached checkout ID (optional)
14
+ * @param {string} cachedPaymentUrl - Cached payment URL (optional)
15
+ * @param {string} paymentLinkKey - Custom payment link key (optional, defaults to 'PAYMENT_LINK_ID')
16
+ * @returns {Promise<Object>} - The deployment result with URLs
17
+ */
18
+ export async function deployWebsite(cachedCheckoutId, cachedPaymentUrl, paymentLinkKey) {
19
+ console.log(chalk.blue('🚀 Payment Kit Broker Client - Node.js Example'));
20
+ console.log(chalk.gray('================================================\n'));
21
+
22
+ if (!AUTH_TOKEN || AUTH_TOKEN === 'your-auth-token-here') {
23
+ throw new Error(chalk.red('❌ Please set AUTH_TOKEN environment variable'));
24
+ }
25
+
26
+ if (!BASE_URL || BASE_URL === 'https://your-blocklet-url.com') {
27
+ throw new Error(chalk.red('❌ Please set BASE_URL environment variable'));
28
+ }
29
+
30
+ // Initialize the BrokerClient
31
+ const client = new BrokerClient({
32
+ baseUrl: BASE_URL,
33
+ authToken: AUTH_TOKEN,
34
+ paymentLinkKey: paymentLinkKey || undefined, // Optional: custom payment link key
35
+ timeout: 300000, // 5 minutes timeout
36
+ polling: {
37
+ interval: 3000,
38
+ maxAttempts: 100,
39
+ backoffStrategy: 'linear',
40
+ },
41
+ });
42
+
43
+ console.log(`🔧 Base URL: ${chalk.cyan(BASE_URL)}`);
44
+ console.log(`🔑 Auth Token: ${chalk.cyan(AUTH_TOKEN.slice(0, 10) + '...')}`);
45
+ if (paymentLinkKey) {
46
+ console.log(`🔗 Payment Link Key: ${chalk.cyan(paymentLinkKey)}`);
47
+ }
48
+ console.log('');
49
+
50
+ try {
51
+ const result = await client.deploy({
52
+ cachedCheckoutId: cachedCheckoutId || undefined,
53
+ cachedPaymentUrl: cachedPaymentUrl || undefined,
54
+ page_info: {
55
+ success_message: {
56
+ en: 'Congratulations! Your website has been successfully installed. You can return to the command-line tool to continue the next steps.',
57
+ zh: '恭喜您,你的网站已安装成功!可以返回命令行工具继续后续操作!',
58
+ },
59
+ },
60
+ hooks: {
61
+ [STEPS.PAYMENT_PENDING]: async ({ sessionId, paymentUrl, linkId, isResuming }) => {
62
+ console.log(chalk.yellow('⏳ Step 1/4: Waiting for payment...'));
63
+ console.log(`${chalk.gray('📋 Session ID:')} ${chalk.cyan(sessionId)}`);
64
+ console.log(`${chalk.gray('🔗 Payment link:')} ${chalk.cyan(paymentUrl)}`);
65
+ if (linkId) {
66
+ console.log(`${chalk.gray('🆔 Link ID:')} ${chalk.cyan(linkId)}`);
67
+ }
68
+ console.log('');
69
+
70
+ if (!isResuming) {
71
+ console.log(chalk.blue('🌐 Opening payment page in browser...'));
72
+ try {
73
+ await open(paymentUrl);
74
+ } catch (error) {
75
+ console.log(chalk.red('❌ Failed to open browser. Please open the payment link manually.'));
76
+ }
77
+ } else {
78
+ console.log(chalk.yellow('🔄 Resuming existing session. Payment link is available above if needed.'));
79
+ }
80
+ console.log('');
81
+ },
82
+
83
+ [STEPS.PAYMENT_COMPLETED]: ({ sessionId, vendors }) => {
84
+ console.log(chalk.green('✅ Payment successful!'));
85
+ console.log(`${chalk.gray('📋 Session ID:')} ${chalk.cyan(sessionId)}`);
86
+ console.log(`${chalk.gray('📦 Vendors:')} ${chalk.cyan(vendors.length)}`);
87
+ console.log('');
88
+ },
89
+
90
+ [STEPS.INSTALLATION_STARTING]: ({ vendors }) => {
91
+ console.log(chalk.yellow('📦 Step 2/4: Installing Website...'));
92
+ console.log(`${chalk.gray('📊 Installing')} ${chalk.cyan(vendors.length)} ${chalk.gray('services')}`);
93
+ console.log('');
94
+ },
95
+
96
+ [STEPS.INSTALLATION_COMPLETED]: ({ progress }) => {
97
+ console.log(chalk.green(`✅ Installation complete (${progress || 100}%)`));
98
+ console.log('');
99
+ },
100
+
101
+ [STEPS.SERVICE_STARTING]: ({ vendors }) => {
102
+ console.log(chalk.yellow('🚀 Step 3/4: Starting Website Services...'));
103
+ console.log(`${chalk.gray('🔧 Starting')} ${chalk.cyan(vendors.length)} ${chalk.gray('services')}`);
104
+ console.log('');
105
+ },
106
+
107
+ [STEPS.SERVICE_READY]: () => {
108
+ console.log(chalk.green('✅ Services started successfully'));
109
+ console.log('');
110
+ },
111
+
112
+ [STEPS.ACCESS_PREPARING]: () => {
113
+ console.log(chalk.yellow('🌐 Step 4/4: Getting Website URLs...'));
114
+ console.log('');
115
+ },
116
+
117
+ [STEPS.ACCESS_READY]: ({ appUrl, homeUrl, subscriptionUrl, dashboardUrl }) => {
118
+ console.log(chalk.green('🎉 Deployment completed successfully!\n'));
119
+
120
+ if (homeUrl || appUrl) {
121
+ console.log(`${chalk.gray('🏠 Website URL:')} ${chalk.cyan(homeUrl || appUrl)}`);
122
+ }
123
+ if (subscriptionUrl) {
124
+ console.log(`${chalk.gray('💳 Subscription URL:')} ${chalk.cyan(subscriptionUrl)}`);
125
+ }
126
+ if (dashboardUrl) {
127
+ console.log(`${chalk.gray('📊 Dashboard URL:')} ${chalk.cyan(dashboardUrl)}`);
128
+ }
129
+ console.log('');
130
+ },
131
+ },
132
+
133
+ onError: (deploymentError, step) => {
134
+ console.error(`${chalk.red('❌')} Deployment failed at ${chalk.yellow(step || 'unknown step')}:`);
135
+ console.error(` ${chalk.red(deploymentError.message)}`);
136
+
137
+ if (deploymentError.recovery?.suggestions) {
138
+ console.log(chalk.yellow('\n💡 Suggestions:'));
139
+ deploymentError.recovery.suggestions.forEach((suggestion) => {
140
+ console.log(` • ${suggestion}`);
141
+ });
142
+ }
143
+
144
+ if (deploymentError.sessionId) {
145
+ console.log(chalk.blue(`\n🔄 To resume this deployment, use session ID: ${deploymentError.sessionId}`));
146
+ }
147
+ console.log('');
148
+ },
149
+ });
150
+
151
+ const { appUrl, homeUrl, subscriptionUrl, dashboardUrl, vendors } = result;
152
+ const token = vendors?.[0]?.token;
153
+
154
+ console.log(chalk.green('🎊 Deployment Summary:'));
155
+ console.log(chalk.gray('======================'));
156
+ console.log(`${chalk.gray('Status:')} ${chalk.green('SUCCESS')}`);
157
+ console.log(`${chalk.gray('Session ID:')} ${chalk.cyan(result.sessionId)}`);
158
+ console.log(`${chalk.gray('Vendors:')} ${chalk.cyan(vendors?.length || 0)}`);
159
+ if (token) {
160
+ console.log(`${chalk.gray('Token:')} ${chalk.cyan(token.slice(0, 10) + '...')}`);
161
+ }
162
+ console.log('');
163
+
164
+ return {
165
+ appUrl,
166
+ homeUrl,
167
+ dashboardUrl,
168
+ subscriptionUrl,
169
+ token,
170
+ sessionId: result.sessionId,
171
+ vendors: result.vendors,
172
+ };
173
+ } catch (error) {
174
+ console.error(chalk.red('\n❌ Deployment failed:'));
175
+ console.error(` ${error.message}`);
176
+
177
+ if (error.sessionId) {
178
+ console.log(chalk.blue(`\n🔄 To resume this deployment, use session ID: ${error.sessionId}`));
179
+ }
180
+
181
+ throw error;
182
+ }
183
+ }
184
+
185
+ // CLI Usage
186
+ if (import.meta.url === `file://${process.argv[1]}`) {
187
+ const cachedCheckoutId = process.argv[2];
188
+ const cachedPaymentUrl = process.argv[3];
189
+ const paymentLinkKey = process.argv[4];
190
+
191
+ deployWebsite(cachedCheckoutId, cachedPaymentUrl, paymentLinkKey)
192
+ .then((result) => {
193
+ console.log(chalk.green('✅ Deployment completed successfully!'));
194
+ process.exit(0);
195
+ })
196
+ .catch((error) => {
197
+ console.error(chalk.red('❌ Deployment failed!'));
198
+ process.exit(1);
199
+ });
200
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "broker-client-nodejs-example",
3
+ "version": "1.0.0",
4
+ "description": "Node.js example for Payment Kit Broker Client",
5
+ "type": "module",
6
+ "main": "deploy-example.mjs",
7
+ "scripts": {
8
+ "start": "node deploy-example.mjs",
9
+ "deploy": "node deploy-example.mjs",
10
+ "deploy:resume": "node deploy-example.mjs $CACHED_CHECKOUT_ID $CACHED_PAYMENT_URL",
11
+ "deploy:custom": "node deploy-example.mjs '' '' CUSTOM_PAYMENT_LINK_ID"
12
+ },
13
+ "dependencies": {
14
+ "@blocklet/payment-broker-client": "^1.0.0",
15
+ "chalk": "^5.3.0",
16
+ "open": "^10.1.0"
17
+ },
18
+ "engines": {
19
+ "node": ">=18.0.0"
20
+ },
21
+ "keywords": [
22
+ "payment-kit",
23
+ "broker-client",
24
+ "deployment",
25
+ "nodejs",
26
+ "example"
27
+ ],
28
+ "author": "ArcBlock",
29
+ "license": "MIT"
30
+ }
@@ -0,0 +1,12 @@
1
+ import { ConfigProvider } from '../../core/interfaces';
2
+ import { BrokerConfig } from '../../core/types';
3
+ /**
4
+ * Browser configuration provider implementation
5
+ * Gets raw blocklet information from window.blocklet
6
+ */
7
+ export declare class BrowserConfigProvider implements ConfigProvider {
8
+ private config;
9
+ constructor(config: BrokerConfig);
10
+ getBlockletInfo(): Promise<any>;
11
+ }
12
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/adapters/config/browser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAIhD;;;GAGG;AACH,qBAAa,qBAAsB,YAAW,cAAc;IAC9C,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,YAAY;IAExC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;CAiChC"}
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ /* eslint-disable import/prefer-default-export */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BrowserConfigProvider = void 0;
8
+ const errors_1 = require("../../core/errors");
9
+ const logger_1 = __importDefault(require("../../core/logger"));
10
+ /**
11
+ * Browser configuration provider implementation
12
+ * Gets raw blocklet information from window.blocklet
13
+ */
14
+ class BrowserConfigProvider {
15
+ constructor(config) {
16
+ this.config = config;
17
+ }
18
+ getBlockletInfo() {
19
+ return Promise.resolve().then(() => {
20
+ try {
21
+ // Get blocklet info from window.blocklet object
22
+ const { blocklet } = window;
23
+ if (!blocklet) {
24
+ throw new Error('window.blocklet is not available. Make sure you are running in a blocklet environment.');
25
+ }
26
+ logger_1.default.info('Blocklet info found from window.blocklet', { hasBlocklet: true });
27
+ return blocklet;
28
+ }
29
+ catch (error) {
30
+ logger_1.default.error('Failed to get blocklet info from window.blocklet', { error: error.message });
31
+ throw (0, errors_1.createDeploymentError)(`Failed to get blocklet info from window.blocklet: ${error.message}. Please ensure you are running in a blocklet environment.`, 'VALIDATION_ERROR', {
32
+ step: 'creating_session',
33
+ details: { originalError: error },
34
+ recovery: {
35
+ canRetry: false,
36
+ suggestions: [
37
+ 'Make sure you are running this in a blocklet environment',
38
+ 'Check if window.blocklet is available',
39
+ 'Verify the Payment Kit is properly configured',
40
+ ],
41
+ },
42
+ });
43
+ }
44
+ });
45
+ }
46
+ }
47
+ exports.BrowserConfigProvider = BrowserConfigProvider;
48
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/adapters/config/browser.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;;;;AAIjD,8CAA0D;AAC1D,+DAAuC;AAEvC;;;GAGG;AACH,MAAa,qBAAqB;IAChC,YAAoB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE5C,eAAe;QACb,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;YACjC,IAAI,CAAC;gBACH,gDAAgD;gBAChD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAa,CAAC;gBAEnC,IAAI,CAAC,QAAQ,EAAE,CAAC;oBACd,MAAM,IAAI,KAAK,CAAC,wFAAwF,CAAC,CAAC;gBAC5G,CAAC;gBAED,gBAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/E,OAAO,QAAQ,CAAC;YAClB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,gBAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC3F,MAAM,IAAA,8BAAqB,EACzB,qDAAqD,KAAK,CAAC,OAAO,4DAA4D,EAC9H,kBAAkB,EAClB;oBACE,IAAI,EAAE,kBAAkB;oBACxB,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;oBACjC,QAAQ,EAAE;wBACR,QAAQ,EAAE,KAAK;wBACf,WAAW,EAAE;4BACX,0DAA0D;4BAC1D,uCAAuC;4BACvC,+CAA+C;yBAChD;qBACF;iBACF,CACF,CAAC;YACJ,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AApCD,sDAoCC"}
@@ -0,0 +1,13 @@
1
+ import { ConfigProvider } from '../../core/interfaces';
2
+ import { BrokerConfig } from '../../core/types';
3
+ /**
4
+ * Node.js configuration provider implementation
5
+ * Gets raw blocklet information from API endpoints
6
+ */
7
+ export declare class NodeConfigProvider implements ConfigProvider {
8
+ private config;
9
+ private cachedBlockletInfo?;
10
+ constructor(config: BrokerConfig);
11
+ getBlockletInfo(): Promise<any>;
12
+ }
13
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/adapters/config/node.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKhD;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IAG3C,OAAO,CAAC,MAAM;IAF1B,OAAO,CAAC,kBAAkB,CAAC,CAAM;gBAEb,MAAM,EAAE,YAAY;IAElC,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;CAkDtC"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ /* eslint-disable import/prefer-default-export */
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.NodeConfigProvider = void 0;
8
+ const utils_1 = require("../../core/utils");
9
+ const errors_1 = require("../../core/errors");
10
+ const logger_1 = __importDefault(require("../../core/logger"));
11
+ /**
12
+ * Node.js configuration provider implementation
13
+ * Gets raw blocklet information from API endpoints
14
+ */
15
+ class NodeConfigProvider {
16
+ constructor(config) {
17
+ this.config = config;
18
+ }
19
+ async getBlockletInfo() {
20
+ if (this.cachedBlockletInfo) {
21
+ return this.cachedBlockletInfo;
22
+ }
23
+ logger_1.default.info('Getting blocklet info from baseUrl', { baseUrl: this.config.baseUrl });
24
+ try {
25
+ // Try to get info from /__blocklet__.js endpoint
26
+ const blockletInfoUrl = utils_1.urlUtils.join(this.config.baseUrl, '__blocklet__.js?type=json');
27
+ logger_1.default.info('Getting blocklet info from __blocklet__.js', { blockletInfoUrl });
28
+ const response = await utils_1.httpUtils.get(blockletInfoUrl);
29
+ if (response.PAYMENT_LINK_ID) {
30
+ this.cachedBlockletInfo = response;
31
+ logger_1.default.info('Blocklet info found from __blocklet__.js', { hasPaymentLinkId: true });
32
+ return this.cachedBlockletInfo;
33
+ }
34
+ // Fallback to env API if not found in blocklet info
35
+ const envUrl = utils_1.urlUtils.join(this.config.baseUrl, 'api/env');
36
+ const envResponse = await utils_1.httpUtils.get(envUrl);
37
+ if (envResponse.PAYMENT_LINK_ID) {
38
+ this.cachedBlockletInfo = envResponse;
39
+ logger_1.default.info('Blocklet info found from /api/env', { hasPaymentLinkId: true });
40
+ return this.cachedBlockletInfo;
41
+ }
42
+ throw new Error('PAYMENT_LINK_ID not found in any API endpoint');
43
+ }
44
+ catch (error) {
45
+ logger_1.default.error('Failed to get blocklet info', { error });
46
+ throw (0, errors_1.createDeploymentError)(`Failed to get blocklet info from ${this.config.baseUrl}: ${error.message}`, 'VALIDATION_ERROR', {
47
+ step: 'creating_session',
48
+ details: { originalError: error },
49
+ recovery: {
50
+ canRetry: true,
51
+ suggestions: [
52
+ 'Check if the baseUrl is correct and accessible',
53
+ 'Verify the service is running and configured properly',
54
+ 'Ensure PAYMENT_LINK_ID is set in the environment',
55
+ ],
56
+ },
57
+ });
58
+ }
59
+ }
60
+ }
61
+ exports.NodeConfigProvider = NodeConfigProvider;
62
+ //# sourceMappingURL=node.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/adapters/config/node.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;;;;AAIjD,4CAAuD;AACvD,8CAA0D;AAC1D,+DAAuC;AAEvC;;;GAGG;AACH,MAAa,kBAAkB;IAG7B,YAAoB,MAAoB;QAApB,WAAM,GAAN,MAAM,CAAc;IAAG,CAAC;IAE5C,KAAK,CAAC,eAAe;QACnB,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,kBAAkB,CAAC;QACjC,CAAC;QAED,gBAAM,CAAC,IAAI,CAAC,oCAAoC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;QAEpF,IAAI,CAAC;YACH,iDAAiD;YACjD,MAAM,eAAe,GAAG,gBAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,2BAA2B,CAAC,CAAC;YACxF,gBAAM,CAAC,IAAI,CAAC,4CAA4C,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC;YAC/E,MAAM,QAAQ,GAAG,MAAM,iBAAS,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAEtD,IAAK,QAAgB,CAAC,eAAe,EAAE,CAAC;gBACtC,IAAI,CAAC,kBAAkB,GAAG,QAAQ,CAAC;gBACnC,gBAAM,CAAC,IAAI,CAAC,0CAA0C,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpF,OAAO,IAAI,CAAC,kBAAkB,CAAC;YACjC,CAAC;YAED,oDAAoD;YACpD,MAAM,MAAM,GAAG,gBAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YAC7D,MAAM,WAAW,GAAG,MAAM,iBAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAEhD,IAAK,WAAmB,CAAC,eAAe,EAAE,CAAC;gBACzC,IAAI,CAAC,kBAAkB,GAAG,WAAW,CAAC;gBACtC,gBAAM,CAAC,IAAI,CAAC,mCAAmC,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC7E,OAAO,IAAI,CAAC,kBAAkB,CAAC;YACjC,CAAC;YAED,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,gBAAM,CAAC,KAAK,CAAC,6BAA6B,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM,IAAA,8BAAqB,EACzB,oCAAoC,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC,OAAO,EAAE,EAC3E,kBAAkB,EAClB;gBACE,IAAI,EAAE,kBAAkB;gBACxB,OAAO,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE;gBACjC,QAAQ,EAAE;oBACR,QAAQ,EAAE,IAAI;oBACd,WAAW,EAAE;wBACX,gDAAgD;wBAChD,uDAAuD;wBACvD,kDAAkD;qBACnD;iBACF;aACF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF;AAvDD,gDAuDC"}
@@ -0,0 +1,12 @@
1
+ import { HttpClient } from '../../core/interfaces';
2
+ /**
3
+ * Browser HTTP client implementation
4
+ * Uses the passed api object (typically an axios instance)
5
+ */
6
+ export declare class BrowserHttpClient implements HttpClient {
7
+ private api;
8
+ constructor(api?: any);
9
+ get(url: string): Promise<any>;
10
+ post(url: string, data: any): Promise<any>;
11
+ }
12
+ //# sourceMappingURL=browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/adapters/http/browser.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD;;;GAGG;AACH,qBAAa,iBAAkB,YAAW,UAAU;IAClD,OAAO,CAAC,GAAG,CAAM;gBAEL,GAAG,CAAC,EAAE,GAAG;IA8Bf,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAK9B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAIjD"}
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ /* eslint-disable import/prefer-default-export */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.BrowserHttpClient = void 0;
5
+ /**
6
+ * Browser HTTP client implementation
7
+ * Uses the passed api object (typically an axios instance)
8
+ */
9
+ class BrowserHttpClient {
10
+ constructor(api) {
11
+ if (api) {
12
+ this.api = api;
13
+ }
14
+ else {
15
+ // Create simple fetch-compatible interface as fallback
16
+ this.api = {
17
+ get: async (url) => {
18
+ const headers = { 'Content-Type': 'application/json' };
19
+ const response = await fetch(url, { method: 'GET', headers });
20
+ if (!response.ok) {
21
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
22
+ }
23
+ return { data: await response.json() };
24
+ },
25
+ post: async (url, data) => {
26
+ const headers = { 'Content-Type': 'application/json' };
27
+ const response = await fetch(url, {
28
+ method: 'POST',
29
+ headers,
30
+ body: data ? JSON.stringify(data) : undefined,
31
+ });
32
+ if (!response.ok) {
33
+ throw new Error(`HTTP ${response.status}: ${response.statusText}`);
34
+ }
35
+ return { data: await response.json() };
36
+ },
37
+ };
38
+ }
39
+ }
40
+ async get(url) {
41
+ const response = await this.api.get(url);
42
+ return response.data;
43
+ }
44
+ async post(url, data) {
45
+ const response = await this.api.post(url, data);
46
+ return response.data;
47
+ }
48
+ }
49
+ exports.BrowserHttpClient = BrowserHttpClient;
50
+ //# sourceMappingURL=browser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/adapters/http/browser.ts"],"names":[],"mappings":";AAAA,iDAAiD;;;AAIjD;;;GAGG;AACH,MAAa,iBAAiB;IAG5B,YAAY,GAAS;QACnB,IAAI,GAAG,EAAE,CAAC;YACR,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACjB,CAAC;aAAM,CAAC;YACN,uDAAuD;YACvD,IAAI,CAAC,GAAG,GAAG;gBACT,GAAG,EAAE,KAAK,EAAE,GAAW,EAAE,EAAE;oBACzB,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;oBACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC9D,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBACrE,CAAC;oBACD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzC,CAAC;gBACD,IAAI,EAAE,KAAK,EAAE,GAAW,EAAE,IAAU,EAAE,EAAE;oBACtC,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;oBACvD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;wBAChC,MAAM,EAAE,MAAM;wBACd,OAAO;wBACP,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;qBAC9C,CAAC,CAAC;oBACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;wBACjB,MAAM,IAAI,KAAK,CAAC,QAAQ,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;oBACrE,CAAC;oBACD,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;gBACzC,CAAC;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,GAAW;QACnB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW,EAAE,IAAS;QAC/B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;CACF;AA1CD,8CA0CC"}
@@ -0,0 +1,12 @@
1
+ import { HttpClient } from '../../core/interfaces';
2
+ /**
3
+ * Node.js HTTP client implementation
4
+ * Uses httpUtils and automatically adds Authorization header
5
+ */
6
+ export declare class NodeHttpClient implements HttpClient {
7
+ private authToken;
8
+ constructor(authToken: string);
9
+ get(url: string): Promise<any>;
10
+ post(url: string, data: any): Promise<any>;
11
+ }
12
+ //# sourceMappingURL=node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/adapters/http/node.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGnD;;;GAGG;AACH,qBAAa,cAAe,YAAW,UAAU;IACnC,OAAO,CAAC,SAAS;gBAAT,SAAS,EAAE,MAAM;IAErC,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAQ9B,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;CAO3C"}