client lib integration changes

This commit is contained in:
Kelvin Jin 2018-03-14 13:15:38 -07:00
parent 68c4ca311a
commit 6c1f4bc621
6 changed files with 106 additions and 29 deletions

View File

@ -1 +1 @@
nodejs-*/
libs/nodejs-*/

View File

@ -3,11 +3,13 @@
npm install
for dir in $(node -p "require('./repositories.json').join('\n')"); do
pushd libs
if [ ! -d $dir ]; then
git clone https://github.com/googleapis/$dir
pushd $dir
npm install
popd
fi
pushd $dir
npm install
popd
node --require ./use-grpc-js.js $(npm bin)/_mocha --timeout 60000 $dir/system-test/*.js
SMOKE_TEST_PROJECT=$GCLOUD_PROJECT node --require ./use-grpc-js.js $(npm bin)/_mocha --timeout 60000 libs/$dir/system-test/*.js
done

View File

@ -3,6 +3,8 @@
"version": "0.0.1",
"description": "",
"dependencies": {
"dot-prop": "^4.2.0",
"google-proto-files": "^0.15.1",
"mocha": "^5.0.4",
"shimmer": "^1.2.0"
}

View File

@ -1,20 +1,14 @@
[
"nodejs-bigtable",
"nodejs-datastore",
"nodejs-language",
"nodejs-storage",
"nodejs-translate",
"nodejs-logging",
"nodejs-video-intelligence",
"nodejs-dlp",
"nodejs-firestore",
"nodejs-language",
"nodejs-logging",
"nodejs-monitoring",
"nodejs-pubsub",
"nodejs-spanner",
"nodejs-speech",
"nodejs-vision",
"nodejs-bigquery",
"nodejs-monitoring",
"nodejs-bigtable",
"nodejs-dns",
"nodejs-resource",
"nodejs-compute"
"nodejs-video-intelligence",
"nodejs-vision"
]

View File

@ -1,18 +1,97 @@
require('source-map-support/register');
const Module = require('module');
const shimmer = require('shimmer');
const grpcImpl = require('../../packages/grpc-js-core');
const grpcPJson = require('../../packages/grpc-js-core/package');
const grpcImpl = require('../../packages/grpc-js-core');
const grpcProtobuf = require('../../packages/grpc-protobufjs');
shimmer.wrap(Module, '_load', (moduleLoad) => {
return function Module_load(path, parent) {
if (path === 'grpc') {
return grpcImpl;
} else if (path.startsWith('grpc/package')) {
return grpcPJson;
} else {
const result = moduleLoad.apply(this, arguments);
return result;
}
};
});
if (!process.env.USE_GRPC_NATIVE) {
shimmer.wrap(Module, '_load', (moduleLoad) => {
return function Module_load(moduleName, parent) {
if (moduleName === 'grpc') {
// load grpc-js when grpc is requested.
return grpcImpl;
} else if (moduleName.startsWith('grpc/package')) {
// load grpc-js's package.json when grpc's package.json is requested.
return grpcPJson;
} else {
const result = moduleLoad.apply(this, arguments);
// monkeypatch google-gax and @google-cloud/common-grpc to avoid all
// references to grpc.load and grpc.loadObject, implementing functions
// on top of the new API for loading proto files.
if (moduleName === 'google-gax') {
if (!result.grpc.prototype.load.__wrapped) {
shimmer.wrap(result.grpc.prototype, 'load', (gaxLoad) => {
return function (filename, format, options) {
if (Array.isArray(filename)) {
options = filename[2];
filename = filename[0];
}
const packageDef = grpcProtobuf.loadSync(filename.file, {
keepCase: false,
defaults: true,
enums: String,
include: [filename.root]
});
return grpcImpl.loadPackageDefinition(packageDef);
}
});
}
if (!result.grpc.prototype.loadProto.__wrapped) {
shimmer.wrap(result.grpc.prototype, 'loadProto', (gaxLoadProto) => {
const path = require('path');
const googleProtoFilesDir = require('google-proto-files')('..');
return function (protoPath, filename) {
const packageDef = grpcProtobuf.loadSync(filename, {
keepCase: false,
defaults: true,
enums: String,
include: [protoPath, googleProtoFilesDir]
});
return grpcImpl.loadPackageDefinition(packageDef);
};
});
}
} else if (moduleName === '@google-cloud/common-grpc') {
if (!result.Service.prototype.loadProtoFile_.__wrapped) {
shimmer.wrap(result.Service.prototype, 'loadProtoFile_', (commonLoad) => {
const dotProp = require('dot-prop');
// loadProtoFile_ uses a module-scope cache of loaded proto
// objects which isn't referenced anywhere else
const protoObjectCache = {};
return function (protoConfig, config) {
if (typeof protoConfig === 'string') {
protoConfig = { path: protoConfig };
}
const protoObjectCacheKey = [
config.protosDir,
protoConfig.path,
protoConfig.service,
].join('$');
if (!protoObjectCache[protoObjectCacheKey]) {
const services = grpcProtobuf.loadSync(protoConfig.path, {
keepCase: false,
bytes: 'string',
defaults: true,
enums: String,
include: [config.protosDir]
});
const service = dotProp.get(services.google, protoConfig.service);
protoObjectCache[protoObjectCacheKey] = service;
}
return protoObjectCache[protoObjectCacheKey];
}
});
}
}
return result;
}
};
});
}