New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

messaging-api-messenger

Package Overview
Dependencies
Maintainers
3
Versions
112
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

messaging-api-messenger - npm Package Compare versions

Comparing version 1.0.0-beta.31 to 1.0.0-beta.33

46

dist/MessengerBatch.js

@@ -23,2 +23,8 @@ "use strict";

}
function pickBatchOptions(options) {
return pick_1.default(options, ['name', 'dependsOn', 'omitResponseOnSuccess']);
}
function omitBatchOptions(options) {
return omit_1.default(options, ['name', 'dependsOn', 'omitResponseOnSuccess']);
}
function sendRequest(body, options) {

@@ -40,5 +46,5 @@ return Object.assign({ method: 'POST', relativeUrl: 'me/messages', body }, options);

}
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return sendRequest(Object.assign({ messagingType,
recipient, message: Messenger_1.default.createMessage(msg, options) }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))), batchRequestOptions);
recipient, message: Messenger_1.default.createMessage(msg, options) }, omitUndefinedFields(omitBatchOptions(options))), batchRequestOptions);
}

@@ -95,3 +101,3 @@ function sendText(psidOrRecipient, text, options) {

function getUserProfile(userId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
const fields = options.fields || [

@@ -107,7 +113,7 @@ 'id',

function getUserPersistentMenu(userId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'GET', relativeUrl: `/me/custom_user_settings?psid=${userId}`.concat(options.accessToken ? `&access_token=${options.accessToken}` : '') }, batchRequestOptions);
}
function setUserPersistentMenu(userId, menuItems, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
if (menuItems.some((item) => 'locale' in item && item.locale === 'default')) {

@@ -131,3 +137,3 @@ return Object.assign({ method: 'POST', relativeUrl: `/me/custom_user_settings`.concat(options.accessToken ? `?access_token=${options.accessToken}` : ''), body: {

function deleteUserPersistentMenu(userId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'DELETE', relativeUrl: `/me/custom_user_settings?psid=${userId}&params=[%22persistent_menu%22]`.concat(options.accessToken ? `&access_token=${options.accessToken}` : '') }, batchRequestOptions);

@@ -141,5 +147,5 @@ }

: psidOrRecipient;
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return sendRequest(Object.assign({ recipient,
senderAction }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))), batchRequestOptions);
senderAction }, omitUndefinedFields(omitBatchOptions(options))), batchRequestOptions);
}

@@ -156,5 +162,5 @@ function typingOn(idOrRecipient, options) {

function passThreadControl(recipientId, targetAppId, metadata, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'POST', relativeUrl: 'me/pass_thread_control', body: Object.assign({ recipient: { id: recipientId }, targetAppId,
metadata }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))) }, batchRequestOptions);
metadata }, omitUndefinedFields(omitBatchOptions(options))) }, batchRequestOptions);
}

@@ -165,23 +171,23 @@ function passThreadControlToPageInbox(recipientId, metadata, options = {}) {

function takeThreadControl(recipientId, metadata, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
return Object.assign({ method: 'POST', relativeUrl: 'me/take_thread_control', body: Object.assign({ recipient: { id: recipientId }, metadata }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))) }, batchRequestOptions);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'POST', relativeUrl: 'me/take_thread_control', body: Object.assign({ recipient: { id: recipientId }, metadata }, omitUndefinedFields(omitBatchOptions(options))) }, batchRequestOptions);
}
function requestThreadControl(recipientId, metadata, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
return Object.assign({ method: 'POST', relativeUrl: 'me/request_thread_control', body: Object.assign({ recipient: { id: recipientId }, metadata }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))) }, batchRequestOptions);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'POST', relativeUrl: 'me/request_thread_control', body: Object.assign({ recipient: { id: recipientId }, metadata }, omitUndefinedFields(omitBatchOptions(options))) }, batchRequestOptions);
}
function getThreadOwner(recipientId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'GET', relativeUrl: `me/thread_owner?recipient=${recipientId}`.concat(options.accessToken ? `&access_token=${options.accessToken}` : ''), responseAccessPath: 'data[0].threadOwner' }, batchRequestOptions);
}
function associateLabel(userId, labelId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
return Object.assign({ method: 'POST', relativeUrl: `${labelId}/label`, body: Object.assign({ user: userId }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))) }, batchRequestOptions);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'POST', relativeUrl: `${labelId}/label`, body: Object.assign({ user: userId }, omitUndefinedFields(omitBatchOptions(options))) }, batchRequestOptions);
}
function dissociateLabel(userId, labelId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
return Object.assign({ method: 'DELETE', relativeUrl: `${labelId}/label`, body: Object.assign({ user: userId }, omitUndefinedFields(omit_1.default(options, ['name', 'dependsOn']))) }, batchRequestOptions);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'DELETE', relativeUrl: `${labelId}/label`, body: Object.assign({ user: userId }, omitUndefinedFields(omitBatchOptions(options))) }, batchRequestOptions);
}
function getAssociatedLabels(userId, options = {}) {
const batchRequestOptions = pick_1.default(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);
return Object.assign({ method: 'GET', relativeUrl: `${userId}/custom_labels`.concat(options.accessToken ? `?access_token=${options.accessToken}` : '') }, batchRequestOptions);

@@ -188,0 +194,0 @@ }

@@ -8,3 +8,3 @@ import FormData from 'form-data';

*/
static connect(accessTokenOrConfig: string | Types.ClientConfig, version?: string): MessengerClient;
static connect(config: Types.ClientConfig): MessengerClient;
/**

@@ -34,10 +34,12 @@ * The underlying axios instance.

private onRequest?;
constructor(accessTokenOrConfig: string | Types.ClientConfig, version?: string);
constructor(config: Types.ClientConfig);
/**
* Get Page Info
*
* https://developers.facebook.com/docs/graph-api/using-graph-api
* https://developers.facebook.com/docs/graph-api/reference/page/
* id, name
*/
getPageInfo({ accessToken: customAccessToken, }?: Types.AccessTokenOptions): Promise<Types.PageInfo>;
getPageInfo({ fields, accessToken: customAccessToken, }?: Types.AccessTokenOptions & {
fields?: string[];
}): Promise<Types.PageInfo>;
/**

@@ -241,3 +243,5 @@ * Debug Token

*/
sendBatch(batch: Types.BatchItem[], { accessToken: customAccessToken }?: Types.AccessTokenOptions): Promise<{
sendBatch(batch: Types.BatchItem[], { includeHeaders, accessToken: customAccessToken, }?: Types.AccessTokenOptions & {
includeHeaders?: boolean;
}): Promise<{
code: number;

@@ -244,0 +248,0 @@ headers?: {

@@ -49,5 +49,7 @@ "use strict";

if (err.response && err.response.data) {
const error = get_1.default(err, 'response.data.error', {});
const msg = `Messenger API - ${error.code} ${error.type} ${error.message}`;
throw new axios_error_1.default(msg, err);
const error = get_1.default(err, 'response.data.error');
if (error) {
const msg = `Messenger API - ${error.code} ${error.type} ${error.message}`;
throw new axios_error_1.default(msg, err);
}
}

@@ -57,26 +59,17 @@ throw new axios_error_1.default(err.message, err);

class MessengerClient {
constructor(accessTokenOrConfig, version = '6.0') {
let origin;
constructor(config) {
ts_invariant_1.default(typeof config !== 'string', `MessengerClient: do not allow constructing client with ${config} string. Use object instead.`);
this.accessToken = config.accessToken;
ts_invariant_1.default(!config.version || typeof config.version === 'string', 'Type of `version` must be string.');
this.appId = config.appId;
this.appSecret = config.appSecret;
this.version = extractVersion(config.version || '6.0');
this.onRequest = config.onRequest;
const { origin } = config;
let skipAppSecretProof;
if (accessTokenOrConfig && typeof accessTokenOrConfig === 'object') {
const config = accessTokenOrConfig;
this.accessToken = config.accessToken;
ts_invariant_1.default(!config.version || typeof config.version === 'string', 'Type of `version` must be string.');
this.appId = config.appId;
this.appSecret = config.appSecret;
this.version = extractVersion(config.version || '6.0');
this.onRequest = config.onRequest;
origin = config.origin;
if (typeof config.skipAppSecretProof === 'boolean') {
skipAppSecretProof = config.skipAppSecretProof;
}
else {
skipAppSecretProof = this.appSecret == null;
}
if (typeof config.skipAppSecretProof === 'boolean') {
skipAppSecretProof = config.skipAppSecretProof;
}
else {
this.accessToken = accessTokenOrConfig;
ts_invariant_1.default(typeof version === 'string', 'Type of `version` must be string.');
this.version = extractVersion(version);
skipAppSecretProof = true;
skipAppSecretProof = this.appSecret == null;
}

@@ -106,7 +99,7 @@ this.axios = axios_1.default.create({

const appSecret = this.appSecret;
this.axios.interceptors.request.use((config) => {
const isBatch = config.url === '/' && Array.isArray(config.data.batch);
this.axios.interceptors.request.use((requestConfig) => {
const isBatch = requestConfig.url === '/' && Array.isArray(requestConfig.data.batch);
if (isBatch) {
// eslint-disable-next-line no-param-reassign
config.data.batch = config.data.batch.map((item) => {
requestConfig.data.batch = requestConfig.data.batch.map((item) => {
const urlParts = url_1.default.parse(item.relativeUrl, true);

@@ -135,3 +128,3 @@ let accessToken = get_1.default(urlParts, 'query.access_token');

}
const urlParts = url_1.default.parse(config.url || '', true);
const urlParts = url_1.default.parse(requestConfig.url || '', true);
const accessToken = get_1.default(urlParts, 'query.access_token', this.accessToken);

@@ -143,6 +136,6 @@ const appSecretProof = crypto_1.default

// eslint-disable-next-line no-param-reassign
config.url = append_query_1.default(config.url || '', {
requestConfig.url = append_query_1.default(requestConfig.url || '', {
appsecret_proof: appSecretProof,
});
return config;
return requestConfig;
});

@@ -154,5 +147,5 @@ }

*/
static connect(accessTokenOrConfig, version = '6.0') {
static connect(config) {
warning_1.default(false, '`MessengerClient.connect(...)` is deprecated. Use `new MessengerClient(...)` instead.');
return new MessengerClient(accessTokenOrConfig, version);
return new MessengerClient(config);
}

@@ -162,8 +155,13 @@ /**

*
* https://developers.facebook.com/docs/graph-api/using-graph-api
* https://developers.facebook.com/docs/graph-api/reference/page/
* id, name
*/
getPageInfo({ accessToken: customAccessToken, } = {}) {
getPageInfo({ fields, accessToken: customAccessToken, } = {}) {
return this.axios
.get(`/me?access_token=${customAccessToken || this.accessToken}`)
.get('/me', {
params: {
access_token: customAccessToken || this.accessToken,
fields: fields ? fields.join(',') : undefined,
},
})
.then((res) => res.data, handleError);

@@ -653,3 +651,3 @@ }

*/
sendBatch(batch, { accessToken: customAccessToken } = {}) {
sendBatch(batch, { includeHeaders = true, accessToken: customAccessToken, } = {}) {
ts_invariant_1.default(batch.length <= 50, 'limit the number of requests which can be in a batch to 50');

@@ -674,2 +672,3 @@ const responseAccessPaths = batch.map((item) => item.responseAccessPath);

accessToken: customAccessToken || this.accessToken,
includeHeaders,
batch: bodyEncodedbatch,

@@ -676,0 +675,0 @@ })

@@ -387,2 +387,3 @@ /// <reference types="node" />

dependsOn?: string;
omitResponseOnSuccess?: boolean;
};

@@ -389,0 +390,0 @@ export declare type Model = 'CUSTOM' | 'CHINESE' | 'CROATIAN' | 'DANISH' | 'DUTCH' | 'ENGLISH' | 'FRENCH_STANDARD' | 'GERMAN_STANDARD' | 'HEBREW' | 'HUNGARIAN' | 'IRISH' | 'ITALIAN_STANDARD' | 'KOREAN' | 'NORWEGIAN_BOKMAL' | 'POLISH' | 'PORTUGUESE' | 'ROMANIAN' | 'SPANISH' | 'SWEDISH' | 'VIETNAMESE';

@@ -9,3 +9,3 @@ {

},
"version": "1.0.0-beta.31",
"version": "1.0.0-beta.33",
"main": "dist/index.js",

@@ -36,3 +36,3 @@ "browser": "lib/browser.js",

},
"gitHead": "ddc04126fec6d8e8815ca85a54750ea74e6d8f16"
"gitHead": "a3f7afb4cef3784c3459f6be0810e0518b1bb384"
}

@@ -48,2 +48,3 @@ import MessengerBatch from '../MessengerBatch';

dependsOn: 'first',
omitResponseOnSuccess: false,
}

@@ -65,2 +66,3 @@ )

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -226,2 +228,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
}

@@ -243,2 +246,3 @@ )

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1151,2 +1155,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1158,2 +1163,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1188,2 +1194,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1195,2 +1202,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1367,2 +1375,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
}

@@ -1396,2 +1405,3 @@ )

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1425,2 +1435,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1432,2 +1443,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1457,2 +1469,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1470,2 +1483,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1548,2 +1562,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
}

@@ -1561,2 +1576,3 @@ )

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1601,2 +1617,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1612,2 +1629,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1636,2 +1654,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1647,2 +1666,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1666,2 +1686,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1674,2 +1695,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1695,2 +1717,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1705,2 +1728,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1726,2 +1750,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1736,2 +1761,3 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});

@@ -1754,2 +1780,3 @@ });

dependsOn: 'first',
omitResponseOnSuccess: false,
})

@@ -1761,4 +1788,5 @@ ).toEqual({

dependsOn: 'first',
omitResponseOnSuccess: false,
});
});
});

@@ -22,20 +22,2 @@ import MockAdapter from 'axios-mock-adapter';

describe('create axios with default graphAPI version', () => {
it('with args', () => {
axios.create = jest.fn().mockReturnValue({
interceptors: {
request: {
use: jest.fn(),
},
},
});
MessengerClient.connect(ACCESS_TOKEN);
expect(axios.create).toBeCalledWith(
expect.objectContaining({
baseURL: 'https://graph.facebook.com/v6.0/',
headers: { 'Content-Type': 'application/json' },
})
);
});
it('with config', () => {

@@ -61,20 +43,2 @@ axios.create = jest.fn().mockReturnValue({

describe('create axios with custom graphAPI version', () => {
it('with args', () => {
axios.create = jest.fn().mockReturnValue({
interceptors: {
request: {
use: jest.fn(),
},
},
});
MessengerClient.connect(ACCESS_TOKEN, '2.6');
expect(axios.create).toBeCalledWith(
expect.objectContaining({
baseURL: 'https://graph.facebook.com/v2.6/',
headers: { 'Content-Type': 'application/json' },
})
);
});
it('with config', () => {

@@ -123,20 +87,2 @@ axios.create = jest.fn().mockReturnValue({

describe('create axios with default graphAPI version', () => {
it('with args', () => {
axios.create = jest.fn().mockReturnValue({
interceptors: {
request: {
use: jest.fn(),
},
},
});
new MessengerClient(ACCESS_TOKEN); // eslint-disable-line no-new
expect(axios.create).toBeCalledWith(
expect.objectContaining({
baseURL: 'https://graph.facebook.com/v6.0/',
headers: { 'Content-Type': 'application/json' },
})
);
});
it('with config', () => {

@@ -162,20 +108,2 @@ axios.create = jest.fn().mockReturnValue({

describe('create axios with custom graphAPI version', () => {
it('with args', () => {
axios.create = jest.fn().mockReturnValue({
interceptors: {
request: {
use: jest.fn(),
},
},
});
new MessengerClient(ACCESS_TOKEN, '2.6'); // eslint-disable-line no-new
expect(axios.create).toBeCalledWith(
expect.objectContaining({
baseURL: 'https://graph.facebook.com/v2.6/',
headers: { 'Content-Type': 'application/json' },
})
);
});
it('with config', () => {

@@ -225,10 +153,2 @@ axios.create = jest.fn().mockReturnValue({

it('should return version of graph api', () => {
expect(new MessengerClient(ACCESS_TOKEN).version).toEqual('6.0');
expect(new MessengerClient(ACCESS_TOKEN, 'v2.6').version).toEqual('2.6');
expect(new MessengerClient(ACCESS_TOKEN, '2.6').version).toEqual('2.6');
expect(() => {
// eslint-disable-next-line no-new
new MessengerClient(ACCESS_TOKEN, 2.6);
}).toThrow('Type of `version` must be string.');
expect(new MessengerClient({ accessToken: ACCESS_TOKEN }).version).toEqual(

@@ -253,9 +173,4 @@ '6.0'

it('should return underlying http client', () => {
let client = new MessengerClient(ACCESS_TOKEN);
expect(client.axios.get).toBeDefined();
expect(client.axios.post).toBeDefined();
expect(client.axios.put).toBeDefined();
expect(client.axios.delete).toBeDefined();
const client = new MessengerClient({ accessToken: ACCESS_TOKEN });
client = new MessengerClient({ accessToken: ACCESS_TOKEN });
expect(client.axios.get).toBeDefined();

@@ -270,6 +185,4 @@ expect(client.axios.post).toBeDefined();

it('should return underlying access token', () => {
let client = new MessengerClient(ACCESS_TOKEN);
expect(client.accessToken).toBe(ACCESS_TOKEN);
const client = new MessengerClient({ accessToken: ACCESS_TOKEN });
client = new MessengerClient({ accessToken: ACCESS_TOKEN });
expect(client.accessToken).toBe(ACCESS_TOKEN);

@@ -423,2 +336,3 @@ });

access_token: ACCESS_TOKEN,
include_headers: true,
batch: [

@@ -425,0 +339,0 @@ {

@@ -20,3 +20,5 @@ import MockAdapter from 'axios-mock-adapter';

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
const client = new MessengerClient(ACCESS_TOKEN);
const client = new MessengerClient({
accessToken: ACCESS_TOKEN,
});
const mock = new MockAdapter(client.axios);

@@ -23,0 +25,0 @@ return { client, mock };

@@ -19,3 +19,5 @@ import MockAdapter from 'axios-mock-adapter';

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
const client = new MessengerClient(ACCESS_TOKEN);
const client = new MessengerClient({
accessToken: ACCESS_TOKEN,
});
const mock = new MockAdapter(client.axios);

@@ -22,0 +24,0 @@ return { client, mock };

@@ -19,3 +19,5 @@ import MockAdapter from 'axios-mock-adapter';

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
const client = new MessengerClient(ACCESS_TOKEN);
const client = new MessengerClient({
accessToken: ACCESS_TOKEN,
});
const mock = new MockAdapter(client.axios);

@@ -22,0 +24,0 @@ return { client, mock };

@@ -20,3 +20,5 @@ import MockAdapter from 'axios-mock-adapter';

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
const client = new MessengerClient(ACCESS_TOKEN);
const client = new MessengerClient({
accessToken: ACCESS_TOKEN,
});
const mock = new MockAdapter(client.axios);

@@ -23,0 +25,0 @@ return { client, mock };

@@ -25,3 +25,5 @@ import fs from 'fs';

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
const client = new MessengerClient(ACCESS_TOKEN);
const client = new MessengerClient({
accessToken: ACCESS_TOKEN,
});
const mock = new MockAdapter(client.axios);

@@ -1148,2 +1150,5 @@ return { client, mock };

code: 200,
headers: [
{ name: 'Content-Type', value: 'text/javascript; charset=UTF-8' },
],
body:

@@ -1169,2 +1174,3 @@ '{"recipient_id":"1QAZ2WSX","message_id":"mid.1489394984387:3dd22de509"}',

access_token: ACCESS_TOKEN,
include_headers: true,
batch: [

@@ -1182,2 +1188,5 @@ {

code: 200,
headers: [
{ name: 'Content-Type', value: 'text/javascript; charset=UTF-8' },
],
body: {

@@ -1191,2 +1200,49 @@ recipientId: USER_ID,

it('support the includeHeaders option', async () => {
const { client, mock } = createMock();
const reply = [
{
code: 200,
body:
'{"recipient_id":"1QAZ2WSX","message_id":"mid.1489394984387:3dd22de509"}',
},
];
const batch = [MessengerBatch.sendText(USER_ID, 'Hello')];
let url;
let data;
mock.onPost().reply((config) => {
url = config.url;
data = config.data;
return [200, reply];
});
const res = await client.sendBatch(batch, { includeHeaders: false });
expect(url).toEqual('/');
expect(JSON.parse(data)).toEqual({
access_token: ACCESS_TOKEN,
include_headers: false,
batch: [
{
method: 'POST',
relative_url: 'me/messages',
body: `messaging_type=UPDATE&recipient=%7B%22id%22%3A%22${USER_ID}%22%7D&message=%7B%22text%22%3A%22Hello%22%7D`,
},
],
});
expect(res).toEqual([
{
code: 200,
body: {
recipientId: USER_ID,
messageId: 'mid.1489394984387:3dd22de509',
},
},
]);
});
it('should get correct data according to responseAccessPath', async () => {

@@ -1198,2 +1254,5 @@ const { client, mock } = createMock();

code: 200,
headers: [
{ name: 'Content-Type', value: 'text/javascript; charset=UTF-8' },
],
body: '{"data":[{"thread_owner":{"app_id":"501514720355337"}}]}',

@@ -1218,2 +1277,3 @@ },

access_token: ACCESS_TOKEN,
include_headers: true,
batch: [

@@ -1230,2 +1290,5 @@ {

code: 200,
headers: [
{ name: 'Content-Type', value: 'text/javascript; charset=UTF-8' },
],
body: { appId: '501514720355337' },

@@ -1232,0 +1295,0 @@ },

@@ -20,3 +20,5 @@ import MockAdapter from 'axios-mock-adapter';

const createMock = (): { client: MessengerClient; mock: MockAdapter } => {
const client = new MessengerClient(ACCESS_TOKEN);
const client = new MessengerClient({
accessToken: ACCESS_TOKEN,
});
const mock = new MockAdapter(client.axios);

@@ -23,0 +25,0 @@ return { client, mock };

@@ -46,4 +46,6 @@ import fs from 'fs';

let url;
let params;
mock.onGet().reply((config) => {
url = config.url;
params = config.params;
return [200, reply];

@@ -54,3 +56,7 @@ });

expect(url).toEqual(`/me?access_token=${ACCESS_TOKEN}`);
expect(url).toEqual('/me');
expect(params).toEqual({
access_token: ACCESS_TOKEN,
fields: undefined,
});

@@ -60,2 +66,29 @@ expect(res).toEqual(reply);

});
it('should support fields', async () => {
const { client, mock } = createMock();
const reply = {
name: 'Bot Demo',
id: '1895382890692546',
};
let url;
let params;
mock.onGet().reply((config) => {
url = config.url;
params = config.params;
return [200, reply];
});
const res = await client.getPageInfo({
fields: ['id', 'name'],
});
expect(url).toEqual('/me');
expect(params).toEqual({
access_token: ACCESS_TOKEN,
fields: 'id,name',
});
expect(res).toEqual(reply);
});
});

@@ -62,0 +95,0 @@

@@ -11,2 +11,14 @@ import omit from 'lodash/omit';

function pickBatchOptions<T extends Types.BatchRequestOptions>(
options: T
): Pick<T, 'name' | 'dependsOn' | 'omitResponseOnSuccess'> {
return pick(options, ['name', 'dependsOn', 'omitResponseOnSuccess']);
}
function omitBatchOptions<T extends Types.BatchRequestOptions>(
options: T
): Omit<T, 'name' | 'dependsOn' | 'omitResponseOnSuccess'> {
return omit(options, ['name', 'dependsOn', 'omitResponseOnSuccess']);
}
function sendRequest(

@@ -42,3 +54,3 @@ body: object,

const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -50,3 +62,3 @@ return sendRequest(

message: Messenger.createMessage(msg, options),
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -266,3 +278,3 @@ batchRequestOptions

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -292,3 +304,3 @@ const fields = options.fields || [

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -311,3 +323,3 @@ return {

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -358,3 +370,3 @@ if (

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -382,3 +394,3 @@ return {

const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -389,3 +401,3 @@ return sendRequest(

senderAction,
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -423,3 +435,3 @@ batchRequestOptions

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -433,3 +445,3 @@ return {

metadata,
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -453,3 +465,3 @@ ...batchRequestOptions,

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -462,3 +474,3 @@ return {

metadata,
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -474,3 +486,3 @@ ...batchRequestOptions,

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -483,3 +495,3 @@ return {

metadata,
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -494,3 +506,3 @@ ...batchRequestOptions,

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -512,3 +524,3 @@ return {

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -520,3 +532,3 @@ return {

user: userId,
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -532,3 +544,3 @@ ...batchRequestOptions,

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -540,3 +552,3 @@ return {

user: userId,
...omitUndefinedFields(omit(options, ['name', 'dependsOn'])),
...omitUndefinedFields(omitBatchOptions(options)),
},

@@ -551,3 +563,3 @@ ...batchRequestOptions,

): Types.BatchItem {
const batchRequestOptions = pick(options, ['name', 'dependsOn']);
const batchRequestOptions = pickBatchOptions(options);

@@ -554,0 +566,0 @@ return {

@@ -46,5 +46,7 @@ import crypto from 'crypto';

if (err.response && err.response.data) {
const error = get(err, 'response.data.error', {});
const msg = `Messenger API - ${error.code} ${error.type} ${error.message}`;
throw new AxiosError(msg, err);
const error = get(err, 'response.data.error');
if (error) {
const msg = `Messenger API - ${error.code} ${error.type} ${error.message}`;
throw new AxiosError(msg, err);
}
}

@@ -58,6 +60,3 @@ throw new AxiosError(err.message, err);

*/
static connect(
accessTokenOrConfig: string | Types.ClientConfig,
version = '6.0'
): MessengerClient {
static connect(config: Types.ClientConfig): MessengerClient {
warning(

@@ -67,3 +66,3 @@ false,

);
return new MessengerClient(accessTokenOrConfig, version);
return new MessengerClient(config);
}

@@ -101,38 +100,25 @@

constructor(
accessTokenOrConfig: string | Types.ClientConfig,
version = '6.0'
) {
let origin;
let skipAppSecretProof;
if (accessTokenOrConfig && typeof accessTokenOrConfig === 'object') {
const config = accessTokenOrConfig;
constructor(config: Types.ClientConfig) {
invariant(
typeof config !== 'string',
`MessengerClient: do not allow constructing client with ${config} string. Use object instead.`
);
this.accessToken = config.accessToken;
invariant(
!config.version || typeof config.version === 'string',
'Type of `version` must be string.'
);
this.accessToken = config.accessToken;
invariant(
!config.version || typeof config.version === 'string',
'Type of `version` must be string.'
);
this.appId = config.appId;
this.appSecret = config.appSecret;
this.version = extractVersion(config.version || '6.0');
this.onRequest = config.onRequest;
origin = config.origin;
this.appId = config.appId;
this.appSecret = config.appSecret;
this.version = extractVersion(config.version || '6.0');
this.onRequest = config.onRequest;
const { origin } = config;
if (typeof config.skipAppSecretProof === 'boolean') {
skipAppSecretProof = config.skipAppSecretProof;
} else {
skipAppSecretProof = this.appSecret == null;
}
let skipAppSecretProof;
if (typeof config.skipAppSecretProof === 'boolean') {
skipAppSecretProof = config.skipAppSecretProof;
} else {
this.accessToken = accessTokenOrConfig;
invariant(
typeof version === 'string',
'Type of `version` must be string.'
);
this.version = extractVersion(version);
skipAppSecretProof = true;
skipAppSecretProof = this.appSecret == null;
}

@@ -175,41 +161,44 @@

this.axios.interceptors.request.use((config) => {
const isBatch = config.url === '/' && Array.isArray(config.data.batch);
this.axios.interceptors.request.use((requestConfig) => {
const isBatch =
requestConfig.url === '/' && Array.isArray(requestConfig.data.batch);
if (isBatch) {
// eslint-disable-next-line no-param-reassign
config.data.batch = config.data.batch.map((item: any) => {
const urlParts = url.parse(item.relativeUrl, true);
let accessToken = get(urlParts, 'query.access_token');
if (!accessToken && item.body) {
const entries = decodeURIComponent(item.body)
.split('&')
.map((pair) => pair.split('='));
requestConfig.data.batch = requestConfig.data.batch.map(
(item: any) => {
const urlParts = url.parse(item.relativeUrl, true);
let accessToken = get(urlParts, 'query.access_token');
if (!accessToken && item.body) {
const entries = decodeURIComponent(item.body)
.split('&')
.map((pair) => pair.split('='));
const accessTokenEntry = entries.find(
([key]) => key === 'access_token'
);
if (accessTokenEntry) {
accessToken = accessTokenEntry[1];
const accessTokenEntry = entries.find(
([key]) => key === 'access_token'
);
if (accessTokenEntry) {
accessToken = accessTokenEntry[1];
}
}
}
if (accessToken) {
const appSecretProof = crypto
.createHmac('sha256', appSecret)
.update(accessToken, 'utf8')
.digest('hex');
return {
...item,
relativeUrl: appendQuery(item.relativeUrl, {
appsecret_proof: appSecretProof,
}),
};
if (accessToken) {
const appSecretProof = crypto
.createHmac('sha256', appSecret)
.update(accessToken, 'utf8')
.digest('hex');
return {
...item,
relativeUrl: appendQuery(item.relativeUrl, {
appsecret_proof: appSecretProof,
}),
};
}
return item;
}
return item;
});
);
}
const urlParts = url.parse(config.url || '', true);
const urlParts = url.parse(requestConfig.url || '', true);
const accessToken = get(

@@ -227,7 +216,7 @@ urlParts,

// eslint-disable-next-line no-param-reassign
config.url = appendQuery(config.url || '', {
requestConfig.url = appendQuery(requestConfig.url || '', {
appsecret_proof: appSecretProof,
});
return config;
return requestConfig;
});

@@ -240,10 +229,18 @@ }

*
* https://developers.facebook.com/docs/graph-api/using-graph-api
* https://developers.facebook.com/docs/graph-api/reference/page/
* id, name
*/
getPageInfo({
fields,
accessToken: customAccessToken,
}: Types.AccessTokenOptions = {}): Promise<Types.PageInfo> {
}: Types.AccessTokenOptions & { fields?: string[] } = {}): Promise<
Types.PageInfo
> {
return this.axios
.get(`/me?access_token=${customAccessToken || this.accessToken}`)
.get('/me', {
params: {
access_token: customAccessToken || this.accessToken,
fields: fields ? fields.join(',') : undefined,
},
})
.then((res) => res.data, handleError);

@@ -1217,3 +1214,6 @@ }

batch: Types.BatchItem[],
{ accessToken: customAccessToken }: Types.AccessTokenOptions = {}
{
includeHeaders = true,
accessToken: customAccessToken,
}: Types.AccessTokenOptions & { includeHeaders?: boolean } = {}
): Promise<

@@ -1256,2 +1256,3 @@ {

accessToken: customAccessToken || this.accessToken,
includeHeaders,
batch: bodyEncodedbatch,

@@ -1258,0 +1259,0 @@ })

@@ -503,2 +503,3 @@ import fs from 'fs';

dependsOn?: string;
omitResponseOnSuccess?: boolean;
};

@@ -505,0 +506,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc