@replit/connectors-sdk 0.4.2 → 0.4.3

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/identity.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AAOA,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAmB3D;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAwB5D;AAED,wBAAgB,cAAc,IAAI,MAAM,CASvC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWpE"}
1
+ {"version":3,"file":"identity.d.ts","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"AA0BA,wBAAgB,eAAe,IAAI,MAAM,CASxC;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAsB3D;AAkFD,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,CAuB5D;AAED,wBAAgB,cAAc,IAAI,MAAM,CASvC;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAWpE"}
package/identity.js CHANGED
@@ -6,9 +6,27 @@ exports.resolveIdentityToken = resolveIdentityToken;
6
6
  exports.resolveBaseUrl = resolveBaseUrl;
7
7
  exports.buildHeaders = buildHeaders;
8
8
  const node_child_process_1 = require("node:child_process");
9
+ const promises_1 = require("node:timers/promises");
9
10
  const node_util_1 = require("node:util");
10
11
  const execFileAsync = (0, node_util_1.promisify)(node_child_process_1.execFile);
11
12
  const DEFAULT_CONNECTORS_HOST = 'connectors.replit.com';
13
+ const DEPLOYMENT_IDENTITY_ENDPOINT = 'http://127.0.0.1:1105/getIdentityToken';
14
+ const IDENTITY_MINT_TIMEOUT_MS = 5000;
15
+ const IDENTITY_MINT_RETRY_DELAY_MS = 250;
16
+ class TransientLocalIdentityError extends Error {
17
+ }
18
+ function isDeploymentEnvironment() {
19
+ // Conrun exposes the same deployment markers, but is being retired and is
20
+ // deliberately outside this migration. Preserve its existing Repl identity
21
+ // path until the remaining callers move to replvisor.
22
+ if (process.env['REPLIT_CONRUN'])
23
+ return false;
24
+ return [
25
+ 'REPLIT_DEPLOYMENT_ID',
26
+ 'REPLIT_DEPLOYMENT_ENVIRONMENT',
27
+ 'WEB_REPL_RENEWAL',
28
+ ].some((name) => Boolean(process.env[name]));
29
+ }
12
30
  function resolveAudience() {
13
31
  const audience = process.env['REPLIT_CONNECTORS_AUDIENCE'];
14
32
  if (audience) {
@@ -22,19 +40,91 @@ function resolveAudience() {
22
40
  async function createIdentityToken() {
23
41
  const replitBinary = process.env['REPLIT_CLI'] || 'replit';
24
42
  const audience = resolveAudience();
25
- const { stdout } = await execFileAsync(replitBinary, [
26
- 'identity',
27
- 'create',
28
- '--audience',
29
- audience,
30
- ]);
43
+ const { stdout } = await execFileAsync(replitBinary, ['identity', 'create', '--audience', audience], {
44
+ encoding: 'utf8',
45
+ timeout: IDENTITY_MINT_TIMEOUT_MS,
46
+ windowsHide: true,
47
+ });
31
48
  const token = stdout.trim();
32
49
  if (!token) {
33
50
  throw new Error(`replit identity create returned an empty token (audience: ${audience})`);
34
51
  }
35
52
  return token;
36
53
  }
54
+ async function createIdentityTokenFromLocalEndpoint(timeoutMs) {
55
+ const controller = new AbortController();
56
+ const timeout = setTimeout(() => controller.abort(), timeoutMs);
57
+ try {
58
+ let response;
59
+ try {
60
+ response = await fetch(DEPLOYMENT_IDENTITY_ENDPOINT, {
61
+ method: 'POST',
62
+ headers: { 'Content-Type': 'application/json' },
63
+ body: JSON.stringify({ audience: resolveAudience() }),
64
+ signal: controller.signal,
65
+ });
66
+ }
67
+ catch (cause) {
68
+ if (cause instanceof TypeError) {
69
+ throw new TransientLocalIdentityError('local identity endpoint is not accepting connections');
70
+ }
71
+ throw cause;
72
+ }
73
+ if (!response.ok) {
74
+ const message = `local identity endpoint returned HTTP ${response.status}`;
75
+ if (response.status >= 500) {
76
+ throw new TransientLocalIdentityError(message);
77
+ }
78
+ throw new Error(message);
79
+ }
80
+ const payload = (await response.json());
81
+ if (typeof payload.identityToken !== 'string') {
82
+ throw new Error('local identity endpoint returned an invalid response');
83
+ }
84
+ const token = payload.identityToken.trim();
85
+ if (!token) {
86
+ throw new Error('local identity endpoint returned an empty token');
87
+ }
88
+ return token;
89
+ }
90
+ finally {
91
+ clearTimeout(timeout);
92
+ }
93
+ }
94
+ async function createDeploymentIdentityToken() {
95
+ const deadline = Date.now() + IDENTITY_MINT_TIMEOUT_MS;
96
+ try {
97
+ return await createIdentityToken();
98
+ }
99
+ catch {
100
+ // hostingpid1 also exposes the same audience-scoped mint over loopback.
101
+ }
102
+ // hostingpid1 starts the application and identity renewal concurrently. Its
103
+ // loopback endpoint can therefore be listening briefly before the first
104
+ // signing key is installed. Retry only that local startup seam, under the
105
+ // same bounded mint deadline, and continue to fail closed.
106
+ do {
107
+ const remainingMs = Math.max(1, deadline - Date.now());
108
+ try {
109
+ return await createIdentityTokenFromLocalEndpoint(remainingMs);
110
+ }
111
+ catch (cause) {
112
+ if (!(cause instanceof TransientLocalIdentityError))
113
+ break;
114
+ }
115
+ const retryBudgetMs = deadline - Date.now();
116
+ if (retryBudgetMs <= 0)
117
+ break;
118
+ await (0, promises_1.setTimeout)(Math.min(IDENTITY_MINT_RETRY_DELAY_MS, retryBudgetMs));
119
+ } while (Date.now() < deadline);
120
+ throw new Error('Could not mint an audience-scoped deployment identity. ' +
121
+ 'Neither `replit identity create` nor the local hostingpid1 identity ' +
122
+ 'endpoint is available. Raw WEB_REPL_RENEWAL credentials are not accepted.');
123
+ }
37
124
  async function resolveIdentityToken() {
125
+ if (isDeploymentEnvironment()) {
126
+ return `depl ${await createDeploymentIdentityToken()}`;
127
+ }
38
128
  try {
39
129
  const token = await createIdentityToken();
40
130
  return token;
@@ -46,13 +136,9 @@ async function resolveIdentityToken() {
46
136
  if (replIdentity) {
47
137
  return `repl ${replIdentity}`;
48
138
  }
49
- const deplToken = process.env['WEB_REPL_RENEWAL'];
50
- if (deplToken) {
51
- return `depl ${deplToken}`;
52
- }
53
139
  throw new Error('Replit identity token not found. ' +
54
- 'Could not run `replit identity create` and neither ' +
55
- 'REPL_IDENTITY nor WEB_REPL_RENEWAL are set in the environment. ' +
140
+ 'Could not run `replit identity create` and ' +
141
+ 'REPL_IDENTITY is not set in the environment. ' +
56
142
  'Are you running this inside a Repl?');
57
143
  }
58
144
  function resolveBaseUrl() {
package/identity.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"identity.js","sourceRoot":"","sources":["../src/identity.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@replit/connectors-sdk",
3
- "version": "0.4.2",
3
+ "version": "0.4.3",
4
4
  "description": "Replit Connectors SDK — identity resolution, proxy, and credential helpers for Repls",
5
5
  "sideEffects": false,
6
6
  "main": "./index.js",