@contract-case/case-connector 0.29.0 → 0.30.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/CHANGELOG.md +38 -0
- package/README.md +19 -0
- package/dist/cjs/src/connectors/case-boundary/internals/BoundaryPluginLoader.cjs +16 -4
- package/dist/cjs/src/connectors/case-boundary/internals/BoundaryPluginLoader.d.ts.map +1 -1
- package/dist/cjs/src/connectors/case-boundary/internals/BoundaryPluginLoader.js.map +1 -1
- package/dist/cjs/src/connectors/case-boundary/internals/mappers/triggers.cjs +4 -1
- package/dist/cjs/src/connectors/case-boundary/internals/mappers/triggers.d.ts.map +1 -1
- package/dist/cjs/src/connectors/case-boundary/internals/mappers/triggers.js.map +1 -1
- package/dist/cjs/src/connectors/grpc/authTokenInterceptor.cjs +41 -0
- package/dist/cjs/src/connectors/grpc/authTokenInterceptor.d.cts +14 -0
- package/dist/cjs/src/connectors/grpc/authTokenInterceptor.d.ts.map +1 -0
- package/dist/cjs/src/connectors/grpc/authTokenInterceptor.js.map +1 -0
- package/dist/cjs/src/connectors/grpc/contract-case-stream.d.mts +7 -1
- package/dist/cjs/src/connectors/grpc/contract-case-stream.d.mts.map +1 -1
- package/dist/cjs/src/connectors/grpc/contract-case-stream.mjs +18 -3
- package/dist/cjs/src/connectors/grpc/contract-case-stream.mjs.map +1 -1
- package/dist/cjs/src/entities/versionString.cjs +1 -1
- package/dist/cjs/src/entities/versionString.d.cts +1 -1
- package/dist/cjs/tsconfig.56c70853.tsbuildinfo +1 -0
- package/dist/src/connectors/case-boundary/internals/BoundaryPluginLoader.d.ts.map +1 -1
- package/dist/src/connectors/case-boundary/internals/BoundaryPluginLoader.js +16 -4
- package/dist/src/connectors/case-boundary/internals/BoundaryPluginLoader.js.map +1 -1
- package/dist/src/connectors/case-boundary/internals/mappers/triggers.d.ts.map +1 -1
- package/dist/src/connectors/case-boundary/internals/mappers/triggers.js +4 -1
- package/dist/src/connectors/case-boundary/internals/mappers/triggers.js.map +1 -1
- package/dist/src/connectors/grpc/authTokenInterceptor.d.ts +14 -0
- package/dist/src/connectors/grpc/authTokenInterceptor.d.ts.map +1 -0
- package/dist/src/connectors/grpc/authTokenInterceptor.js +37 -0
- package/dist/src/connectors/grpc/authTokenInterceptor.js.map +1 -0
- package/dist/src/connectors/grpc/contract-case-stream.d.mts +7 -1
- package/dist/src/connectors/grpc/contract-case-stream.d.mts.map +1 -1
- package/dist/src/connectors/grpc/contract-case-stream.mjs +18 -3
- package/dist/src/connectors/grpc/contract-case-stream.mjs.map +1 -1
- package/dist/src/entities/versionString.d.ts +1 -1
- package/dist/src/entities/versionString.js +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package/case-connector.js +2 -2
- package/package/case-connector.js.LICENSE.txt +6 -0
- package/package/case-connector.js.map +1 -1
- package/package.json +10 -10
- package/src/connectors/grpc/contract-case-stream.mts +22 -4
- package/dist/cjs/tsconfig.d841374c.tsbuildinfo +0 -1
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ServerInterceptingCall, status, } from '@grpc/grpc-js';
|
|
2
|
+
import { createHash, timingSafeEqual } from 'node:crypto';
|
|
3
|
+
// Comparing hashes rather than the raw values keeps the comparison
|
|
4
|
+
// constant-time even when the provided token has a different length
|
|
5
|
+
const hashToken = (token) => createHash('sha256').update(token, 'utf8').digest();
|
|
6
|
+
/**
|
|
7
|
+
* Creates a server interceptor that rejects any call which doesn't present
|
|
8
|
+
* the expected token in its `authorization` metadata.
|
|
9
|
+
*
|
|
10
|
+
* The token is shared with the client that spawned this connector via the
|
|
11
|
+
* `CASE_CONNECTOR_TOKEN` environment variable, so only that client (or
|
|
12
|
+
* processes it chooses to share the token with) can invoke the connector.
|
|
13
|
+
*
|
|
14
|
+
* @param expectedToken - the token that callers must present
|
|
15
|
+
* @returns a {@link ServerInterceptor} enforcing the token
|
|
16
|
+
*/
|
|
17
|
+
export const makeAuthTokenInterceptor = (expectedToken) => (_methodDescriptor, call) => new ServerInterceptingCall(call, {
|
|
18
|
+
start: (next) => {
|
|
19
|
+
next({
|
|
20
|
+
onReceiveMetadata: (metadata, mdNext) => {
|
|
21
|
+
const provided = metadata.get('authorization');
|
|
22
|
+
if (provided.length === 1 &&
|
|
23
|
+
typeof provided[0] === 'string' &&
|
|
24
|
+
timingSafeEqual(hashToken(provided[0]), hashToken(expectedToken))) {
|
|
25
|
+
mdNext(metadata);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
call.sendStatus({
|
|
29
|
+
code: status.UNAUTHENTICATED,
|
|
30
|
+
details: "This ContractCase connector requires callers to present the token from the CASE_CONNECTOR_TOKEN environment variable in the 'authorization' metadata of each call",
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
});
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=authTokenInterceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authTokenInterceptor.js","sourceRoot":"","sources":["../../../../src/connectors/grpc/authTokenInterceptor.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,sBAAsB,EAEtB,MAAM,GACP,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,mEAAmE;AACnE,oEAAoE;AACpE,MAAM,SAAS,GAAG,CAAC,KAAa,EAAU,EAAE,CAC1C,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;AAEtD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,wBAAwB,GACnC,CAAC,aAAqB,EAAqB,EAAE,CAC7C,CAAC,iBAAiB,EAAE,IAAI,EAAE,EAAE,CAC1B,IAAI,sBAAsB,CAAC,IAAI,EAAE;IAC/B,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE;QACd,IAAI,CAAC;YACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBACtC,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;gBAC/C,IACE,QAAQ,CAAC,MAAM,KAAK,CAAC;oBACrB,OAAO,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ;oBAC/B,eAAe,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC,EACjE,CAAC;oBACD,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACnB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,UAAU,CAAC;wBACd,IAAI,EAAE,MAAM,CAAC,eAAe;wBAC5B,OAAO,EACL,mKAAmK;qBACtK,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
+
import { Server } from '@grpc/grpc-js';
|
|
1
2
|
/**
|
|
2
3
|
* Starts a gRPC server for defining and verifying ContractCase contracts
|
|
4
|
+
*
|
|
5
|
+
* @returns the running server and the port it is listening on
|
|
3
6
|
*/
|
|
4
|
-
export declare function main():
|
|
7
|
+
export declare function main(): Promise<{
|
|
8
|
+
server: Server;
|
|
9
|
+
port: string;
|
|
10
|
+
}>;
|
|
5
11
|
//# sourceMappingURL=contract-case-stream.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-case-stream.d.mts","sourceRoot":"","sources":["../../../../src/connectors/grpc/contract-case-stream.mts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"contract-case-stream.d.mts","sourceRoot":"","sources":["../../../../src/connectors/grpc/contract-case-stream.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAqB,MAAM,eAAe,CAAC;AAiC1D;;;;GAIG;AACH,wBAAgB,IAAI,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAiDhE"}
|
|
@@ -3,6 +3,7 @@ import { ContractCaseService } from '@contract-case/case-connector-proto';
|
|
|
3
3
|
import getPort from 'get-port';
|
|
4
4
|
import { contractDefinition } from './contractDefinition.js';
|
|
5
5
|
import { contractVerification } from './contractVerification.js';
|
|
6
|
+
import { makeAuthTokenInterceptor } from './authTokenInterceptor.js';
|
|
6
7
|
import { versionString } from '../../entities/versionString.js';
|
|
7
8
|
import { maintainerLog } from '../../domain/maintainerLog.js';
|
|
8
9
|
const bind = (server, host, freePort) => new Promise((resolve, reject) => {
|
|
@@ -19,11 +20,24 @@ const bind = (server, host, freePort) => new Promise((resolve, reject) => {
|
|
|
19
20
|
});
|
|
20
21
|
/**
|
|
21
22
|
* Starts a gRPC server for defining and verifying ContractCase contracts
|
|
23
|
+
*
|
|
24
|
+
* @returns the running server and the port it is listening on
|
|
22
25
|
*/
|
|
23
26
|
export function main() {
|
|
24
27
|
maintainerLog(`Starting ContractCase ${versionString}`);
|
|
25
|
-
|
|
26
|
-
|
|
28
|
+
// Only calls that present this token are accepted
|
|
29
|
+
// - see authTokenInterceptor for details
|
|
30
|
+
const authToken = process.env['CASE_CONNECTOR_TOKEN'];
|
|
31
|
+
if (authToken == null || authToken === '') {
|
|
32
|
+
// Console used here because there's nothing sensible we can do with this error
|
|
33
|
+
// eslint-disable-next-line no-console
|
|
34
|
+
console.error(`[${versionString}]`, "ContractCase's internal server requires the CASE_CONNECTOR_TOKEN environment variable to be set to an unguessable random secret, so that only the client that started the server can connect to it");
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
const server = new Server({
|
|
38
|
+
interceptors: [makeAuthTokenInterceptor(authToken)],
|
|
39
|
+
});
|
|
40
|
+
return getPort().then((freePort) => {
|
|
27
41
|
server.addService(ContractCaseService, {
|
|
28
42
|
contractDefinition,
|
|
29
43
|
contractVerification,
|
|
@@ -39,11 +53,12 @@ export function main() {
|
|
|
39
53
|
// Must have the port number after the `:`
|
|
40
54
|
// eslint-disable-next-line no-console
|
|
41
55
|
console.log('[SERVER]', `Started on port: ${port}`);
|
|
56
|
+
return { server, port };
|
|
42
57
|
}, (error) => {
|
|
43
58
|
// Console used here because there's nothing sensible we can do with this error
|
|
44
59
|
// eslint-disable-next-line no-console
|
|
45
60
|
console.error(`[${versionString}]`, `ContractCase's internal server was unable to start: ${error}`);
|
|
46
|
-
process.exit(1);
|
|
61
|
+
return process.exit(1);
|
|
47
62
|
});
|
|
48
63
|
});
|
|
49
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"contract-case-stream.mjs","sourceRoot":"","sources":["../../../../src/connectors/grpc/contract-case-stream.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,OAAO,MAAM,UAAU,CAAC;AAE/B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAI9D,MAAM,IAAI,GAAG,CACX,MAAc,EACd,IAAY,EACZ,QAAgB,EACK,EAAE,CACvB,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;IAC9B,MAAM,OAAO,GAAG,GAAG,IAAI,IAAI,QAAQ,EAAE,CAAC;IACtC,aAAa,CAAC,8BAA8B,OAAO,EAAE,CAAC,CAAC;IACvD,MAAM,CAAC,SAAS,CACd,OAAO,EACP,iBAAiB,CAAC,cAAc,EAAE,EAClC,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;QACd,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC,CAAC,CAAC;AAEL
|
|
1
|
+
{"version":3,"file":"contract-case-stream.mjs","sourceRoot":"","sources":["../../../../src/connectors/grpc/contract-case-stream.mts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const versionString = "case-connector@0.
|
|
1
|
+
export declare const versionString = "case-connector@0.30.0";
|
|
2
2
|
//# sourceMappingURL=versionString.d.ts.map
|