@li-nk.me/node-sdk 0.2.6 → 0.2.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.
- package/README.md +24 -0
- package/dist/http.js +1 -1
- package/dist/http.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/linkService.js +3 -1
- package/dist/linkService.js.map +1 -1
- package/dist/linkService.test.js +2 -2
- package/dist/linkService.test.js.map +1 -1
- package/dist/schemas.d.ts +23 -0
- package/dist/schemas.js +11 -1
- package/dist/schemas.js.map +1 -1
- package/dist/webhookHelpers.d.ts +4 -0
- package/dist/webhookHelpers.js +22 -0
- package/dist/webhookHelpers.js.map +1 -0
- package/dist/webhookHelpers.test.d.ts +1 -0
- package/dist/webhookHelpers.test.js +26 -0
- package/dist/webhookHelpers.test.js.map +1 -0
- package/dist-cjs/http.js +1 -1
- package/dist-cjs/http.js.map +1 -1
- package/dist-cjs/index.js +1 -0
- package/dist-cjs/index.js.map +1 -1
- package/dist-cjs/linkService.js +3 -1
- package/dist-cjs/linkService.js.map +1 -1
- package/dist-cjs/linkService.test.js +2 -2
- package/dist-cjs/linkService.test.js.map +1 -1
- package/dist-cjs/schemas.js +12 -2
- package/dist-cjs/schemas.js.map +1 -1
- package/dist-cjs/webhookHelpers.js +29 -0
- package/dist-cjs/webhookHelpers.js.map +1 -0
- package/dist-cjs/webhookHelpers.test.js +31 -0
- package/dist-cjs/webhookHelpers.test.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -36,6 +36,30 @@ const client = new LinkMeClient({
|
|
|
36
36
|
});
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
+
## Webhook Helpers
|
|
40
|
+
|
|
41
|
+
The SDK also exports helpers for common webhook receiver logic:
|
|
42
|
+
|
|
43
|
+
- verify `X-LinkMe-Signature`
|
|
44
|
+
- parse the LinkMe webhook envelope
|
|
45
|
+
|
|
46
|
+
```ts
|
|
47
|
+
import {
|
|
48
|
+
parseLinkMeWebhookEnvelope,
|
|
49
|
+
verifyLinkMeWebhookSignature,
|
|
50
|
+
} from '@li-nk.me/node-sdk';
|
|
51
|
+
|
|
52
|
+
const rawBody = req.rawBody.toString('utf8');
|
|
53
|
+
const signature = req.get('X-LinkMe-Signature');
|
|
54
|
+
|
|
55
|
+
if (!verifyLinkMeWebhookSignature(rawBody, signature, process.env.LINKME_WEBHOOK_SIGNING_SECRET!)) {
|
|
56
|
+
res.status(401).send('Invalid signature');
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const envelope = parseLinkMeWebhookEnvelope(JSON.parse(rawBody));
|
|
61
|
+
```
|
|
62
|
+
|
|
39
63
|
For full documentation, guides, and API reference, please visit our [Help Center](https://li-nk.me/docs/help).
|
|
40
64
|
|
|
41
65
|
## License
|
package/dist/http.js
CHANGED
|
@@ -8,7 +8,7 @@ export class FetchHttpClient {
|
|
|
8
8
|
this.apiKey = deps.apiKey;
|
|
9
9
|
}
|
|
10
10
|
async request(path, init) {
|
|
11
|
-
const url = `${this.baseUrl}${path}`;
|
|
11
|
+
const url = `${this.baseUrl}${path.replace(/\/+/g, '/')}`;
|
|
12
12
|
const headers = { 'Content-Type': 'application/json' };
|
|
13
13
|
if (this.apiKey)
|
|
14
14
|
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
package/dist/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,eAAe;IACP,OAAO,CAAS;IAChB,SAAS,CAAe;IACxB,MAAM,CAAU;IAEjC,YAAY,IAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,IAAsB;QACjD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAaA,MAAM,OAAO,eAAe;IACP,OAAO,CAAS;IAChB,SAAS,CAAe;IACxB,MAAM,CAAU;IAEjC,YAAY,IAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,IAAsB;QACjD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC/E,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,GAAI,IAAI,EAAE,OAAe,EAAE,EAAE,CAAC,CAAC;QACvG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,IAAI,MAAM,GAAQ,SAAS,CAAC;YAC5B,IAAI,CAAC;gBAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,QAAQ,IAAI,EAAE,CAAQ,CAAC;YAC9D,GAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAChC,GAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7B,MAAM,GAAG,CAAC;QACd,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACrB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC/E,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,eAAe,IAAI,EAAE,CAAQ,CAAC;YACrE,GAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC;gBAAE,GAAW,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;YACzD,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;CACJ"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpD,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACpD,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
|
package/dist/linkService.js
CHANGED
|
@@ -7,7 +7,6 @@ export class LinkService {
|
|
|
7
7
|
async createLink(input) {
|
|
8
8
|
const validated = CreateLinkInputSchema.parse(input);
|
|
9
9
|
const body = {
|
|
10
|
-
id: validated.slug,
|
|
11
10
|
slug: validated.slug,
|
|
12
11
|
deepLink: validated.deepLink ?? undefined,
|
|
13
12
|
redirects: validated.redirects,
|
|
@@ -30,6 +29,9 @@ export class LinkService {
|
|
|
30
29
|
return LinkSchema.parse(res);
|
|
31
30
|
}
|
|
32
31
|
async listLinks(appId) {
|
|
32
|
+
if (appId == null || String(appId).trim() === '') {
|
|
33
|
+
throw new Error('appId is required');
|
|
34
|
+
}
|
|
33
35
|
const res = await this.http.request(`/api/apps/${encodeURIComponent(appId)}/links`);
|
|
34
36
|
return ExtendedLinkSchema.array().parse(res);
|
|
35
37
|
}
|
package/dist/linkService.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkService.js","sourceRoot":"","sources":["../src/linkService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEnI,MAAM,OAAO,WAAW;IACH,IAAI,CAAa;IAElC,YAAY,IAAgB;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAsB;QACnC,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAQ;YACd,
|
|
1
|
+
{"version":3,"file":"linkService.js","sourceRoot":"","sources":["../src/linkService.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,UAAU,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAEnI,MAAM,OAAO,WAAW;IACH,IAAI,CAAa;IAElC,YAAY,IAAgB;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAsB;QACnC,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAQ;YACd,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,SAAS;YACzC,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,qBAAqB,EAAE,SAAS,CAAC,qBAAqB;YACtD,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK;YAC7B,cAAc,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW;YACzC,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ;SACvC,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,aAAa,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC/F,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAC,CAAC;QACH,OAAO,wBAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QACzB,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,aAAa,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzF,OAAO,kBAAkB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,OAAwB;QACjD,MAAM,SAAS,GAAG,qBAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7E,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACvB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;CACJ"}
|
package/dist/linkService.test.js
CHANGED
|
@@ -3,12 +3,12 @@ import { mock, instance, verify, deepEqual, when } from 'ts-mockito';
|
|
|
3
3
|
describe('LinkService', () => {
|
|
4
4
|
it('createLink posts correct body and validates response', async () => {
|
|
5
5
|
const httpMock = mock();
|
|
6
|
-
when(httpMock.request('/api/apps/app_1/links', deepEqual({ method: 'POST', body: JSON.stringify({
|
|
6
|
+
when(httpMock.request('/api/apps/app_1/links', deepEqual({ method: 'POST', body: JSON.stringify({ slug: 's', deepLink: '/d', redirects: { web: 'https://x' }, utm: { utm_source: 's' }, utmPresetId: undefined, allowParamPassthrough: undefined, customData: undefined, og_title: 't', og_description: undefined, og_image_url: undefined }) }))).thenResolve({ id: 's', app_id: 'app_1', domain_id: null, slug: 's', slugUrl: 'https://h/s' });
|
|
7
7
|
const http = instance(httpMock);
|
|
8
8
|
const svc = new LinkService(http);
|
|
9
9
|
const res = await svc.createLink({ appId: 'app_1', slug: 's', deepLink: '/d', redirects: { web: 'https://x' }, utm: { utm_source: 's' }, og: { title: 't' } });
|
|
10
10
|
expect(res.slug).toBe('s');
|
|
11
|
-
verify(httpMock.request('/api/apps/app_1/links', deepEqual({ method: 'POST', body: JSON.stringify({
|
|
11
|
+
verify(httpMock.request('/api/apps/app_1/links', deepEqual({ method: 'POST', body: JSON.stringify({ slug: 's', deepLink: '/d', redirects: { web: 'https://x' }, utm: { utm_source: 's' }, utmPresetId: undefined, allowParamPassthrough: undefined, customData: undefined, og_title: 't', og_description: undefined, og_image_url: undefined }) }))).once();
|
|
12
12
|
});
|
|
13
13
|
it('getLink validates response', async () => {
|
|
14
14
|
const httpMock = mock();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkService.test.js","sourceRoot":"","sources":["../src/linkService.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAErE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAI,EAAc,CAAC;QACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAM,uBAAuB,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"linkService.test.js","sourceRoot":"","sources":["../src/linkService.test.ts"],"names":[],"mappings":"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"}
|
package/dist/schemas.d.ts
CHANGED
|
@@ -417,8 +417,31 @@ export declare const CreateLinkResponseSchema: z.ZodObject<{
|
|
|
417
417
|
slug: string;
|
|
418
418
|
slugUrl: string;
|
|
419
419
|
}>;
|
|
420
|
+
/**
|
|
421
|
+
* Standard webhook envelope sent by LinkMe.
|
|
422
|
+
*/
|
|
423
|
+
export declare const LinkMeWebhookEnvelopeSchema: z.ZodObject<{
|
|
424
|
+
id: z.ZodString;
|
|
425
|
+
event: z.ZodString;
|
|
426
|
+
ts: z.ZodOptional<z.ZodString>;
|
|
427
|
+
app_id: z.ZodOptional<z.ZodString>;
|
|
428
|
+
data: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
|
|
429
|
+
}, "strip", z.ZodTypeAny, {
|
|
430
|
+
id: string;
|
|
431
|
+
event: string;
|
|
432
|
+
app_id?: string | undefined;
|
|
433
|
+
ts?: string | undefined;
|
|
434
|
+
data?: Record<string, unknown> | undefined;
|
|
435
|
+
}, {
|
|
436
|
+
id: string;
|
|
437
|
+
event: string;
|
|
438
|
+
app_id?: string | undefined;
|
|
439
|
+
ts?: string | undefined;
|
|
440
|
+
data?: Record<string, unknown> | undefined;
|
|
441
|
+
}>;
|
|
420
442
|
export type LinkParsed = z.infer<typeof LinkSchema>;
|
|
421
443
|
export type ExtendedLinkParsed = z.infer<typeof ExtendedLinkSchema>;
|
|
422
444
|
export type CreateLinkInputParsed = z.infer<typeof CreateLinkInputSchema>;
|
|
423
445
|
export type UpdateLinkInputParsed = z.infer<typeof UpdateLinkInputSchema>;
|
|
424
446
|
export type CreateLinkResponseParsed = z.infer<typeof CreateLinkResponseSchema>;
|
|
447
|
+
export type LinkMeWebhookEnvelopeParsed = z.infer<typeof LinkMeWebhookEnvelopeSchema>;
|
package/dist/schemas.js
CHANGED
|
@@ -49,7 +49,7 @@ export const ExtendedLinkSchema = LinkSchema.extend({
|
|
|
49
49
|
* Client input for creating a Link via the Node SDK.
|
|
50
50
|
*/
|
|
51
51
|
export const CreateLinkInputSchema = z.object({
|
|
52
|
-
appId: z.string(),
|
|
52
|
+
appId: z.string().min(1, 'appId is required'),
|
|
53
53
|
slug: z.string().optional(),
|
|
54
54
|
deepLink: z.string().nullable().optional(),
|
|
55
55
|
redirects: z.object({
|
|
@@ -114,4 +114,14 @@ export const CreateLinkResponseSchema = z.object({
|
|
|
114
114
|
slug: z.string(),
|
|
115
115
|
slugUrl: z.string(),
|
|
116
116
|
});
|
|
117
|
+
/**
|
|
118
|
+
* Standard webhook envelope sent by LinkMe.
|
|
119
|
+
*/
|
|
120
|
+
export const LinkMeWebhookEnvelopeSchema = z.object({
|
|
121
|
+
id: z.string().min(1),
|
|
122
|
+
event: z.string().min(1),
|
|
123
|
+
ts: z.string().optional(),
|
|
124
|
+
app_id: z.string().optional(),
|
|
125
|
+
data: z.record(z.unknown()).optional(),
|
|
126
|
+
});
|
|
117
127
|
//# sourceMappingURL=schemas.js.map
|
package/dist/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;IACd,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;IAClB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,uBAAuB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,kBAAkB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC;IAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type LinkMeWebhookEnvelopeParsed } from './schemas';
|
|
2
|
+
export type LinkMeWebhookEnvelope = LinkMeWebhookEnvelopeParsed;
|
|
3
|
+
export declare function parseLinkMeWebhookEnvelope(input: unknown): LinkMeWebhookEnvelope;
|
|
4
|
+
export declare function verifyLinkMeWebhookSignature(rawBody: string | Buffer, signatureHeader: string | undefined, secret: string): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { LinkMeWebhookEnvelopeSchema } from './schemas';
|
|
3
|
+
export function parseLinkMeWebhookEnvelope(input) {
|
|
4
|
+
return LinkMeWebhookEnvelopeSchema.parse(input);
|
|
5
|
+
}
|
|
6
|
+
export function verifyLinkMeWebhookSignature(rawBody, signatureHeader, secret) {
|
|
7
|
+
if (!signatureHeader || !signatureHeader.startsWith('sha256=')) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
const receivedHex = signatureHeader.slice('sha256='.length);
|
|
11
|
+
const expectedHex = crypto
|
|
12
|
+
.createHmac('sha256', secret)
|
|
13
|
+
.update(rawBody)
|
|
14
|
+
.digest('hex');
|
|
15
|
+
const received = Buffer.from(receivedHex, 'hex');
|
|
16
|
+
const expected = Buffer.from(expectedHex, 'hex');
|
|
17
|
+
if (received.length === 0 || received.length !== expected.length) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
return crypto.timingSafeEqual(received, expected);
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=webhookHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhookHelpers.js","sourceRoot":"","sources":["../src/webhookHelpers.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,2BAA2B,EAAoC,MAAM,WAAW,CAAC;AAI1F,MAAM,UAAU,0BAA0B,CAAC,KAAc;IACrD,OAAO,2BAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,4BAA4B,CACxC,OAAwB,EACxB,eAAmC,EACnC,MAAc;IAEd,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,MAAM;SACrB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,MAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
import { parseLinkMeWebhookEnvelope, verifyLinkMeWebhookSignature, } from './webhookHelpers';
|
|
3
|
+
describe('webhookHelpers', () => {
|
|
4
|
+
const sampleEnvelope = {
|
|
5
|
+
id: 'evt_123',
|
|
6
|
+
event: 'link.click',
|
|
7
|
+
app_id: 'app_456',
|
|
8
|
+
data: {
|
|
9
|
+
link_id: 'lnk_1',
|
|
10
|
+
platform: 'ios',
|
|
11
|
+
nested: { ignored: true },
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
it('parses LinkMe webhook envelope', () => {
|
|
15
|
+
const parsed = parseLinkMeWebhookEnvelope(sampleEnvelope);
|
|
16
|
+
expect(parsed.id).toBe('evt_123');
|
|
17
|
+
});
|
|
18
|
+
it('verifies LinkMe webhook signature', () => {
|
|
19
|
+
const rawBody = JSON.stringify(sampleEnvelope);
|
|
20
|
+
const secret = 'test-secret';
|
|
21
|
+
const digest = crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
|
|
22
|
+
expect(verifyLinkMeWebhookSignature(rawBody, `sha256=${digest}`, secret)).toBe(true);
|
|
23
|
+
expect(verifyLinkMeWebhookSignature(rawBody, 'sha256=bad', secret)).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=webhookHelpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhookHelpers.test.js","sourceRoot":"","sources":["../src/webhookHelpers.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EACH,0BAA0B,EAC1B,4BAA4B,GAC/B,MAAM,kBAAkB,CAAC;AAE1B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,MAAM,cAAc,GAAG;QACnB,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE;YACF,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC5B;KACJ,CAAC;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,0BAA0B,CAAC,cAAc,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC;QAC7B,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjF,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,UAAU,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,MAAM,CAAC,4BAA4B,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
package/dist-cjs/http.js
CHANGED
|
@@ -11,7 +11,7 @@ class FetchHttpClient {
|
|
|
11
11
|
this.apiKey = deps.apiKey;
|
|
12
12
|
}
|
|
13
13
|
async request(path, init) {
|
|
14
|
-
const url = `${this.baseUrl}${path}`;
|
|
14
|
+
const url = `${this.baseUrl}${path.replace(/\/+/g, '/')}`;
|
|
15
15
|
const headers = { 'Content-Type': 'application/json' };
|
|
16
16
|
if (this.apiKey)
|
|
17
17
|
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
package/dist-cjs/http.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";;;AAaA,MAAa,eAAe;IACP,OAAO,CAAS;IAChB,SAAS,CAAe;IACxB,MAAM,CAAU;IAEjC,YAAY,IAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,IAAsB;QACjD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":";;;AAaA,MAAa,eAAe;IACP,OAAO,CAAS;IAChB,SAAS,CAAe;IACxB,MAAM,CAAU;IAEjC,YAAY,IAAoB;QAC5B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,IAAsB;QACjD,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC/E,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,GAAI,IAAI,EAAE,OAAe,EAAE,EAAE,CAAC,CAAC;QACvG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACV,IAAI,MAAM,GAAQ,SAAS,CAAC;YAC5B,IAAI,CAAC;gBAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,QAAQ,IAAI,EAAE,CAAQ,CAAC;YAC9D,GAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAChC,GAAW,CAAC,MAAM,GAAG,MAAM,CAAC;YAC7B,MAAM,GAAG,CAAC;QACd,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACnC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAAY;QACrB,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,CAAC;QACrC,MAAM,OAAO,GAA2B,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC;QAC/E,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,eAAe,CAAC,GAAG,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC;QACpE,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,eAAe,IAAI,EAAE,CAAQ,CAAC;YACrE,GAAW,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YACjC,IAAI,CAAC;gBAAE,GAAW,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,CAAC;YACzD,MAAM,GAAG,CAAC;QACd,CAAC;IACL,CAAC;CACJ;AAvCD,0CAuCC"}
|
package/dist-cjs/index.js
CHANGED
|
@@ -23,4 +23,5 @@ Object.defineProperty(exports, "default", { enumerable: true, get: function () {
|
|
|
23
23
|
Object.defineProperty(exports, "LinkMeClient", { enumerable: true, get: function () { return client_js_1.LinkMeClient; } });
|
|
24
24
|
__exportStar(require("./models.js"), exports);
|
|
25
25
|
__exportStar(require("./schemas.js"), exports);
|
|
26
|
+
__exportStar(require("./webhookHelpers.js"), exports);
|
|
26
27
|
//# sourceMappingURL=index.js.map
|
package/dist-cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,yCAAoD;AAA3C,qHAAA,OAAO,OAAA;AAAE,yGAAA,YAAY,OAAA;AAC9B,8CAA4B;AAC5B,+CAA6B"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA,yCAAoD;AAA3C,qHAAA,OAAO,OAAA;AAAE,yGAAA,YAAY,OAAA;AAC9B,8CAA4B;AAC5B,+CAA6B;AAC7B,sDAAoC"}
|
package/dist-cjs/linkService.js
CHANGED
|
@@ -10,7 +10,6 @@ class LinkService {
|
|
|
10
10
|
async createLink(input) {
|
|
11
11
|
const validated = schemas_1.CreateLinkInputSchema.parse(input);
|
|
12
12
|
const body = {
|
|
13
|
-
id: validated.slug,
|
|
14
13
|
slug: validated.slug,
|
|
15
14
|
deepLink: validated.deepLink ?? undefined,
|
|
16
15
|
redirects: validated.redirects,
|
|
@@ -33,6 +32,9 @@ class LinkService {
|
|
|
33
32
|
return schemas_1.LinkSchema.parse(res);
|
|
34
33
|
}
|
|
35
34
|
async listLinks(appId) {
|
|
35
|
+
if (appId == null || String(appId).trim() === '') {
|
|
36
|
+
throw new Error('appId is required');
|
|
37
|
+
}
|
|
36
38
|
const res = await this.http.request(`/api/apps/${encodeURIComponent(appId)}/links`);
|
|
37
39
|
return schemas_1.ExtendedLinkSchema.array().parse(res);
|
|
38
40
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkService.js","sourceRoot":"","sources":["../src/linkService.ts"],"names":[],"mappings":";;;AAEA,uCAAmI;AAEnI,MAAa,WAAW;IACH,IAAI,CAAa;IAElC,YAAY,IAAgB;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAsB;QACnC,MAAM,SAAS,GAAG,+BAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAQ;YACd,
|
|
1
|
+
{"version":3,"file":"linkService.js","sourceRoot":"","sources":["../src/linkService.ts"],"names":[],"mappings":";;;AAEA,uCAAmI;AAEnI,MAAa,WAAW;IACH,IAAI,CAAa;IAElC,YAAY,IAAgB;QACxB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAsB;QACnC,MAAM,SAAS,GAAG,+BAAqB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACrD,MAAM,IAAI,GAAQ;YACd,IAAI,EAAE,SAAS,CAAC,IAAI;YACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,SAAS;YACzC,SAAS,EAAE,SAAS,CAAC,SAAS;YAC9B,GAAG,EAAE,SAAS,CAAC,GAAG;YAClB,WAAW,EAAE,SAAS,CAAC,WAAW;YAClC,qBAAqB,EAAE,SAAS,CAAC,qBAAqB;YACtD,UAAU,EAAE,SAAS,CAAC,UAAU;YAChC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,KAAK;YAC7B,cAAc,EAAE,SAAS,CAAC,EAAE,EAAE,WAAW;YACzC,YAAY,EAAE,SAAS,CAAC,EAAE,EAAE,QAAQ;SACvC,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,aAAa,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,QAAQ,EAAE;YAC/F,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;SAC7B,CAAC,CAAC;QACH,OAAO,kCAAwB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAU;QACpB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACjF,OAAO,oBAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,KAAa;QACzB,IAAI,KAAK,IAAI,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC/C,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACzC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,aAAa,kBAAkB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzF,OAAO,4BAAkB,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjD,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU,EAAE,OAAwB;QACjD,MAAM,SAAS,GAAG,+BAAqB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAM,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE;YAC7E,MAAM,EAAE,OAAO;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,oBAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,EAAU;QACvB,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,cAAc,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACnE,CAAC;CACJ;AArDD,kCAqDC"}
|
|
@@ -5,12 +5,12 @@ const ts_mockito_1 = require("ts-mockito");
|
|
|
5
5
|
describe('LinkService', () => {
|
|
6
6
|
it('createLink posts correct body and validates response', async () => {
|
|
7
7
|
const httpMock = (0, ts_mockito_1.mock)();
|
|
8
|
-
(0, ts_mockito_1.when)(httpMock.request('/api/apps/app_1/links', (0, ts_mockito_1.deepEqual)({ method: 'POST', body: JSON.stringify({
|
|
8
|
+
(0, ts_mockito_1.when)(httpMock.request('/api/apps/app_1/links', (0, ts_mockito_1.deepEqual)({ method: 'POST', body: JSON.stringify({ slug: 's', deepLink: '/d', redirects: { web: 'https://x' }, utm: { utm_source: 's' }, utmPresetId: undefined, allowParamPassthrough: undefined, customData: undefined, og_title: 't', og_description: undefined, og_image_url: undefined }) }))).thenResolve({ id: 's', app_id: 'app_1', domain_id: null, slug: 's', slugUrl: 'https://h/s' });
|
|
9
9
|
const http = (0, ts_mockito_1.instance)(httpMock);
|
|
10
10
|
const svc = new linkService_1.LinkService(http);
|
|
11
11
|
const res = await svc.createLink({ appId: 'app_1', slug: 's', deepLink: '/d', redirects: { web: 'https://x' }, utm: { utm_source: 's' }, og: { title: 't' } });
|
|
12
12
|
expect(res.slug).toBe('s');
|
|
13
|
-
(0, ts_mockito_1.verify)(httpMock.request('/api/apps/app_1/links', (0, ts_mockito_1.deepEqual)({ method: 'POST', body: JSON.stringify({
|
|
13
|
+
(0, ts_mockito_1.verify)(httpMock.request('/api/apps/app_1/links', (0, ts_mockito_1.deepEqual)({ method: 'POST', body: JSON.stringify({ slug: 's', deepLink: '/d', redirects: { web: 'https://x' }, utm: { utm_source: 's' }, utmPresetId: undefined, allowParamPassthrough: undefined, customData: undefined, og_title: 't', og_description: undefined, og_image_url: undefined }) }))).once();
|
|
14
14
|
});
|
|
15
15
|
it('getLink validates response', async () => {
|
|
16
16
|
const httpMock = (0, ts_mockito_1.mock)();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"linkService.test.js","sourceRoot":"","sources":["../src/linkService.test.ts"],"names":[],"mappings":";;AAAA,+CAA4C;AAE5C,2CAAqE;AAErE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,QAAQ,GAAG,IAAA,iBAAI,GAAc,CAAC;QACpC,IAAA,iBAAI,EAAC,QAAQ,CAAC,OAAO,CAAM,uBAAuB,EAAE,IAAA,sBAAS,EAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"linkService.test.js","sourceRoot":"","sources":["../src/linkService.test.ts"],"names":[],"mappings":"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"}
|
package/dist-cjs/schemas.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CreateLinkResponseSchema = exports.UpdateLinkInputSchema = exports.CreateLinkInputSchema = exports.ExtendedLinkSchema = exports.LinkSchema = void 0;
|
|
3
|
+
exports.LinkMeWebhookEnvelopeSchema = exports.CreateLinkResponseSchema = exports.UpdateLinkInputSchema = exports.CreateLinkInputSchema = exports.ExtendedLinkSchema = exports.LinkSchema = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* Zod schemas for Node SDK models and API contracts.
|
|
6
6
|
*
|
|
@@ -52,7 +52,7 @@ exports.ExtendedLinkSchema = exports.LinkSchema.extend({
|
|
|
52
52
|
* Client input for creating a Link via the Node SDK.
|
|
53
53
|
*/
|
|
54
54
|
exports.CreateLinkInputSchema = zod_1.z.object({
|
|
55
|
-
appId: zod_1.z.string(),
|
|
55
|
+
appId: zod_1.z.string().min(1, 'appId is required'),
|
|
56
56
|
slug: zod_1.z.string().optional(),
|
|
57
57
|
deepLink: zod_1.z.string().nullable().optional(),
|
|
58
58
|
redirects: zod_1.z.object({
|
|
@@ -117,4 +117,14 @@ exports.CreateLinkResponseSchema = zod_1.z.object({
|
|
|
117
117
|
slug: zod_1.z.string(),
|
|
118
118
|
slugUrl: zod_1.z.string(),
|
|
119
119
|
});
|
|
120
|
+
/**
|
|
121
|
+
* Standard webhook envelope sent by LinkMe.
|
|
122
|
+
*/
|
|
123
|
+
exports.LinkMeWebhookEnvelopeSchema = zod_1.z.object({
|
|
124
|
+
id: zod_1.z.string().min(1),
|
|
125
|
+
event: zod_1.z.string().min(1),
|
|
126
|
+
ts: zod_1.z.string().optional(),
|
|
127
|
+
app_id: zod_1.z.string().optional(),
|
|
128
|
+
data: zod_1.z.record(zod_1.z.unknown()).optional(),
|
|
129
|
+
});
|
|
120
130
|
//# sourceMappingURL=schemas.js.map
|
package/dist-cjs/schemas.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":";;;AAAA;;;;;;;;;;GAUG;AACH,6BAAwB;AAExB;;GAEG;AACU,QAAA,UAAU,GAAG,OAAC,CAAC,MAAM,CAAC;IAC/B,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;IACd,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE;IAClB,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;IAChB,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,kBAAkB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACpD,gBAAgB,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAClD,uBAAuB,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,kBAAkB,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,cAAc,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAChD,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,GAAG,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IACrC,YAAY,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC9C,OAAO,EAAE,OAAC,CAAC,KAAK,CAAC,CAAC,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE;IACvB,aAAa,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC/C,UAAU,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,kBAAkB,GAAG,kBAAU,CAAC,MAAM,CAAC;IAChD,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE;IAC1C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC9B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAClC,CAAC,CAAC;AAEH;;GAEG;AACU,QAAA,qBAAqB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC1C,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../src/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.parseLinkMeWebhookEnvelope = parseLinkMeWebhookEnvelope;
|
|
7
|
+
exports.verifyLinkMeWebhookSignature = verifyLinkMeWebhookSignature;
|
|
8
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
9
|
+
const schemas_1 = require("./schemas");
|
|
10
|
+
function parseLinkMeWebhookEnvelope(input) {
|
|
11
|
+
return schemas_1.LinkMeWebhookEnvelopeSchema.parse(input);
|
|
12
|
+
}
|
|
13
|
+
function verifyLinkMeWebhookSignature(rawBody, signatureHeader, secret) {
|
|
14
|
+
if (!signatureHeader || !signatureHeader.startsWith('sha256=')) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
const receivedHex = signatureHeader.slice('sha256='.length);
|
|
18
|
+
const expectedHex = node_crypto_1.default
|
|
19
|
+
.createHmac('sha256', secret)
|
|
20
|
+
.update(rawBody)
|
|
21
|
+
.digest('hex');
|
|
22
|
+
const received = Buffer.from(receivedHex, 'hex');
|
|
23
|
+
const expected = Buffer.from(expectedHex, 'hex');
|
|
24
|
+
if (received.length === 0 || received.length !== expected.length) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
return node_crypto_1.default.timingSafeEqual(received, expected);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=webhookHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhookHelpers.js","sourceRoot":"","sources":["../src/webhookHelpers.ts"],"names":[],"mappings":";;;;;AAKA,gEAEC;AAED,oEAuBC;AAhCD,8DAAiC;AACjC,uCAA0F;AAI1F,SAAgB,0BAA0B,CAAC,KAAc;IACrD,OAAO,qCAA2B,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,SAAgB,4BAA4B,CACxC,OAAwB,EACxB,eAAmC,EACnC,MAAc;IAEd,IAAI,CAAC,eAAe,IAAI,CAAC,eAAe,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC7D,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5D,MAAM,WAAW,GAAG,qBAAM;SACrB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5B,MAAM,CAAC,OAAO,CAAC;SACf,MAAM,CAAC,KAAK,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IACjD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;IAEjD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC/D,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,OAAO,qBAAM,CAAC,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
7
|
+
const webhookHelpers_1 = require("./webhookHelpers");
|
|
8
|
+
describe('webhookHelpers', () => {
|
|
9
|
+
const sampleEnvelope = {
|
|
10
|
+
id: 'evt_123',
|
|
11
|
+
event: 'link.click',
|
|
12
|
+
app_id: 'app_456',
|
|
13
|
+
data: {
|
|
14
|
+
link_id: 'lnk_1',
|
|
15
|
+
platform: 'ios',
|
|
16
|
+
nested: { ignored: true },
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
it('parses LinkMe webhook envelope', () => {
|
|
20
|
+
const parsed = (0, webhookHelpers_1.parseLinkMeWebhookEnvelope)(sampleEnvelope);
|
|
21
|
+
expect(parsed.id).toBe('evt_123');
|
|
22
|
+
});
|
|
23
|
+
it('verifies LinkMe webhook signature', () => {
|
|
24
|
+
const rawBody = JSON.stringify(sampleEnvelope);
|
|
25
|
+
const secret = 'test-secret';
|
|
26
|
+
const digest = node_crypto_1.default.createHmac('sha256', secret).update(rawBody).digest('hex');
|
|
27
|
+
expect((0, webhookHelpers_1.verifyLinkMeWebhookSignature)(rawBody, `sha256=${digest}`, secret)).toBe(true);
|
|
28
|
+
expect((0, webhookHelpers_1.verifyLinkMeWebhookSignature)(rawBody, 'sha256=bad', secret)).toBe(false);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=webhookHelpers.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhookHelpers.test.js","sourceRoot":"","sources":["../src/webhookHelpers.test.ts"],"names":[],"mappings":";;;;;AAAA,8DAAiC;AACjC,qDAG0B;AAE1B,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,MAAM,cAAc,GAAG;QACnB,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,YAAY;QACnB,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE;YACF,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,KAAK;YACf,MAAM,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;SAC5B;KACJ,CAAC;IAEF,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,IAAA,2CAA0B,EAAC,cAAc,CAAC,CAAC;QAC1D,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,aAAa,CAAC;QAC7B,MAAM,MAAM,GAAG,qBAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACjF,MAAM,CAAC,IAAA,6CAA4B,EAAC,OAAO,EAAE,UAAU,MAAM,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,MAAM,CAAC,IAAA,6CAA4B,EAAC,OAAO,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpF,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|