@plotday/tool-google-contacts 0.1.10 → 0.2.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/README.md +5 -5
- package/package.json +3 -3
- package/dist/google-contacts.d.ts +0 -21
- package/dist/google-contacts.d.ts.map +0 -1
- package/dist/google-contacts.js +0 -298
- package/dist/google-contacts.js.map +0 -1
- package/dist/index.d.ts +0 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -3
- package/dist/index.js.map +0 -1
- package/dist/types.d.ts +0 -18
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
package/README.md
CHANGED
|
@@ -13,21 +13,21 @@ npm install @plotday/tool-google-contacts @plotday/sdk
|
|
|
13
13
|
```typescript
|
|
14
14
|
import { Agent, Tools } from "@plotday/sdk";
|
|
15
15
|
import { GoogleContacts } from "@plotday/tool-google-contacts";
|
|
16
|
-
import {
|
|
16
|
+
import { Integrations, AuthLevel, AuthProvider } from "@plotday/sdk/tools/integrations";
|
|
17
17
|
|
|
18
18
|
export default class extends Agent {
|
|
19
19
|
private googleContacts: GoogleContacts;
|
|
20
|
-
private auth:
|
|
20
|
+
private auth: Integrations;
|
|
21
21
|
|
|
22
22
|
constructor(id: string, tools: Tools) {
|
|
23
23
|
super();
|
|
24
24
|
this.googleContacts = tools.get(GoogleContacts);
|
|
25
|
-
this.
|
|
25
|
+
this.integrations = tools.get(Integrations);
|
|
26
26
|
}
|
|
27
27
|
|
|
28
28
|
async activate(priority: { id: string }) {
|
|
29
29
|
// Request Google Contacts access
|
|
30
|
-
const authLink = await this.
|
|
30
|
+
const authLink = await this.integrations.request(
|
|
31
31
|
{
|
|
32
32
|
provider: AuthProvider.Google,
|
|
33
33
|
level: AuthLevel.User,
|
|
@@ -43,7 +43,7 @@ export default class extends Agent {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
async onAuthComplete(authorization: any, context: any) {
|
|
46
|
-
const authToken = await this.
|
|
46
|
+
const authToken = await this.integrations.get(authorization);
|
|
47
47
|
|
|
48
48
|
// Start syncing contacts
|
|
49
49
|
await this.googleContacts.startSync(authToken, "onContact");
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"description": "Sync with Google Contacts",
|
|
5
5
|
"author": "Plot <team@plot.day> (https://plot.day)",
|
|
6
6
|
"license": "MIT",
|
|
7
|
-
"version": "0.
|
|
7
|
+
"version": "0.2.0",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"main": "./dist/index.js",
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"LICENSE"
|
|
21
21
|
],
|
|
22
22
|
"dependencies": {
|
|
23
|
-
"@plotday/sdk": "^0.
|
|
23
|
+
"@plotday/sdk": "^0.17.0"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"typescript": "^5.9.3"
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"access": "public"
|
|
46
46
|
},
|
|
47
47
|
"scripts": {
|
|
48
|
-
"build": "tsc
|
|
48
|
+
"build": "tsc",
|
|
49
49
|
"clean": "rm -rf dist"
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Tool, type Tools } from "@plotday/sdk";
|
|
2
|
-
import type { Contact, GoogleContacts } from "./types";
|
|
3
|
-
export default class extends Tool implements GoogleContacts {
|
|
4
|
-
protected tools: Tools;
|
|
5
|
-
static readonly id = "google-contacts";
|
|
6
|
-
private auth;
|
|
7
|
-
constructor(id: string, tools: Tools);
|
|
8
|
-
requestAuth(callbackFunctionName: string, callbackContext?: any): Promise<any>;
|
|
9
|
-
getContacts(authToken: string): Promise<Contact[]>;
|
|
10
|
-
startSync(authToken: string, callbackFunctionName: string, options?: {
|
|
11
|
-
context?: any;
|
|
12
|
-
}): Promise<void>;
|
|
13
|
-
stopSync(authToken: string): Promise<void>;
|
|
14
|
-
syncBatch(context: {
|
|
15
|
-
batchNumber: number;
|
|
16
|
-
authToken: string;
|
|
17
|
-
}): Promise<void>;
|
|
18
|
-
private processContacts;
|
|
19
|
-
onAuthSuccess(authResult: any, context: any): Promise<void>;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=google-contacts.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-contacts.d.ts","sourceRoot":"","sources":["../src/google-contacts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,KAAK,EAAE,MAAM,cAAc,CAAC;AAShD,OAAO,KAAK,EAAE,OAAO,EAAe,cAAc,EAAE,MAAM,SAAS,CAAC;AA4OpE,MAAM,CAAC,OAAO,MAAO,SAAQ,IAAK,YAAW,cAAc;IAKjC,SAAS,CAAC,KAAK,EAAE,KAAK;IAJ9C,MAAM,CAAC,QAAQ,CAAC,EAAE,qBAAqB;IAEvC,OAAO,CAAC,IAAI,CAAO;gBAEP,EAAE,EAAE,MAAM,EAAY,KAAK,EAAE,KAAK;IAKxC,WAAW,CACf,oBAAoB,EAAE,MAAM,EAC5B,eAAe,CAAC,EAAE,GAAG,GACpB,OAAO,CAAC,GAAG,CAAC;IAiCT,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAkBlD,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,oBAAoB,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,GACA,OAAO,CAAC,IAAI,CAAC;IAgCV,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1C,SAAS,CAAC,OAAO,EAAE;QACvB,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;KACnB,GAAG,OAAO,CAAC,IAAI,CAAC;YAsDH,eAAe;IAYvB,aAAa,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;CA4BlE"}
|
package/dist/google-contacts.js
DELETED
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
import { Tool } from "@plotday/sdk";
|
|
2
|
-
import { Auth, AuthLevel, AuthProvider, } from "@plotday/sdk/tools/auth";
|
|
3
|
-
class GoogleApi {
|
|
4
|
-
accessToken;
|
|
5
|
-
constructor(accessToken) {
|
|
6
|
-
this.accessToken = accessToken;
|
|
7
|
-
}
|
|
8
|
-
async call(method, url, params, body) {
|
|
9
|
-
const query = params ? `?${new URLSearchParams(params)}` : "";
|
|
10
|
-
const headers = {
|
|
11
|
-
Authorization: `Bearer ${this.accessToken}`,
|
|
12
|
-
Accept: "application/json",
|
|
13
|
-
...(body ? { "Content-Type": "application/json" } : {}),
|
|
14
|
-
};
|
|
15
|
-
const response = await fetch(url + query, {
|
|
16
|
-
method,
|
|
17
|
-
headers,
|
|
18
|
-
...(body ? { body: JSON.stringify(body) } : {}),
|
|
19
|
-
});
|
|
20
|
-
switch (response.status) {
|
|
21
|
-
case 400:
|
|
22
|
-
const responseBody = await response.json();
|
|
23
|
-
if (responseBody.status === "FAILED_PRECONDITION") {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
throw new Error("Invalid request", { cause: responseBody });
|
|
27
|
-
case 401:
|
|
28
|
-
throw new Error("Authentication failed - token may be expired");
|
|
29
|
-
case 410:
|
|
30
|
-
return null;
|
|
31
|
-
case 200:
|
|
32
|
-
return await response.json();
|
|
33
|
-
default:
|
|
34
|
-
throw new Error(await response.text());
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
function parseContact(contact) {
|
|
39
|
-
const name = contact.names?.[0]?.displayName;
|
|
40
|
-
const avatar = contact.photos?.filter((p) => !p.default && p.metadata?.primary)?.[0]?.url;
|
|
41
|
-
return { name, avatar };
|
|
42
|
-
}
|
|
43
|
-
async function getGoogleContacts(api, scopes, state) {
|
|
44
|
-
let tokens = JSON.parse(state.state ?? "{}");
|
|
45
|
-
const contacts = {};
|
|
46
|
-
let more = false;
|
|
47
|
-
if (!state.more || tokens.connections?.nextPageToken) {
|
|
48
|
-
if (scopes?.some?.((scope) => scope === "https://www.googleapis.com/auth/contacts.readonly")) {
|
|
49
|
-
let response;
|
|
50
|
-
while (true) {
|
|
51
|
-
response = (await api.call("GET", "https://people.googleapis.com/v1/people/me/connections", {
|
|
52
|
-
requestSyncToken: true,
|
|
53
|
-
...(tokens.connections?.nextPageToken
|
|
54
|
-
? {
|
|
55
|
-
pageToken: tokens.connections?.nextPageToken,
|
|
56
|
-
}
|
|
57
|
-
: tokens.connections?.nextSyncToken
|
|
58
|
-
? {
|
|
59
|
-
syncToken: tokens.connections?.nextSyncToken,
|
|
60
|
-
}
|
|
61
|
-
: {}),
|
|
62
|
-
personFields: "names,emailAddresses,photos",
|
|
63
|
-
}));
|
|
64
|
-
if (response !== null)
|
|
65
|
-
break;
|
|
66
|
-
if (!tokens.connections)
|
|
67
|
-
break;
|
|
68
|
-
tokens.connections = undefined;
|
|
69
|
-
continue;
|
|
70
|
-
}
|
|
71
|
-
if (response) {
|
|
72
|
-
for (const c of response.connections ?? []) {
|
|
73
|
-
for (const e of c.emailAddresses ?? []) {
|
|
74
|
-
if (!e.value)
|
|
75
|
-
continue;
|
|
76
|
-
const { name, avatar } = parseContact(c);
|
|
77
|
-
contacts[e.value] = {
|
|
78
|
-
...contacts[e.value],
|
|
79
|
-
email: e.value,
|
|
80
|
-
...(name ? { name } : {}),
|
|
81
|
-
...(avatar ? { avatar } : {}),
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
more = true;
|
|
86
|
-
tokens = {
|
|
87
|
-
...tokens,
|
|
88
|
-
connections: {
|
|
89
|
-
nextPageToken: response.nextPageToken ?? undefined,
|
|
90
|
-
nextSyncToken: response.nextSyncToken ?? undefined,
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
else {
|
|
96
|
-
more = true;
|
|
97
|
-
tokens = {
|
|
98
|
-
...tokens,
|
|
99
|
-
connections: {},
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
else {
|
|
104
|
-
if (scopes?.some?.((scope) => scope === "https://www.googleapis.com/auth/contacts.other.readonly")) {
|
|
105
|
-
let response;
|
|
106
|
-
while (true) {
|
|
107
|
-
response = (await api.call("GET", "https://people.googleapis.com/v1/otherContacts", {
|
|
108
|
-
requestSyncToken: true,
|
|
109
|
-
...(tokens.other?.nextPageToken
|
|
110
|
-
? {
|
|
111
|
-
pageToken: tokens.other?.nextPageToken,
|
|
112
|
-
}
|
|
113
|
-
: tokens.other?.nextSyncToken
|
|
114
|
-
? {
|
|
115
|
-
syncToken: tokens.other?.nextSyncToken,
|
|
116
|
-
}
|
|
117
|
-
: {}),
|
|
118
|
-
readMask: "names,emailAddresses,photos",
|
|
119
|
-
}));
|
|
120
|
-
if (response !== null)
|
|
121
|
-
break;
|
|
122
|
-
if (!tokens.other)
|
|
123
|
-
break;
|
|
124
|
-
tokens.other = undefined;
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
if (response) {
|
|
128
|
-
for (const c of response.otherContacts ?? []) {
|
|
129
|
-
for (const e of c.emailAddresses ?? []) {
|
|
130
|
-
if (!e.value)
|
|
131
|
-
continue;
|
|
132
|
-
const { name, avatar } = parseContact(c);
|
|
133
|
-
contacts[e.value] = {
|
|
134
|
-
...contacts[e.value],
|
|
135
|
-
email: e.value,
|
|
136
|
-
...(name ? { name } : {}),
|
|
137
|
-
...(avatar ? { avatar } : {}),
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
more = !!response.nextPageToken;
|
|
142
|
-
tokens = {
|
|
143
|
-
...tokens,
|
|
144
|
-
other: {
|
|
145
|
-
nextPageToken: response.nextPageToken ?? undefined,
|
|
146
|
-
nextSyncToken: response.nextSyncToken ?? undefined,
|
|
147
|
-
},
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
else {
|
|
152
|
-
more = false;
|
|
153
|
-
tokens = {
|
|
154
|
-
...tokens,
|
|
155
|
-
other: {},
|
|
156
|
-
};
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
return {
|
|
160
|
-
contacts: Object.values(contacts),
|
|
161
|
-
state: {
|
|
162
|
-
more,
|
|
163
|
-
state: JSON.stringify(tokens),
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
export default class default_1 extends Tool {
|
|
168
|
-
tools;
|
|
169
|
-
static id = "google-contacts";
|
|
170
|
-
auth;
|
|
171
|
-
constructor(id, tools) {
|
|
172
|
-
super(id, tools);
|
|
173
|
-
this.tools = tools;
|
|
174
|
-
this.auth = tools.get(Auth);
|
|
175
|
-
}
|
|
176
|
-
async requestAuth(callbackFunctionName, callbackContext) {
|
|
177
|
-
const contactsScopes = [
|
|
178
|
-
"https://www.googleapis.com/auth/contacts.readonly",
|
|
179
|
-
"https://www.googleapis.com/auth/contacts.other.readonly",
|
|
180
|
-
];
|
|
181
|
-
// Generate opaque token for this authorization
|
|
182
|
-
const opaqueToken = crypto.randomUUID();
|
|
183
|
-
// Register the callback for auth completion with opaque token
|
|
184
|
-
const callbackToken = await this.callback(callbackFunctionName, callbackContext);
|
|
185
|
-
await this.set(`auth_callback_token:${opaqueToken}`, callbackToken);
|
|
186
|
-
// Create callback for auth completion
|
|
187
|
-
const authCallback = await this.callback("onAuthSuccess", {
|
|
188
|
-
toolName: "google-contacts",
|
|
189
|
-
opaqueToken,
|
|
190
|
-
});
|
|
191
|
-
// Request auth and return the activity link
|
|
192
|
-
return await this.auth.request({
|
|
193
|
-
provider: AuthProvider.Google,
|
|
194
|
-
level: AuthLevel.User,
|
|
195
|
-
scopes: contactsScopes,
|
|
196
|
-
}, authCallback);
|
|
197
|
-
}
|
|
198
|
-
async getContacts(authToken) {
|
|
199
|
-
const storedAuthToken = await this.get(`auth_token:${authToken}`);
|
|
200
|
-
if (!storedAuthToken) {
|
|
201
|
-
throw new Error("No Google authentication token available for the provided authToken");
|
|
202
|
-
}
|
|
203
|
-
const api = new GoogleApi(storedAuthToken.token);
|
|
204
|
-
const result = await getGoogleContacts(api, storedAuthToken.scopes, {
|
|
205
|
-
more: false,
|
|
206
|
-
});
|
|
207
|
-
return result.contacts;
|
|
208
|
-
}
|
|
209
|
-
async startSync(authToken, callbackFunctionName, options) {
|
|
210
|
-
const storedAuthToken = await this.get(`auth_token:${authToken}`);
|
|
211
|
-
if (!storedAuthToken) {
|
|
212
|
-
throw new Error("No Google authentication token available for the provided authToken");
|
|
213
|
-
}
|
|
214
|
-
// Register the callback
|
|
215
|
-
const callbackToken = await this.callback(callbackFunctionName, options?.context);
|
|
216
|
-
await this.set(`contacts_callback_token:${authToken}`, callbackToken);
|
|
217
|
-
// Start initial sync
|
|
218
|
-
const initialState = {
|
|
219
|
-
more: false,
|
|
220
|
-
};
|
|
221
|
-
await this.set(`sync_state:${authToken}`, initialState);
|
|
222
|
-
// Start sync batch using run tool for long-running operation
|
|
223
|
-
const callback = await this.callback("syncBatch", {
|
|
224
|
-
batchNumber: 1,
|
|
225
|
-
authToken,
|
|
226
|
-
});
|
|
227
|
-
await this.run(callback);
|
|
228
|
-
}
|
|
229
|
-
async stopSync(authToken) {
|
|
230
|
-
// Clear sync state for this specific auth token
|
|
231
|
-
await this.clear(`sync_state:${authToken}`);
|
|
232
|
-
await this.clear(`contacts_callback_token:${authToken}`);
|
|
233
|
-
}
|
|
234
|
-
async syncBatch(context) {
|
|
235
|
-
const { batchNumber, authToken } = context;
|
|
236
|
-
console.log(`Starting Google Contacts sync batch ${batchNumber}`);
|
|
237
|
-
try {
|
|
238
|
-
const storedAuthToken = await this.get(`auth_token:${authToken}`);
|
|
239
|
-
if (!storedAuthToken) {
|
|
240
|
-
throw new Error("No authentication token available for the provided authToken");
|
|
241
|
-
}
|
|
242
|
-
const state = await this.get(`sync_state:${authToken}`);
|
|
243
|
-
if (!state) {
|
|
244
|
-
throw new Error("No sync state found");
|
|
245
|
-
}
|
|
246
|
-
const api = new GoogleApi(storedAuthToken.token);
|
|
247
|
-
const result = await getGoogleContacts(api, storedAuthToken.scopes, state);
|
|
248
|
-
if (result.contacts.length > 0) {
|
|
249
|
-
await this.processContacts(result.contacts, authToken);
|
|
250
|
-
console.log(`Synced ${result.contacts.length} contacts in batch ${batchNumber}`);
|
|
251
|
-
}
|
|
252
|
-
await this.set(`sync_state:${authToken}`, result.state);
|
|
253
|
-
if (result.state.more) {
|
|
254
|
-
const callback = await this.callback("syncBatch", {
|
|
255
|
-
batchNumber: batchNumber + 1,
|
|
256
|
-
authToken,
|
|
257
|
-
});
|
|
258
|
-
await this.run(callback);
|
|
259
|
-
}
|
|
260
|
-
else {
|
|
261
|
-
console.log(`Google Contacts sync completed after ${batchNumber} batches`);
|
|
262
|
-
await this.clear(`sync_state:${authToken}`);
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
catch (error) {
|
|
266
|
-
console.error(`Error in sync batch ${batchNumber}:`, error);
|
|
267
|
-
throw error;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
async processContacts(contacts, authToken) {
|
|
271
|
-
const callbackToken = await this.get(`contacts_callback_token:${authToken}`);
|
|
272
|
-
if (callbackToken) {
|
|
273
|
-
await this.callCallback(callbackToken, contacts);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
async onAuthSuccess(authResult, context) {
|
|
277
|
-
console.log("Google Contacts authentication successful", authResult);
|
|
278
|
-
// Extract opaque token from context
|
|
279
|
-
const opaqueToken = context?.opaqueToken;
|
|
280
|
-
if (!opaqueToken) {
|
|
281
|
-
console.error("No opaque token found in auth context");
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
// Store the actual auth token using opaque token as key
|
|
285
|
-
await this.set(`auth_token:${opaqueToken}`, authResult);
|
|
286
|
-
// Retrieve and call the stored callback
|
|
287
|
-
const callbackToken = await this.get(`auth_callback_token:${opaqueToken}`);
|
|
288
|
-
if (callbackToken) {
|
|
289
|
-
const authSuccessResult = {
|
|
290
|
-
authToken: opaqueToken,
|
|
291
|
-
};
|
|
292
|
-
await this.callCallback(callbackToken, authSuccessResult);
|
|
293
|
-
// Clean up the callback token
|
|
294
|
-
await this.clear(`auth_callback_token:${opaqueToken}`);
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
//# sourceMappingURL=google-contacts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"google-contacts.js","sourceRoot":"","sources":["../src/google-contacts.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
package/dist/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
DELETED
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/types.d.ts
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ActivityLink, Tool } from "@plotday/sdk";
|
|
2
|
-
export type Contact = {
|
|
3
|
-
email: string;
|
|
4
|
-
name?: string;
|
|
5
|
-
avatar?: string;
|
|
6
|
-
};
|
|
7
|
-
export type ContactAuth = {
|
|
8
|
-
authToken: string;
|
|
9
|
-
};
|
|
10
|
-
export interface GoogleContacts extends Tool {
|
|
11
|
-
requestAuth(callbackFunctionName: string, callbackContext?: any): Promise<ActivityLink>;
|
|
12
|
-
getContacts(authToken: string): Promise<Contact[]>;
|
|
13
|
-
startSync(authToken: string, callbackFunctionName: string, options?: {
|
|
14
|
-
context?: any;
|
|
15
|
-
}): Promise<void>;
|
|
16
|
-
stopSync(authToken: string): Promise<void>;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,WAAW,cAAe,SAAQ,IAAI;IAC1C,WAAW,CACT,oBAAoB,EAAE,MAAM,EAC5B,eAAe,CAAC,EAAE,GAAG,GACpB,OAAO,CAAC,YAAY,CAAC,CAAC;IAEzB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAEnD,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,oBAAoB,EAAE,MAAM,EAC5B,OAAO,CAAC,EAAE;QACR,OAAO,CAAC,EAAE,GAAG,CAAC;KACf,GACA,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C"}
|
package/dist/types.js
DELETED
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|