construct-hub 0.4.2 → 0.4.5

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.
@@ -12,7 +12,7 @@ const npmjs_package_canary_1 = require("./npmjs-package-canary");
12
12
  class NpmJsPackageCanary extends constructs_1.Construct {
13
13
  constructor(scope, id, props) {
14
14
  super(scope, id);
15
- const handler = new npmjs_package_canary_1.NpmjsPackageCanary(this, 'Resource', {
15
+ this.handler = new npmjs_package_canary_1.NpmjsPackageCanary(this, 'Resource', {
16
16
  architecture: _lambda_architecture_1.gravitonLambdaIfAvailable(this),
17
17
  description: `[${scope.node.path}/PackageCanary] Monitors ${props.packageName} versions availability`,
18
18
  environment: {
@@ -24,11 +24,11 @@ class NpmJsPackageCanary extends constructs_1.Construct {
24
24
  memorySize: 10024,
25
25
  timeout: aws_cdk_lib_1.Duration.minutes(1),
26
26
  });
27
- const grant = props.bucket.grantReadWrite(handler, `${"package-canary/" /* STATE_PREFIX */}*${".state.json" /* STATE_SUFFIX */}`);
27
+ const grant = props.bucket.grantReadWrite(this.handler, `${"package-canary/" /* STATE_PREFIX */}*${".state.json" /* STATE_SUFFIX */}`);
28
28
  const schedule = new aws_events_1.Rule(this, 'Schedule', {
29
29
  description: 'Scheduled executions of the NpmJS package canary',
30
30
  schedule: aws_events_1.Schedule.rate(aws_cdk_lib_1.Duration.minutes(1)),
31
- targets: [new aws_events_targets_1.LambdaFunction(handler)],
31
+ targets: [new aws_events_targets_1.LambdaFunction(this.handler)],
32
32
  });
33
33
  // Ensure we don't attempt to run before permissions have been granted.
34
34
  schedule.node.addDependency(grant);
@@ -60,6 +60,37 @@ class NpmJsPackageCanary extends constructs_1.Construct {
60
60
  namespace: constants_1.METRICS_NAMESPACE,
61
61
  });
62
62
  }
63
+ /**
64
+ * The estimated lag between the npm registry replica (replcate.npmjs.com) and
65
+ * the primary registry (registry.npmjs.com).
66
+ *
67
+ * IMPORTANT NOTE: This is based on the difference in modified timestamps for
68
+ * the probe package between the two and hence has a granularly no better than
69
+ * the publishing interval of this. Since the construct-hub-probe package is
70
+ * only published every 3 hours approximately, this metric has a resolution
71
+ * that is strictly worse than 3 hours.
72
+ */
73
+ metricEstimatedNpmReplicaLag(opts) {
74
+ return new aws_cloudwatch_1.Metric({
75
+ period: aws_cdk_lib_1.Duration.minutes(1),
76
+ statistic: aws_cloudwatch_1.Statistic.MAXIMUM,
77
+ ...opts,
78
+ metricName: "EstimatedNpmReplicaLag" /* NPM_REPLICA_LAG */,
79
+ namespace: constants_1.METRICS_NAMESPACE,
80
+ });
81
+ }
82
+ metricErrors(opts) {
83
+ return this.handler.metricErrors(opts);
84
+ }
85
+ metricInvocations(opts) {
86
+ return this.handler.metricInvocations(opts);
87
+ }
88
+ metricThrottles(opts) {
89
+ return this.handler.metricThrottles(opts);
90
+ }
91
+ metricDuration(opts) {
92
+ return this.handler.metricDuration(opts);
93
+ }
63
94
  }
64
95
  exports.NpmJsPackageCanary = NpmJsPackageCanary;
65
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGFja2FnZS1zb3VyY2VzL25wbWpzL2NhbmFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFDdkMsK0RBQThFO0FBQzlFLHVEQUF3RDtBQUN4RCx1RUFBZ0U7QUFFaEUsMkNBQXVDO0FBQ3ZDLGdGQUFrRjtBQUNsRiwyQ0FLcUI7QUFDckIsaUVBQXVFO0FBUXZFLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFDL0MsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBOEI7UUFFOUIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixNQUFNLE9BQU8sR0FBRyxJQUFJLHlDQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRTtZQUM1QyxZQUFZLEVBQUUsZ0RBQXlCLENBQUMsSUFBSSxDQUFDO1lBQzdDLFdBQVcsRUFBRSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSw0QkFBNEIsS0FBSyxDQUFDLFdBQVcsd0JBQXdCO1lBQ3JHLFdBQVcsRUFBRTtnQkFDWCxtQkFBbUIsRUFBRSxPQUFPO2dCQUM1Qix1REFBb0MsRUFBRSxLQUFLLENBQUMsbUJBQW1CO2dCQUMvRCwrREFBd0MsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLFVBQVU7Z0JBQ2pFLG1DQUEwQixFQUFFLEtBQUssQ0FBQyxXQUFXO2FBQzlDO1lBQ0QsVUFBVSxFQUFFLEtBQU07WUFDbEIsT0FBTyxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztTQUM3QixDQUFDLENBQUM7UUFDSCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FDdkMsT0FBTyxFQUNQLEdBQUcsb0NBQXNCLElBQUksZ0NBQXNCLEVBQUUsQ0FDdEQsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzFDLFdBQVcsRUFBRSxrREFBa0Q7WUFDL0QsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN2QyxDQUFDLENBQUM7UUFDSCx1RUFBdUU7UUFDdkUsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxJQUFvQjtRQUN6QyxPQUFPLElBQUksdUJBQU0sQ0FBQztZQUNoQixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsRUFBRSwwQkFBUyxDQUFDLE9BQU87WUFDNUIsR0FBRyxJQUFJO1lBQ1AsVUFBVSw4QkFBdUI7WUFDakMsU0FBUyxFQUFFLDZCQUFpQjtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sbUJBQW1CLENBQUMsSUFBb0I7UUFDN0MsT0FBTyxJQUFJLHVCQUFNLENBQUM7WUFDaEIsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzQixTQUFTLEVBQUUsMEJBQVMsQ0FBQyxPQUFPO1lBQzVCLEdBQUcsSUFBSTtZQUNQLFVBQVUsdUNBQTRCO1lBQ3RDLFNBQVMsRUFBRSw2QkFBaUI7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLHlCQUF5QixDQUFDLElBQW9CO1FBQ25ELE9BQU8sSUFBSSx1QkFBTSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDM0IsU0FBUyxFQUFFLDBCQUFTLENBQUMsT0FBTztZQUM1QixHQUFHLElBQUk7WUFDUCxVQUFVLG1EQUFrQztZQUM1QyxTQUFTLEVBQUUsNkJBQWlCO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQS9ERCxnREErREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IE1ldHJpY09wdGlvbnMsIE1ldHJpYywgU3RhdGlzdGljIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWNsb3Vkd2F0Y2gnO1xuaW1wb3J0IHsgUnVsZSwgU2NoZWR1bGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZXZlbnRzJztcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzJztcbmltcG9ydCB7IElCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBncmF2aXRvbkxhbWJkYUlmQXZhaWxhYmxlIH0gZnJvbSAnLi4vLi4vLi4vYmFja2VuZC9fbGFtYmRhLWFyY2hpdGVjdHVyZSc7XG5pbXBvcnQge1xuICBFbnZpcm9ubWVudCxcbiAgT2JqZWN0S2V5LFxuICBNRVRSSUNTX05BTUVTUEFDRSxcbiAgTWV0cmljTmFtZSxcbn0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgTnBtanNQYWNrYWdlQ2FuYXJ5IGFzIEhhbmRsZXIgfSBmcm9tICcuL25wbWpzLXBhY2thZ2UtY2FuYXJ5JztcblxuZXhwb3J0IGludGVyZmFjZSBOcG1Kc1BhY2thZ2VDYW5hcnlQcm9wcyB7XG4gIHJlYWRvbmx5IGJ1Y2tldDogSUJ1Y2tldDtcbiAgcmVhZG9ubHkgY29uc3RydWN0SHViQmFzZVVybDogc3RyaW5nO1xuICByZWFkb25seSBwYWNrYWdlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgTnBtSnNQYWNrYWdlQ2FuYXJ5IGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBDb25zdHJ1Y3QsXG4gICAgaWQ6IHN0cmluZyxcbiAgICBwcm9wczogTnBtSnNQYWNrYWdlQ2FuYXJ5UHJvcHNcbiAgKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIGNvbnN0IGhhbmRsZXIgPSBuZXcgSGFuZGxlcih0aGlzLCAnUmVzb3VyY2UnLCB7XG4gICAgICBhcmNoaXRlY3R1cmU6IGdyYXZpdG9uTGFtYmRhSWZBdmFpbGFibGUodGhpcyksXG4gICAgICBkZXNjcmlwdGlvbjogYFske3Njb3BlLm5vZGUucGF0aH0vUGFja2FnZUNhbmFyeV0gTW9uaXRvcnMgJHtwcm9wcy5wYWNrYWdlTmFtZX0gdmVyc2lvbnMgYXZhaWxhYmlsaXR5YCxcbiAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgIEFXU19FTUZfRU5WSVJPTk1FTlQ6ICdMb2NhbCcsXG4gICAgICAgIFtFbnZpcm9ubWVudC5DT05TVFJVQ1RfSFVCX0JBU0VfVVJMXTogcHJvcHMuY29uc3RydWN0SHViQmFzZVVybCxcbiAgICAgICAgW0Vudmlyb25tZW50LlBBQ0tBR0VfQ0FOQVJZX0JVQ0tFVF9OQU1FXTogcHJvcHMuYnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICAgIFtFbnZpcm9ubWVudC5QQUNLQUdFX05BTUVdOiBwcm9wcy5wYWNrYWdlTmFtZSxcbiAgICAgIH0sXG4gICAgICBtZW1vcnlTaXplOiAxMF8wMjQsXG4gICAgICB0aW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgIH0pO1xuICAgIGNvbnN0IGdyYW50ID0gcHJvcHMuYnVja2V0LmdyYW50UmVhZFdyaXRlKFxuICAgICAgaGFuZGxlcixcbiAgICAgIGAke09iamVjdEtleS5TVEFURV9QUkVGSVh9KiR7T2JqZWN0S2V5LlNUQVRFX1NVRkZJWH1gXG4gICAgKTtcblxuICAgIGNvbnN0IHNjaGVkdWxlID0gbmV3IFJ1bGUodGhpcywgJ1NjaGVkdWxlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTY2hlZHVsZWQgZXhlY3V0aW9ucyBvZiB0aGUgTnBtSlMgcGFja2FnZSBjYW5hcnknLFxuICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcygxKSksXG4gICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKGhhbmRsZXIpXSxcbiAgICB9KTtcbiAgICAvLyBFbnN1cmUgd2UgZG9uJ3QgYXR0ZW1wdCB0byBydW4gYmVmb3JlIHBlcm1pc3Npb25zIGhhdmUgYmVlbiBncmFudGVkLlxuICAgIHNjaGVkdWxlLm5vZGUuYWRkRGVwZW5kZW5jeShncmFudCk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljRHdlbGxUaW1lKG9wdHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBzdGF0aXN0aWM6IFN0YXRpc3RpYy5NQVhJTVVNLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIG1ldHJpY05hbWU6IE1ldHJpY05hbWUuRFdFTExfVElNRSxcbiAgICAgIG5hbWVzcGFjZTogTUVUUklDU19OQU1FU1BBQ0UsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljVGltZVRvQ2F0YWxvZyhvcHRzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgc3RhdGlzdGljOiBTdGF0aXN0aWMuTUFYSU1VTSxcbiAgICAgIC4uLm9wdHMsXG4gICAgICBtZXRyaWNOYW1lOiBNZXRyaWNOYW1lLlRJTUVfVE9fQ0FUQUxPRyxcbiAgICAgIG5hbWVzcGFjZTogTUVUUklDU19OQU1FU1BBQ0UsXG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljVHJhY2tlZFZlcnNpb25Db3VudChvcHRzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIG5ldyBNZXRyaWMoe1xuICAgICAgcGVyaW9kOiBEdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgc3RhdGlzdGljOiBTdGF0aXN0aWMuTUFYSU1VTSxcbiAgICAgIC4uLm9wdHMsXG4gICAgICBtZXRyaWNOYW1lOiBNZXRyaWNOYW1lLlRSQUNLRURfVkVSU0lPTl9DT1VOVCxcbiAgICAgIG5hbWVzcGFjZTogTUVUUklDU19OQU1FU1BBQ0UsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
96
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvcGFja2FnZS1zb3VyY2VzL25wbWpzL2NhbmFyeS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2Q0FBdUM7QUFDdkMsK0RBQThFO0FBQzlFLHVEQUF3RDtBQUN4RCx1RUFBZ0U7QUFFaEUsMkNBQXVDO0FBQ3ZDLGdGQUFrRjtBQUNsRiwyQ0FLcUI7QUFDckIsaUVBQXVFO0FBUXZFLE1BQWEsa0JBQW1CLFNBQVEsc0JBQVM7SUFHL0MsWUFDRSxLQUFnQixFQUNoQixFQUFVLEVBQ1YsS0FBOEI7UUFFOUIsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQixJQUFJLENBQUMsT0FBTyxHQUFHLElBQUkseUNBQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzNDLFlBQVksRUFBRSxnREFBeUIsQ0FBQyxJQUFJLENBQUM7WUFDN0MsV0FBVyxFQUFFLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLDRCQUE0QixLQUFLLENBQUMsV0FBVyx3QkFBd0I7WUFDckcsV0FBVyxFQUFFO2dCQUNYLG1CQUFtQixFQUFFLE9BQU87Z0JBQzVCLHVEQUFvQyxFQUFFLEtBQUssQ0FBQyxtQkFBbUI7Z0JBQy9ELCtEQUF3QyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVTtnQkFDakUsbUNBQTBCLEVBQUUsS0FBSyxDQUFDLFdBQVc7YUFDOUM7WUFDRCxVQUFVLEVBQUUsS0FBTTtZQUNsQixPQUFPLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzdCLENBQUMsQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUN2QyxJQUFJLENBQUMsT0FBTyxFQUNaLEdBQUcsb0NBQXNCLElBQUksZ0NBQXNCLEVBQUUsQ0FDdEQsQ0FBQztRQUVGLE1BQU0sUUFBUSxHQUFHLElBQUksaUJBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFO1lBQzFDLFdBQVcsRUFBRSxrREFBa0Q7WUFDL0QsUUFBUSxFQUFFLHFCQUFRLENBQUMsSUFBSSxDQUFDLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLE9BQU8sRUFBRSxDQUFDLElBQUksbUNBQWMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUMsQ0FBQyxDQUFDO1FBQ0gsdUVBQXVFO1FBQ3ZFLFFBQVEsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFTSxlQUFlLENBQUMsSUFBb0I7UUFDekMsT0FBTyxJQUFJLHVCQUFNLENBQUM7WUFDaEIsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzQixTQUFTLEVBQUUsMEJBQVMsQ0FBQyxPQUFPO1lBQzVCLEdBQUcsSUFBSTtZQUNQLFVBQVUsOEJBQXVCO1lBQ2pDLFNBQVMsRUFBRSw2QkFBaUI7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLG1CQUFtQixDQUFDLElBQW9CO1FBQzdDLE9BQU8sSUFBSSx1QkFBTSxDQUFDO1lBQ2hCLE1BQU0sRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDM0IsU0FBUyxFQUFFLDBCQUFTLENBQUMsT0FBTztZQUM1QixHQUFHLElBQUk7WUFDUCxVQUFVLHVDQUE0QjtZQUN0QyxTQUFTLEVBQUUsNkJBQWlCO1NBQzdCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx5QkFBeUIsQ0FBQyxJQUFvQjtRQUNuRCxPQUFPLElBQUksdUJBQU0sQ0FBQztZQUNoQixNQUFNLEVBQUUsc0JBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQzNCLFNBQVMsRUFBRSwwQkFBUyxDQUFDLE9BQU87WUFDNUIsR0FBRyxJQUFJO1lBQ1AsVUFBVSxtREFBa0M7WUFDNUMsU0FBUyxFQUFFLDZCQUFpQjtTQUM3QixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksNEJBQTRCLENBQUMsSUFBb0I7UUFDdEQsT0FBTyxJQUFJLHVCQUFNLENBQUM7WUFDaEIsTUFBTSxFQUFFLHNCQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUMzQixTQUFTLEVBQUUsMEJBQVMsQ0FBQyxPQUFPO1lBQzVCLEdBQUcsSUFBSTtZQUNQLFVBQVUsZ0RBQTRCO1lBQ3RDLFNBQVMsRUFBRSw2QkFBaUI7U0FDN0IsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLFlBQVksQ0FBQyxJQUFvQjtRQUN0QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFTSxpQkFBaUIsQ0FBQyxJQUFvQjtRQUMzQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVNLGVBQWUsQ0FBQyxJQUFvQjtRQUN6QyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFTSxjQUFjLENBQUMsSUFBb0I7UUFDeEMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0Y7QUFyR0QsZ0RBcUdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRHVyYXRpb24gfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBNZXRyaWNPcHRpb25zLCBNZXRyaWMsIFN0YXRpc3RpYyB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1jbG91ZHdhdGNoJztcbmltcG9ydCB7IFJ1bGUsIFNjaGVkdWxlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWV2ZW50cyc7XG5pbXBvcnQgeyBMYW1iZGFGdW5jdGlvbiB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1ldmVudHMtdGFyZ2V0cyc7XG5pbXBvcnQgeyBJQnVja2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0IHsgZ3Jhdml0b25MYW1iZGFJZkF2YWlsYWJsZSB9IGZyb20gJy4uLy4uLy4uL2JhY2tlbmQvX2xhbWJkYS1hcmNoaXRlY3R1cmUnO1xuaW1wb3J0IHtcbiAgRW52aXJvbm1lbnQsXG4gIE9iamVjdEtleSxcbiAgTUVUUklDU19OQU1FU1BBQ0UsXG4gIE1ldHJpY05hbWUsXG59IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7IE5wbWpzUGFja2FnZUNhbmFyeSBhcyBIYW5kbGVyIH0gZnJvbSAnLi9ucG1qcy1wYWNrYWdlLWNhbmFyeSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTnBtSnNQYWNrYWdlQ2FuYXJ5UHJvcHMge1xuICByZWFkb25seSBidWNrZXQ6IElCdWNrZXQ7XG4gIHJlYWRvbmx5IGNvbnN0cnVjdEh1YkJhc2VVcmw6IHN0cmluZztcbiAgcmVhZG9ubHkgcGFja2FnZU5hbWU6IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIE5wbUpzUGFja2FnZUNhbmFyeSBleHRlbmRzIENvbnN0cnVjdCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaGFuZGxlcjogSGFuZGxlcjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IENvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBOcG1Kc1BhY2thZ2VDYW5hcnlQcm9wc1xuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgdGhpcy5oYW5kbGVyID0gbmV3IEhhbmRsZXIodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgYXJjaGl0ZWN0dXJlOiBncmF2aXRvbkxhbWJkYUlmQXZhaWxhYmxlKHRoaXMpLFxuICAgICAgZGVzY3JpcHRpb246IGBbJHtzY29wZS5ub2RlLnBhdGh9L1BhY2thZ2VDYW5hcnldIE1vbml0b3JzICR7cHJvcHMucGFja2FnZU5hbWV9IHZlcnNpb25zIGF2YWlsYWJpbGl0eWAsXG4gICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICBBV1NfRU1GX0VOVklST05NRU5UOiAnTG9jYWwnLFxuICAgICAgICBbRW52aXJvbm1lbnQuQ09OU1RSVUNUX0hVQl9CQVNFX1VSTF06IHByb3BzLmNvbnN0cnVjdEh1YkJhc2VVcmwsXG4gICAgICAgIFtFbnZpcm9ubWVudC5QQUNLQUdFX0NBTkFSWV9CVUNLRVRfTkFNRV06IHByb3BzLmJ1Y2tldC5idWNrZXROYW1lLFxuICAgICAgICBbRW52aXJvbm1lbnQuUEFDS0FHRV9OQU1FXTogcHJvcHMucGFja2FnZU5hbWUsXG4gICAgICB9LFxuICAgICAgbWVtb3J5U2l6ZTogMTBfMDI0LFxuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcbiAgICBjb25zdCBncmFudCA9IHByb3BzLmJ1Y2tldC5ncmFudFJlYWRXcml0ZShcbiAgICAgIHRoaXMuaGFuZGxlcixcbiAgICAgIGAke09iamVjdEtleS5TVEFURV9QUkVGSVh9KiR7T2JqZWN0S2V5LlNUQVRFX1NVRkZJWH1gXG4gICAgKTtcblxuICAgIGNvbnN0IHNjaGVkdWxlID0gbmV3IFJ1bGUodGhpcywgJ1NjaGVkdWxlJywge1xuICAgICAgZGVzY3JpcHRpb246ICdTY2hlZHVsZWQgZXhlY3V0aW9ucyBvZiB0aGUgTnBtSlMgcGFja2FnZSBjYW5hcnknLFxuICAgICAgc2NoZWR1bGU6IFNjaGVkdWxlLnJhdGUoRHVyYXRpb24ubWludXRlcygxKSksXG4gICAgICB0YXJnZXRzOiBbbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMuaGFuZGxlcildLFxuICAgIH0pO1xuICAgIC8vIEVuc3VyZSB3ZSBkb24ndCBhdHRlbXB0IHRvIHJ1biBiZWZvcmUgcGVybWlzc2lvbnMgaGF2ZSBiZWVuIGdyYW50ZWQuXG4gICAgc2NoZWR1bGUubm9kZS5hZGREZXBlbmRlbmN5KGdyYW50KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNEd2VsbFRpbWUob3B0cz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiBuZXcgTWV0cmljKHtcbiAgICAgIHBlcmlvZDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgIHN0YXRpc3RpYzogU3RhdGlzdGljLk1BWElNVU0sXG4gICAgICAuLi5vcHRzLFxuICAgICAgbWV0cmljTmFtZTogTWV0cmljTmFtZS5EV0VMTF9USU1FLFxuICAgICAgbmFtZXNwYWNlOiBNRVRSSUNTX05BTUVTUEFDRSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNUaW1lVG9DYXRhbG9nKG9wdHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBzdGF0aXN0aWM6IFN0YXRpc3RpYy5NQVhJTVVNLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIG1ldHJpY05hbWU6IE1ldHJpY05hbWUuVElNRV9UT19DQVRBTE9HLFxuICAgICAgbmFtZXNwYWNlOiBNRVRSSUNTX05BTUVTUEFDRSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNUcmFja2VkVmVyc2lvbkNvdW50KG9wdHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBzdGF0aXN0aWM6IFN0YXRpc3RpYy5NQVhJTVVNLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIG1ldHJpY05hbWU6IE1ldHJpY05hbWUuVFJBQ0tFRF9WRVJTSU9OX0NPVU5ULFxuICAgICAgbmFtZXNwYWNlOiBNRVRSSUNTX05BTUVTUEFDRSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZXN0aW1hdGVkIGxhZyBiZXR3ZWVuIHRoZSBucG0gcmVnaXN0cnkgcmVwbGljYSAocmVwbGNhdGUubnBtanMuY29tKSBhbmRcbiAgICogdGhlIHByaW1hcnkgcmVnaXN0cnkgKHJlZ2lzdHJ5Lm5wbWpzLmNvbSkuXG4gICAqXG4gICAqIElNUE9SVEFOVCBOT1RFOiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBkaWZmZXJlbmNlIGluIG1vZGlmaWVkIHRpbWVzdGFtcHMgZm9yXG4gICAqIHRoZSBwcm9iZSBwYWNrYWdlIGJldHdlZW4gdGhlIHR3byBhbmQgaGVuY2UgaGFzIGEgZ3JhbnVsYXJseSBubyBiZXR0ZXIgdGhhblxuICAgKiB0aGUgcHVibGlzaGluZyBpbnRlcnZhbCBvZiB0aGlzLiBTaW5jZSB0aGUgY29uc3RydWN0LWh1Yi1wcm9iZSBwYWNrYWdlIGlzXG4gICAqIG9ubHkgcHVibGlzaGVkIGV2ZXJ5IDMgaG91cnMgYXBwcm94aW1hdGVseSwgdGhpcyBtZXRyaWMgaGFzIGEgcmVzb2x1dGlvblxuICAgKiB0aGF0IGlzIHN0cmljdGx5IHdvcnNlIHRoYW4gMyBob3Vycy5cbiAgICovXG4gIHB1YmxpYyBtZXRyaWNFc3RpbWF0ZWROcG1SZXBsaWNhTGFnKG9wdHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gbmV3IE1ldHJpYyh7XG4gICAgICBwZXJpb2Q6IER1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBzdGF0aXN0aWM6IFN0YXRpc3RpYy5NQVhJTVVNLFxuICAgICAgLi4ub3B0cyxcbiAgICAgIG1ldHJpY05hbWU6IE1ldHJpY05hbWUuTlBNX1JFUExJQ0FfTEFHLFxuICAgICAgbmFtZXNwYWNlOiBNRVRSSUNTX05BTUVTUEFDRSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtZXRyaWNFcnJvcnMob3B0cz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIubWV0cmljRXJyb3JzKG9wdHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY0ludm9jYXRpb25zKG9wdHM/OiBNZXRyaWNPcHRpb25zKTogTWV0cmljIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVyLm1ldHJpY0ludm9jYXRpb25zKG9wdHMpO1xuICB9XG5cbiAgcHVibGljIG1ldHJpY1Rocm90dGxlcyhvcHRzPzogTWV0cmljT3B0aW9ucyk6IE1ldHJpYyB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5tZXRyaWNUaHJvdHRsZXMob3B0cyk7XG4gIH1cblxuICBwdWJsaWMgbWV0cmljRHVyYXRpb24ob3B0cz86IE1ldHJpY09wdGlvbnMpOiBNZXRyaWMge1xuICAgIHJldHVybiB0aGlzLmhhbmRsZXIubWV0cmljRHVyYXRpb24ob3B0cyk7XG4gIH1cbn1cbiJdfQ==
@@ -8075,6 +8075,7 @@ var require_lib2 = __commonJS({
8075
8075
  // src/package-sources/npmjs/canary/npmjs-package-canary.lambda.ts
8076
8076
  var npmjs_package_canary_lambda_exports = {};
8077
8077
  __export(npmjs_package_canary_lambda_exports, {
8078
+ CanaryStateService: () => CanaryStateService,
8078
8079
  handler: () => handler
8079
8080
  });
8080
8081
  module.exports = __toCommonJS(npmjs_package_canary_lambda_exports);
@@ -8129,9 +8130,10 @@ async function handler(event) {
8129
8130
  console.log(`Initial state: ${JSON.stringify(state, null, 2)}`);
8130
8131
  updateLatestIfNeeded(state, latest);
8131
8132
  try {
8132
- await (0, import_aws_embedded_metrics.metricScope)((metrics) => () => {
8133
+ await (0, import_aws_embedded_metrics.metricScope)((metrics) => async () => {
8133
8134
  metrics.setDimensions();
8134
8135
  metrics.putMetric("TrackedVersionCount" /* TRACKED_VERSION_COUNT */, Object.keys(state.pending).length + 1, import_aws_embedded_metrics.Unit.Count);
8136
+ metrics.putMetric("EstimatedNpmReplicaLag" /* NPM_REPLICA_LAG */, await stateService.npmReplicaLagSeconds(packageName), import_aws_embedded_metrics.Unit.Seconds);
8135
8137
  })();
8136
8138
  for (const versionState of [
8137
8139
  state.latest,
@@ -8243,6 +8245,22 @@ var CanaryStateService = class {
8243
8245
  console.log(`Package: ${packageName} | Version : ${version} | Published At: ${publishedAt}`);
8244
8246
  return { version, publishedAt: new Date(publishedAt) };
8245
8247
  }
8248
+ async npmReplicaLagSeconds(packageName) {
8249
+ const encodedPackageName = encodeURIComponent(packageName);
8250
+ console.log(`Measuring NPM replica lag using ${packageName}...`);
8251
+ const [primaryDate, replicaDate] = await Promise.all([
8252
+ getModifiedTimestamp(`registry.npmjs.org`),
8253
+ getModifiedTimestamp(`replicate.npmjs.com/registry`)
8254
+ ]);
8255
+ const deltaMs = primaryDate.getTime() - replicaDate.getTime();
8256
+ console.log(`Timestamp on primary: ${primaryDate.toISOString()}`);
8257
+ console.log(`Timestamp on replica: ${replicaDate.toISOString()} (${deltaMs / 36e5} hours behind)`);
8258
+ return deltaMs / 1e3;
8259
+ async function getModifiedTimestamp(baseUrl) {
8260
+ const isoDate = await getJSON(`https://${baseUrl}/${encodedPackageName}`, ["time", "modified"]);
8261
+ return new Date(isoDate);
8262
+ }
8263
+ }
8246
8264
  key(packageName) {
8247
8265
  return `${"package-canary/" /* STATE_PREFIX */}${packageName}${".state.json" /* STATE_SUFFIX */}`;
8248
8266
  }
@@ -8287,6 +8305,7 @@ function gunzip(readable) {
8287
8305
  }
8288
8306
  // Annotate the CommonJS export names for ESM import in node:
8289
8307
  0 && (module.exports = {
8308
+ CanaryStateService,
8290
8309
  handler
8291
8310
  });
8292
8311
  //# sourceMappingURL=index.js.map