@licensechain/nodejs-sdk 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +500 -0
- package/dist/api-client.d.ts +13 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +52 -0
- package/dist/api-client.js.map +1 -0
- package/dist/client.d.ts +24 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +60 -0
- package/dist/client.js.map +1 -0
- package/dist/configuration.d.ts +26 -0
- package/dist/configuration.d.ts.map +1 -0
- package/dist/configuration.js +63 -0
- package/dist/configuration.js.map +1 -0
- package/dist/exceptions.d.ts +46 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +105 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/http-core.d.ts +36 -0
- package/dist/http-core.d.ts.map +1 -0
- package/dist/http-core.js +119 -0
- package/dist/http-core.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/license-assertion.d.ts +15 -0
- package/dist/license-assertion.d.ts.map +1 -0
- package/dist/license-assertion.js +59 -0
- package/dist/license-assertion.js.map +1 -0
- package/dist/license-validator.d.ts +53 -0
- package/dist/license-validator.d.ts.map +1 -0
- package/dist/license-validator.js +208 -0
- package/dist/license-validator.js.map +1 -0
- package/dist/services/license-service.d.ts +55 -0
- package/dist/services/license-service.d.ts.map +1 -0
- package/dist/services/license-service.js +85 -0
- package/dist/services/license-service.js.map +1 -0
- package/dist/services/product-service.d.ts +48 -0
- package/dist/services/product-service.d.ts.map +1 -0
- package/dist/services/product-service.js +53 -0
- package/dist/services/product-service.js.map +1 -0
- package/dist/services/user-service.d.ts +43 -0
- package/dist/services/user-service.d.ts.map +1 -0
- package/dist/services/user-service.js +58 -0
- package/dist/services/user-service.js.map +1 -0
- package/dist/services/webhook-service.d.ts +37 -0
- package/dist/services/webhook-service.d.ts.map +1 -0
- package/dist/services/webhook-service.js +57 -0
- package/dist/services/webhook-service.js.map +1 -0
- package/dist/types.d.ts +197 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +54 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +396 -0
- package/dist/utils.js.map +1 -0
- package/dist/webhook-handler.d.ts +40 -0
- package/dist/webhook-handler.d.ts.map +1 -0
- package/dist/webhook-handler.js +160 -0
- package/dist/webhook-handler.js.map +1 -0
- package/dist/webhook-verifier.d.ts +41 -0
- package/dist/webhook-verifier.d.ts.map +1 -0
- package/dist/webhook-verifier.js +153 -0
- package/dist/webhook-verifier.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-verifier.d.ts","sourceRoot":"","sources":["../src/webhook-verifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAGtC,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;gBAEX,MAAM,EAAE,MAAM;IAI1B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAUnD;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAuBpD;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAOzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;OAEG;IACH,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW;IAyBpE;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM;IAIxC;;OAEG;IACH,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAwB5C;;OAEG;IACH,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAuB3C"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Webhook Verifier for LicenseChain Node.js SDK
|
|
4
|
+
*/
|
|
5
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
6
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.WebhookVerifier = void 0;
|
|
10
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
11
|
+
const exceptions_1 = require("./exceptions");
|
|
12
|
+
class WebhookVerifier {
|
|
13
|
+
constructor(secret) {
|
|
14
|
+
this.secret = secret;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Verify webhook signature
|
|
18
|
+
*/
|
|
19
|
+
verify(payload, signature) {
|
|
20
|
+
try {
|
|
21
|
+
const expectedSignature = this.generateSignature(payload);
|
|
22
|
+
return this.compareSignatures(signature, expectedSignature);
|
|
23
|
+
}
|
|
24
|
+
catch (error) {
|
|
25
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
26
|
+
throw new exceptions_1.WebhookVerificationException(`Signature verification failed: ${message}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Verify webhook data
|
|
31
|
+
*/
|
|
32
|
+
verifyWebhookData(webhookData) {
|
|
33
|
+
try {
|
|
34
|
+
// Check required fields
|
|
35
|
+
if (!webhookData.event || !webhookData.data || !webhookData.timestamp) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
// Check timestamp (prevent replay attacks)
|
|
39
|
+
const now = new Date().getTime();
|
|
40
|
+
const webhookTime = new Date(webhookData.timestamp).getTime();
|
|
41
|
+
const timeDiff = Math.abs(now - webhookTime);
|
|
42
|
+
// Allow 5 minutes tolerance
|
|
43
|
+
if (timeDiff > 5 * 60 * 1000) {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate signature for payload
|
|
54
|
+
*/
|
|
55
|
+
generateSignature(payload) {
|
|
56
|
+
return crypto_1.default
|
|
57
|
+
.createHmac('sha256', this.secret)
|
|
58
|
+
.update(payload, 'utf8')
|
|
59
|
+
.digest('hex');
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Compare signatures securely
|
|
63
|
+
*/
|
|
64
|
+
compareSignatures(signature1, signature2) {
|
|
65
|
+
if (signature1.length !== signature2.length) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
return crypto_1.default.timingSafeEqual(Buffer.from(signature1, 'hex'), Buffer.from(signature2, 'hex'));
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Parse webhook payload
|
|
72
|
+
*/
|
|
73
|
+
parseWebhookPayload(payload, signature) {
|
|
74
|
+
try {
|
|
75
|
+
// Verify signature first
|
|
76
|
+
if (!this.verify(payload, signature)) {
|
|
77
|
+
throw new exceptions_1.WebhookVerificationException('Invalid webhook signature');
|
|
78
|
+
}
|
|
79
|
+
// Parse JSON payload
|
|
80
|
+
const webhookData = JSON.parse(payload);
|
|
81
|
+
// Verify webhook data structure
|
|
82
|
+
if (!this.verifyWebhookData(webhookData)) {
|
|
83
|
+
throw new exceptions_1.WebhookVerificationException('Invalid webhook data');
|
|
84
|
+
}
|
|
85
|
+
return webhookData;
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error instanceof exceptions_1.WebhookVerificationException) {
|
|
89
|
+
throw error;
|
|
90
|
+
}
|
|
91
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
92
|
+
throw new exceptions_1.WebhookVerificationException(`Failed to parse webhook payload: ${message}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Create webhook signature
|
|
97
|
+
*/
|
|
98
|
+
createSignature(payload) {
|
|
99
|
+
return `sha256=${this.generateSignature(payload)}`;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Validate webhook event type
|
|
103
|
+
*/
|
|
104
|
+
isValidEventType(eventType) {
|
|
105
|
+
const validEvents = [
|
|
106
|
+
'license.created',
|
|
107
|
+
'license.updated',
|
|
108
|
+
'license.deleted',
|
|
109
|
+
'license.validated',
|
|
110
|
+
'license.expired',
|
|
111
|
+
'license.suspended',
|
|
112
|
+
'user.created',
|
|
113
|
+
'user.updated',
|
|
114
|
+
'user.deleted',
|
|
115
|
+
'application.created',
|
|
116
|
+
'application.updated',
|
|
117
|
+
'application.deleted',
|
|
118
|
+
'payment.completed',
|
|
119
|
+
'payment.failed',
|
|
120
|
+
'subscription.created',
|
|
121
|
+
'subscription.updated',
|
|
122
|
+
'subscription.cancelled'
|
|
123
|
+
];
|
|
124
|
+
return validEvents.includes(eventType);
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get webhook event handler
|
|
128
|
+
*/
|
|
129
|
+
getEventHandler(eventType) {
|
|
130
|
+
const eventHandlers = {
|
|
131
|
+
'license.created': 'onLicenseCreated',
|
|
132
|
+
'license.updated': 'onLicenseUpdated',
|
|
133
|
+
'license.deleted': 'onLicenseDeleted',
|
|
134
|
+
'license.validated': 'onLicenseValidated',
|
|
135
|
+
'license.expired': 'onLicenseExpired',
|
|
136
|
+
'license.suspended': 'onLicenseSuspended',
|
|
137
|
+
'user.created': 'onUserCreated',
|
|
138
|
+
'user.updated': 'onUserUpdated',
|
|
139
|
+
'user.deleted': 'onUserDeleted',
|
|
140
|
+
'application.created': 'onApplicationCreated',
|
|
141
|
+
'application.updated': 'onApplicationUpdated',
|
|
142
|
+
'application.deleted': 'onApplicationDeleted',
|
|
143
|
+
'payment.completed': 'onPaymentCompleted',
|
|
144
|
+
'payment.failed': 'onPaymentFailed',
|
|
145
|
+
'subscription.created': 'onSubscriptionCreated',
|
|
146
|
+
'subscription.updated': 'onSubscriptionUpdated',
|
|
147
|
+
'subscription.cancelled': 'onSubscriptionCancelled'
|
|
148
|
+
};
|
|
149
|
+
return eventHandlers[eventType] || 'onUnknownEvent';
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
exports.WebhookVerifier = WebhookVerifier;
|
|
153
|
+
//# sourceMappingURL=webhook-verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-verifier.js","sourceRoot":"","sources":["../src/webhook-verifier.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@licensechain/nodejs-sdk",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Official LicenseChain Node.js SDK for license management and validation",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"files": [
|
|
8
|
+
"dist",
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "tsc",
|
|
14
|
+
"dev": "tsc --watch",
|
|
15
|
+
"lint": "eslint src/**/*.ts",
|
|
16
|
+
"lint:fix": "eslint src/**/*.ts --fix",
|
|
17
|
+
"format": "prettier --write src/**/*.ts"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"license",
|
|
21
|
+
"validation",
|
|
22
|
+
"api",
|
|
23
|
+
"sdk",
|
|
24
|
+
"nodejs",
|
|
25
|
+
"licensechain",
|
|
26
|
+
"license-management",
|
|
27
|
+
"webhook",
|
|
28
|
+
"authentication",
|
|
29
|
+
"typescript"
|
|
30
|
+
],
|
|
31
|
+
"author": "LicenseChain Team <support@licensechain.app>",
|
|
32
|
+
"license": "MIT",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "https://github.com/LicenseChain/LicenseChain-NodeJS-SDK.git"
|
|
36
|
+
},
|
|
37
|
+
"bugs": {
|
|
38
|
+
"url": "https://github.com/LicenseChain/LicenseChain-NodeJS-SDK/issues"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://docs.licensechain.app/sdks/nodejs",
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=14.0.0"
|
|
43
|
+
},
|
|
44
|
+
"dependencies": {
|
|
45
|
+
"axios": "^1.6.0",
|
|
46
|
+
"crypto": "^1.0.1",
|
|
47
|
+
"form-data": "^4.0.0",
|
|
48
|
+
"jose": "^5.9.6"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^20.10.0",
|
|
52
|
+
"@typescript-eslint/eslint-plugin": "^6.12.0",
|
|
53
|
+
"@typescript-eslint/parser": "^6.12.0",
|
|
54
|
+
"eslint": "^8.54.0",
|
|
55
|
+
"eslint-config-prettier": "^9.0.0",
|
|
56
|
+
"eslint-plugin-prettier": "^5.0.1",
|
|
57
|
+
"prettier": "^3.1.0",
|
|
58
|
+
"typescript": "^5.3.2"
|
|
59
|
+
},
|
|
60
|
+
"peerDependencies": {
|
|
61
|
+
"axios": "^1.6.0"
|
|
62
|
+
},
|
|
63
|
+
"peerDependenciesMeta": {
|
|
64
|
+
"axios": {
|
|
65
|
+
"optional": true
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"publishConfig": {
|
|
69
|
+
"access": "public"
|
|
70
|
+
}
|
|
71
|
+
}
|