Skip to content

Commit 1d25555

Browse files
authored
Add callable HTTPS functions (#195)
1 parent 35f4820 commit 1d25555

File tree

9 files changed

+984
-6
lines changed

9 files changed

+984
-6
lines changed

changelog.txt

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
feature - Adds HTTPS Callable Functions, a kind of HTTPS trigger that can be called from a Firebase client SDK.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import * as functions from 'firebase-functions';
2+
import { TestSuite, expectEq } from './testing';
3+
4+
export const callableTests: any = functions.https.onCall((data, context) => {
5+
return new TestSuite('https onCall')
6+
.it('should have the correct data', event => expectEq(event.data.foo, 'bar'))
7+
.run(data.testId, { data: data, context: context });
8+
});

integration_test/functions/src/index.ts

+26
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as functions from 'firebase-functions';
22
import * as firebase from 'firebase';
3+
import * as https from 'https';
34
import * as admin from 'firebase-admin';
45
import * as _ from 'lodash';
56
import { Request, Response } from 'express';
@@ -8,11 +9,33 @@ export * from './pubsub-tests';
89
export * from './database-tests';
910
export * from './auth-tests';
1011
export * from './firestore-tests';
12+
export * from './https-tests';
1113
const numTests = Object.keys(exports).length; // Assumption: every exported function is its own test.
1214

1315
firebase.initializeApp(_.omit(functions.config().firebase, 'credential')); // Explicitly decline admin privileges.
1416
admin.initializeApp(functions.config().firebase);
1517

18+
// TODO(klimt): Get rid of this once the JS client SDK supports callable triggers.
19+
function callHttpsTrigger(name: string, data: any) {
20+
return new Promise((resolve, reject) => {
21+
const request = https.request({
22+
method: 'POST',
23+
host: 'us-central1-' + functions.config().firebase.projectId + '.cloudfunctions.net',
24+
path: '/' + name,
25+
headers: {
26+
'Content-Type': 'application/json',
27+
},
28+
}, (response) => {
29+
let body = '';
30+
response.on('data', (chunk) => { body += chunk; });
31+
response.on('end', () => resolve(body));
32+
});
33+
request.on('error', reject);
34+
request.write(JSON.stringify({data}));
35+
request.end();
36+
});
37+
}
38+
1639
export const integrationTests: any = functions.https.onRequest((req: Request, resp: Response) => {
1740
let pubsub: any = require('@google-cloud/pubsub')();
1841

@@ -35,6 +58,9 @@ export const integrationTests: any = functions.https.onRequest((req: Request, re
3558
}),
3659
// A firestore write to trigger the Cloud Firestore tests.
3760
admin.firestore().collection('tests').doc(testId).set({test: testId}),
61+
// Invoke a callable HTTPS trigger.
62+
callHttpsTrigger('callableTests', {foo: 'bar', testId}),
63+
3864
]).then(() => {
3965
// On test completion, check that all tests pass and reply "PASS", or provide further details.
4066
console.log('Waiting for all tests to report they pass...');

package.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
"istanbul": "^0.4.2",
4343
"mocha": "^2.4.5",
4444
"mock-require": "^2.0.1",
45-
"nock": "^8.0.0",
45+
"nock": "^9.0.0",
4646
"sinon": "^1.17.4",
4747
"tslint": "^3.15.1",
4848
"typescript": "^2.0.3"
@@ -51,10 +51,12 @@
5151
"firebase-admin": "~5.10.0"
5252
},
5353
"dependencies": {
54+
"@types/cors": "^2.8.1",
5455
"@types/express": "^4.0.33",
5556
"@types/jsonwebtoken": "^7.1.32",
5657
"@types/lodash": "^4.14.34",
5758
"@types/sha1": "^1.1.0",
59+
"cors": "^2.8.4",
5860
"express": "^4.0.33",
5961
"jsonwebtoken": "^7.1.9",
6062
"lodash": "^4.6.1",

spec/fixtures/credential/key.d.ts

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
/* tslint:disable */
2+
declare module "*key.json" {
3+
const type: string;
4+
const user_id: string;
5+
const project_id: string;
6+
const key_id: string;
7+
const private_key: string;
8+
const public_key: string;
9+
const client_email: string;
10+
}

spec/fixtures/credential/key.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
{
22
"type": "service_account",
33
"project_id": "project_id",
4-
"private_key_id": "aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd",
4+
"user_id": "SomeUID",
5+
"key_id": "THIS_IS_A_KID",
56
"private_key": "-----BEGIN RSA PRIVATE KEY-----\nMIIEpAIBAAKCAQEAwJENcRev+eXZKvhhWLiV3Lz2MvO+naQRHo59g3vaNQnbgyduN/L4krlr\nJ5c6FiikXdtJNb/QrsAHSyJWCu8j3T9CruiwbidGAk2W0RuViTVspjHUTsIHExx9euWM0Uom\nGvYkoqXahdhPL/zViVSJt+Rt8bHLsMvpb8RquTIb9iKY3SMV2tCofNmyCSgVbghq/y7lKORt\nV/IRguWs6R22fbkb0r2MCYoNAbZ9dqnbRIFNZBC7itYtUoTEresRWcyFMh0zfAIJycWOJlVL\nDLqkY2SmIx8u7fuysCg1wcoSZoStuDq02nZEMw1dx8HGzE0hynpHlloRLByuIuOAfMCCYwID\nAQABAoIBADFtihu7TspAO0wSUTpqttzgC/nsIsNn95T2UjVLtyjiDNxPZLUrwq42tdCFur0x\nVW9Z+CK5x6DzXWvltlw8IeKKeF1ZEOBVaFzy+YFXKTz835SROcO1fgdjyrme7lRSShGlmKW/\nGKY+baUNquoDLw5qreXaE0SgMp0jt5ktyYuVxvhLDeV4omw2u6waoGkifsGm8lYivg5l3VR7\nw2IVOvYZTt4BuSYVwOM+qjwaS1vtL7gv0SUjrj85Ja6zERRdFiITDhZw6nsvacr9/+/aut9E\naL/koSSb62g5fntQMEwoT4hRnjPnAedmorM9Rhddh2TB3ZKTBbMN1tUk3fJxOuECgYEA+z6l\neSaAcZ3qvwpntcXSpwwJ0SSmzLTH2RJNf+Ld3eBHiSvLTG53dWB7lJtF4R1KcIwf+KGcOFJv\nsnepzcZBylRvT8RrAAkV0s9OiVm1lXZyaepbLg4GGFJBPi8A6VIAj7zYknToRApdW0s1x/XX\nChewfJDckqsevTMovdbg8YkCgYEAxDYX+3mfvv/opo6HNNY3SfVunM+4vVJL+n8gWZ2w9kz3\nQ9Ub9YbRmI7iQaiVkO5xNuoG1n9bM+3Mnm84aQ1YeNT01YqeyQsipP5Wi+um0PzYTaBw9RO+\n8Gh6992OwlJiRtFk5WjalNWOxY4MU0ImnJwIfKQlUODvLmcixm68NYsCgYEAuAqI3jkk55Vd\nKvotREsX5wP7gPePM+7NYiZ1HNQL4Ab1f/bTojZdTV8Sx6YCR0fUiqMqnE+OBvfkGGBtw22S\nLesx6sWf99Ov58+x4Q0U5dpxL0Lb7d2Z+2Dtp+Z4jXFjNeeI4ae/qG/LOR/b0pE0J5F415ap\n7Mpq5v89vepUtrkCgYAjMXytu4v+q1Ikhc4UmRPDrUUQ1WVSd+9u19yKlnFGTFnRjej86hiw\nH3jPxBhHra0a53EgiilmsBGSnWpl1WH4EmJz5vBCKUAmjgQiBrueIqv9iHiaTNdjsanUyaWw\njyxXfXl2eI80QPXh02+8g1H/pzESgjK7Rg1AqnkfVH9nrwKBgQDJVxKBPTw9pigYMVt9iHrR\niCl9zQVjRMbWiPOc0J56+/5FZYm/AOGl9rfhQ9vGxXZYZiOP5FsNkwt05Y1UoAAH4B4VQwbL\nqod71qOcI0ywgZiIR87CYw40gzRfjWnN+YEEW1qfyoNLilEwJB8iB/T+ZePHGmJ4MmQ/cTn9\nxpdLXA==\n-----END RSA PRIVATE KEY-----\n",
7+
"public_key": "-----BEGIN RSA PUBLIC KEY-----\nMIIBCgKCAQEAwJENcRev+eXZKvhhWLiV3Lz2MvO+naQRHo59g3vaNQnbgyduN/L4krlrJ5c6\nFiikXdtJNb/QrsAHSyJWCu8j3T9CruiwbidGAk2W0RuViTVspjHUTsIHExx9euWM0UomGvYk\noqXahdhPL/zViVSJt+Rt8bHLsMvpb8RquTIb9iKY3SMV2tCofNmyCSgVbghq/y7lKORtV/IR\nguWs6R22fbkb0r2MCYoNAbZ9dqnbRIFNZBC7itYtUoTEresRWcyFMh0zfAIJycWOJlVLDLqk\nY2SmIx8u7fuysCg1wcoSZoStuDq02nZEMw1dx8HGzE0hynpHlloRLByuIuOAfMCCYwIDAQAB\n-----END RSA PUBLIC KEY-----\n",
68
"client_email": "foo@project_id.iam.gserviceaccount.com"
79
}

0 commit comments

Comments
 (0)