@semiont/graph 0.5.24 → 0.5.26

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.
Files changed (46) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-7X77XSVD.js → chunk-JWG64MVA.js} +7 -7
  3. package/dist/{chunk-7X77XSVD.js.map → chunk-JWG64MVA.js.map} +1 -1
  4. package/dist/{chunk-ZPTG6NGD.js → chunk-RBRHTAJN.js} +2 -2
  5. package/dist/{chunk-NO67W7EF.js → chunk-RKAR27K2.js} +678 -265
  6. package/dist/chunk-RKAR27K2.js.map +1 -0
  7. package/dist/{chunk-FR442V6O.js → chunk-UKT6IXAM.js} +3 -3
  8. package/dist/{chunk-AJ4W3DS7.js → chunk-Y62BMZ25.js} +2 -2
  9. package/dist/{chunk-7WLIHNPO.js → chunk-YYVVWLB2.js} +1 -2
  10. package/dist/{dist-es-TBYZWFUA.js → dist-es-BGEPUOPB.js} +19 -19
  11. package/dist/dist-es-BGEPUOPB.js.map +1 -0
  12. package/dist/{dist-es-63RSTSM2.js → dist-es-BUTLC2YS.js} +12 -12
  13. package/dist/{dist-es-R36PCSLH.js → dist-es-ILOZ33QI.js} +4 -4
  14. package/dist/{dist-es-QDQUKRHU.js → dist-es-LN4LZWKV.js} +2 -2
  15. package/dist/{dist-es-5CNHCO76.js → dist-es-M72B762W.js} +4 -4
  16. package/dist/{dist-es-BTCEI257.js → dist-es-NGG7JHEH.js} +3 -3
  17. package/dist/{dist-es-OHWBFB6Z.js → dist-es-TLOL2VHU.js} +6 -6
  18. package/dist/{dist-es-C3XGVVKR.js → dist-es-WLYFLMD3.js} +39 -32
  19. package/dist/dist-es-WLYFLMD3.js.map +1 -0
  20. package/dist/{dist-es-ZOQMUI6H.js → dist-es-WS6NDSQ5.js} +4 -4
  21. package/dist/index.d.ts +29 -6
  22. package/dist/index.js +98 -114
  23. package/dist/index.js.map +1 -1
  24. package/dist/{loadSso-OMYS2YH5.js → loadSso-GOLDOL76.js} +6 -6
  25. package/dist/{signin-OZ4KQMKS.js → signin-TS4P2IEW.js} +6 -6
  26. package/dist/{sso-oidc-K2XXESPI.js → sso-oidc-QHNBBLAM.js} +6 -6
  27. package/dist/{sts-4YKAIUZO.js → sts-ZKQ7LNEG.js} +6 -6
  28. package/package.json +6 -6
  29. package/dist/chunk-NO67W7EF.js.map +0 -1
  30. package/dist/dist-es-C3XGVVKR.js.map +0 -1
  31. package/dist/dist-es-TBYZWFUA.js.map +0 -1
  32. /package/dist/{chunk-ZPTG6NGD.js.map → chunk-RBRHTAJN.js.map} +0 -0
  33. /package/dist/{chunk-FR442V6O.js.map → chunk-UKT6IXAM.js.map} +0 -0
  34. /package/dist/{chunk-AJ4W3DS7.js.map → chunk-Y62BMZ25.js.map} +0 -0
  35. /package/dist/{chunk-7WLIHNPO.js.map → chunk-YYVVWLB2.js.map} +0 -0
  36. /package/dist/{dist-es-63RSTSM2.js.map → dist-es-BUTLC2YS.js.map} +0 -0
  37. /package/dist/{dist-es-R36PCSLH.js.map → dist-es-ILOZ33QI.js.map} +0 -0
  38. /package/dist/{dist-es-QDQUKRHU.js.map → dist-es-LN4LZWKV.js.map} +0 -0
  39. /package/dist/{dist-es-5CNHCO76.js.map → dist-es-M72B762W.js.map} +0 -0
  40. /package/dist/{dist-es-BTCEI257.js.map → dist-es-NGG7JHEH.js.map} +0 -0
  41. /package/dist/{dist-es-OHWBFB6Z.js.map → dist-es-TLOL2VHU.js.map} +0 -0
  42. /package/dist/{dist-es-ZOQMUI6H.js.map → dist-es-WS6NDSQ5.js.map} +0 -0
  43. /package/dist/{loadSso-OMYS2YH5.js.map → loadSso-GOLDOL76.js.map} +0 -0
  44. /package/dist/{signin-OZ4KQMKS.js.map → signin-TS4P2IEW.js.map} +0 -0
  45. /package/dist/{sso-oidc-K2XXESPI.js.map → sso-oidc-QHNBBLAM.js.map} +0 -0
  46. /package/dist/{sts-4YKAIUZO.js.map → sts-ZKQ7LNEG.js.map} +0 -0
@@ -1,31 +1,31 @@
1
1
  import {
2
2
  setCredentialFeature
3
- } from "./chunk-ZPTG6NGD.js";
3
+ } from "./chunk-RBRHTAJN.js";
4
4
  import {
5
5
  CredentialsProviderError,
6
6
  chain,
7
7
  getProfileName,
8
8
  parseKnownFiles
9
- } from "./chunk-7WLIHNPO.js";
9
+ } from "./chunk-YYVVWLB2.js";
10
10
  import "./chunk-GPJBZ6EG.js";
11
11
 
12
12
  // ../../node_modules/@aws-sdk/credential-provider-ini/dist-es/resolveCredentialSource.js
13
13
  var resolveCredentialSource = (credentialSource, profileName, logger) => {
14
14
  const sourceProvidersMap = {
15
15
  EcsContainer: async (options) => {
16
- const { fromHttp } = await import("./dist-es-5CNHCO76.js");
17
- const { fromContainerMetadata } = await import("./dist-es-QDQUKRHU.js");
16
+ const { fromHttp } = await import("./dist-es-M72B762W.js");
17
+ const { fromContainerMetadata } = await import("./dist-es-LN4LZWKV.js");
18
18
  logger?.debug("@aws-sdk/credential-provider-ini - credential_source is EcsContainer");
19
19
  return async () => chain(fromHttp(options ?? {}), fromContainerMetadata(options))().then(setNamedProvider);
20
20
  },
21
21
  Ec2InstanceMetadata: async (options) => {
22
22
  logger?.debug("@aws-sdk/credential-provider-ini - credential_source is Ec2InstanceMetadata");
23
- const { fromInstanceMetadata } = await import("./dist-es-QDQUKRHU.js");
23
+ const { fromInstanceMetadata } = await import("./dist-es-LN4LZWKV.js");
24
24
  return async () => fromInstanceMetadata(options)().then(setNamedProvider);
25
25
  },
26
26
  Environment: async (options) => {
27
27
  logger?.debug("@aws-sdk/credential-provider-ini - credential_source is Environment");
28
- const { fromEnv } = await import("./dist-es-R36PCSLH.js");
28
+ const { fromEnv } = await import("./dist-es-ILOZ33QI.js");
29
29
  return async () => fromEnv(options)().then(setNamedProvider);
30
30
  }
31
31
  };
@@ -60,7 +60,7 @@ var resolveAssumeRoleCredentials = async (profileName, profiles, options, caller
60
60
  const profileData = profiles[profileName];
61
61
  const { source_profile, region } = profileData;
62
62
  if (!options.roleAssumer) {
63
- const { getDefaultRoleAssumer } = await import("./sts-4YKAIUZO.js");
63
+ const { getDefaultRoleAssumer } = await import("./sts-ZKQ7LNEG.js");
64
64
  options.roleAssumer = getDefaultRoleAssumer({
65
65
  ...options.clientConfig,
66
66
  credentialProviderLogger: options.logger,
@@ -109,7 +109,7 @@ var isLoginProfile = (data) => {
109
109
  return Boolean(data && data.login_session);
110
110
  };
111
111
  var resolveLoginCredentials = async (profileName, options, callerClientConfig) => {
112
- const { fromLoginCredentials } = await import("./dist-es-C3XGVVKR.js");
112
+ const { fromLoginCredentials } = await import("./dist-es-WLYFLMD3.js");
113
113
  const credentials = await fromLoginCredentials({
114
114
  ...options,
115
115
  profile: profileName
@@ -120,7 +120,7 @@ var resolveLoginCredentials = async (profileName, options, callerClientConfig) =
120
120
  // ../../node_modules/@aws-sdk/credential-provider-ini/dist-es/resolveProcessCredentials.js
121
121
  var isProcessProfile = (arg) => Boolean(arg) && typeof arg === "object" && typeof arg.credential_process === "string";
122
122
  var resolveProcessCredentials = async (options, profile) => {
123
- const { fromProcess } = await import("./dist-es-BTCEI257.js");
123
+ const { fromProcess } = await import("./dist-es-NGG7JHEH.js");
124
124
  const credentials = await fromProcess({
125
125
  ...options,
126
126
  profile
@@ -130,7 +130,7 @@ var resolveProcessCredentials = async (options, profile) => {
130
130
 
131
131
  // ../../node_modules/@aws-sdk/credential-provider-ini/dist-es/resolveSsoCredentials.js
132
132
  var resolveSsoCredentials = async (profile, profileData, options = {}, callerClientConfig) => {
133
- const { fromSSO } = await import("./dist-es-OHWBFB6Z.js");
133
+ const { fromSSO } = await import("./dist-es-TLOL2VHU.js");
134
134
  return fromSSO({
135
135
  profile,
136
136
  logger: options.logger,
@@ -165,7 +165,7 @@ var resolveStaticCredentials = async (profile, options) => {
165
165
  // ../../node_modules/@aws-sdk/credential-provider-ini/dist-es/resolveWebIdentityCredentials.js
166
166
  var isWebIdentityProfile = (arg) => Boolean(arg) && typeof arg === "object" && typeof arg.web_identity_token_file === "string" && typeof arg.role_arn === "string" && ["undefined", "string"].indexOf(typeof arg.role_session_name) > -1;
167
167
  var resolveWebIdentityCredentials = async (profile, options, callerClientConfig) => {
168
- const { fromTokenFile } = await import("./dist-es-ZOQMUI6H.js");
168
+ const { fromTokenFile } = await import("./dist-es-WS6NDSQ5.js");
169
169
  const credentials = await fromTokenFile({
170
170
  webIdentityTokenFile: profile.web_identity_token_file,
171
171
  roleArn: profile.role_arn,
@@ -217,4 +217,4 @@ var fromIni = (init = {}) => async ({ callerClientConfig } = {}) => {
217
217
  export {
218
218
  fromIni
219
219
  };
220
- //# sourceMappingURL=dist-es-63RSTSM2.js.map
220
+ //# sourceMappingURL=dist-es-BUTLC2YS.js.map
@@ -6,9 +6,9 @@ import {
6
6
  ENV_SECRET,
7
7
  ENV_SESSION,
8
8
  fromEnv
9
- } from "./chunk-FR442V6O.js";
10
- import "./chunk-ZPTG6NGD.js";
11
- import "./chunk-7WLIHNPO.js";
9
+ } from "./chunk-UKT6IXAM.js";
10
+ import "./chunk-RBRHTAJN.js";
11
+ import "./chunk-YYVVWLB2.js";
12
12
  import "./chunk-GPJBZ6EG.js";
13
13
  export {
14
14
  ENV_ACCOUNT_ID,
@@ -19,4 +19,4 @@ export {
19
19
  ENV_SESSION,
20
20
  fromEnv
21
21
  };
22
- //# sourceMappingURL=dist-es-R36PCSLH.js.map
22
+ //# sourceMappingURL=dist-es-ILOZ33QI.js.map
@@ -2,7 +2,7 @@ import {
2
2
  CredentialsProviderError,
3
3
  ProviderError,
4
4
  loadConfig
5
- } from "./chunk-7WLIHNPO.js";
5
+ } from "./chunk-YYVVWLB2.js";
6
6
  import {
7
7
  parseUrl
8
8
  } from "./chunk-GPJBZ6EG.js";
@@ -374,4 +374,4 @@ export {
374
374
  httpRequest,
375
375
  providerConfigFromInit
376
376
  };
377
- //# sourceMappingURL=dist-es-QDQUKRHU.js.map
377
+ //# sourceMappingURL=dist-es-LN4LZWKV.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  NodeHttpHandler
3
- } from "./chunk-AJ4W3DS7.js";
3
+ } from "./chunk-Y62BMZ25.js";
4
4
  import {
5
5
  setCredentialFeature
6
- } from "./chunk-ZPTG6NGD.js";
6
+ } from "./chunk-RBRHTAJN.js";
7
7
  import {
8
8
  CredentialsProviderError
9
- } from "./chunk-7WLIHNPO.js";
9
+ } from "./chunk-YYVVWLB2.js";
10
10
  import {
11
11
  HttpRequest,
12
12
  parseRfc3339DateTime,
@@ -172,4 +172,4 @@ var validateToken = (token) => {
172
172
  export {
173
173
  fromHttp
174
174
  };
175
- //# sourceMappingURL=dist-es-5CNHCO76.js.map
175
+ //# sourceMappingURL=dist-es-M72B762W.js.map
@@ -1,12 +1,12 @@
1
1
  import {
2
2
  setCredentialFeature
3
- } from "./chunk-ZPTG6NGD.js";
3
+ } from "./chunk-RBRHTAJN.js";
4
4
  import {
5
5
  CredentialsProviderError,
6
6
  externalDataInterceptor,
7
7
  getProfileName,
8
8
  parseKnownFiles
9
- } from "./chunk-7WLIHNPO.js";
9
+ } from "./chunk-YYVVWLB2.js";
10
10
  import "./chunk-GPJBZ6EG.js";
11
11
 
12
12
  // ../../node_modules/@aws-sdk/credential-provider-process/dist-es/resolveProcessCredentials.js
@@ -84,4 +84,4 @@ var fromProcess = (init = {}) => async ({ callerClientConfig } = {}) => {
84
84
  export {
85
85
  fromProcess
86
86
  };
87
- //# sourceMappingURL=dist-es-BTCEI257.js.map
87
+ //# sourceMappingURL=dist-es-NGG7JHEH.js.map
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  setCredentialFeature
3
- } from "./chunk-ZPTG6NGD.js";
3
+ } from "./chunk-RBRHTAJN.js";
4
4
  import {
5
5
  CredentialsProviderError,
6
6
  TokenProviderError,
@@ -9,7 +9,7 @@ import {
9
9
  getSSOTokenFromFile,
10
10
  loadSsoSessionData,
11
11
  parseKnownFiles
12
- } from "./chunk-7WLIHNPO.js";
12
+ } from "./chunk-YYVVWLB2.js";
13
13
  import "./chunk-GPJBZ6EG.js";
14
14
 
15
15
  // ../../node_modules/@aws-sdk/credential-provider-sso/dist-es/isSsoProfile.js
@@ -21,7 +21,7 @@ var REFRESH_MESSAGE = `To refresh this SSO session run 'aws sso login' with the
21
21
 
22
22
  // ../../node_modules/@aws-sdk/token-providers/dist-es/getSsoOidcClient.js
23
23
  var getSsoOidcClient = async (ssoRegion, init = {}, callerClientConfig) => {
24
- const { SSOOIDCClient } = await import("./sso-oidc-K2XXESPI.js");
24
+ const { SSOOIDCClient } = await import("./sso-oidc-QHNBBLAM.js");
25
25
  const coalesce = (prop) => init.clientConfig?.[prop] ?? init.parentClientConfig?.[prop] ?? callerClientConfig?.[prop];
26
26
  const ssoOidcClient = new SSOOIDCClient(Object.assign({}, init.clientConfig ?? {}, {
27
27
  region: ssoRegion ?? init.clientConfig?.region,
@@ -33,7 +33,7 @@ var getSsoOidcClient = async (ssoRegion, init = {}, callerClientConfig) => {
33
33
 
34
34
  // ../../node_modules/@aws-sdk/token-providers/dist-es/getNewSsoOidcToken.js
35
35
  var getNewSsoOidcToken = async (ssoToken, ssoRegion, init = {}, callerClientConfig) => {
36
- const { CreateTokenCommand } = await import("./sso-oidc-K2XXESPI.js");
36
+ const { CreateTokenCommand } = await import("./sso-oidc-QHNBBLAM.js");
37
37
  const ssoOidcClient = await getSsoOidcClient(ssoRegion, init, callerClientConfig);
38
38
  return ssoOidcClient.send(new CreateTokenCommand({
39
39
  clientId: ssoToken.clientId,
@@ -181,7 +181,7 @@ var resolveSSOCredentials = async ({ ssoStartUrl, ssoSession, ssoAccountId, ssoR
181
181
  });
182
182
  }
183
183
  const { accessToken } = token;
184
- const { SSOClient, GetRoleCredentialsCommand } = await import("./loadSso-OMYS2YH5.js");
184
+ const { SSOClient, GetRoleCredentialsCommand } = await import("./loadSso-GOLDOL76.js");
185
185
  const sso = ssoClient || new SSOClient(Object.assign({}, clientConfig ?? {}, {
186
186
  logger: clientConfig?.logger ?? callerClientConfig?.logger ?? parentClientConfig?.logger,
187
187
  region: clientConfig?.region ?? ssoRegion,
@@ -314,4 +314,4 @@ export {
314
314
  isSsoProfile,
315
315
  validateSsoProfile
316
316
  };
317
- //# sourceMappingURL=dist-es-OHWBFB6Z.js.map
317
+ //# sourceMappingURL=dist-es-TLOL2VHU.js.map
@@ -1,12 +1,11 @@
1
1
  import {
2
2
  setCredentialFeature
3
- } from "./chunk-ZPTG6NGD.js";
3
+ } from "./chunk-RBRHTAJN.js";
4
4
  import {
5
5
  CredentialsProviderError,
6
6
  getProfileName,
7
- parseKnownFiles,
8
- readFile
9
- } from "./chunk-7WLIHNPO.js";
7
+ parseKnownFiles
8
+ } from "./chunk-YYVVWLB2.js";
10
9
  import {
11
10
  HttpRequest
12
11
  } from "./chunk-GPJBZ6EG.js";
@@ -38,13 +37,7 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
38
37
  if (timeUntilExpiry <= _LoginCredentialsFetcher.REFRESH_THRESHOLD) {
39
38
  return this.refresh(token);
40
39
  }
41
- return {
42
- accessKeyId: accessToken.accessKeyId,
43
- secretAccessKey: accessToken.secretAccessKey,
44
- sessionToken: accessToken.sessionToken,
45
- accountId: accessToken.accountId,
46
- expiration: new Date(accessToken.expiresAt)
47
- };
40
+ return this.toCredentials(token.accessToken);
48
41
  }
49
42
  get logger() {
50
43
  return this.init?.logger;
@@ -52,8 +45,26 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
52
45
  get loginSession() {
53
46
  return this.profileData.login_session;
54
47
  }
48
+ toCredentials(token) {
49
+ return {
50
+ accessKeyId: token.accessKeyId,
51
+ secretAccessKey: token.secretAccessKey,
52
+ sessionToken: token.sessionToken,
53
+ accountId: token.accountId,
54
+ expiration: new Date(token.expiresAt)
55
+ };
56
+ }
55
57
  async refresh(token) {
56
- const { SigninClient, CreateOAuth2TokenCommand } = await import("./signin-OZ4KQMKS.js");
58
+ const diskToken = await this.loadToken().catch(() => token);
59
+ const now = Date.now();
60
+ const diskExpiry = new Date(diskToken.accessToken.expiresAt).getTime();
61
+ const tokenExpiry = new Date(token.accessToken.expiresAt).getTime();
62
+ const freshToken = diskExpiry <= now && tokenExpiry > now ? token : diskToken;
63
+ const freshExpiry = new Date(freshToken.accessToken.expiresAt).getTime();
64
+ if (freshExpiry - Date.now() > _LoginCredentialsFetcher.REFRESH_THRESHOLD) {
65
+ return this.toCredentials(freshToken.accessToken);
66
+ }
67
+ const { SigninClient, CreateOAuth2TokenCommand } = await import("./signin-TS4P2IEW.js");
57
68
  const { logger, userAgentAppId } = this.callerClientConfig ?? {};
58
69
  const isH2 = (requestHandler2) => {
59
70
  return requestHandler2?.metadata?.handlerProtocol === "h2";
@@ -74,8 +85,8 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
74
85
  this.createDPoPInterceptor(client.middlewareStack);
75
86
  const commandInput = {
76
87
  tokenInput: {
77
- clientId: token.clientId,
78
- refreshToken: token.refreshToken,
88
+ clientId: freshToken.clientId,
89
+ refreshToken: freshToken.refreshToken,
79
90
  grantType: "refresh_token"
80
91
  }
81
92
  };
@@ -92,9 +103,9 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
92
103
  const expiresInMs = (expiresIn ?? 900) * 1e3;
93
104
  const expiration = new Date(Date.now() + expiresInMs);
94
105
  const updatedToken = {
95
- ...token,
106
+ ...freshToken,
96
107
  accessToken: {
97
- ...token.accessToken,
108
+ ...freshToken.accessToken,
98
109
  accessKeyId,
99
110
  secretAccessKey,
100
111
  sessionToken,
@@ -103,14 +114,7 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
103
114
  refreshToken
104
115
  };
105
116
  await this.saveToken(updatedToken);
106
- const newAccessToken = updatedToken.accessToken;
107
- return {
108
- accessKeyId: newAccessToken.accessKeyId,
109
- secretAccessKey: newAccessToken.secretAccessKey,
110
- sessionToken: newAccessToken.sessionToken,
111
- accountId: newAccessToken.accountId,
112
- expiration
113
- };
117
+ return this.toCredentials(updatedToken.accessToken);
114
118
  } catch (error) {
115
119
  if (error.name === "AccessDeniedException") {
116
120
  const errorType = error.error;
@@ -128,7 +132,15 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
128
132
  default:
129
133
  message = `Failed to refresh token: ${String(error)}. Please re-authenticate using \`aws login\``;
130
134
  }
131
- throw new CredentialsProviderError(message, { logger: this.logger, tryNextLink: false });
135
+ throw new CredentialsProviderError(message, {
136
+ logger: this.logger,
137
+ tryNextLink: false
138
+ });
139
+ }
140
+ const tokenExpiry2 = new Date(freshToken.accessToken.expiresAt).getTime();
141
+ if (tokenExpiry2 > Date.now()) {
142
+ this.logger?.warn?.(`Failed to refresh token: ${String(error)}. Using existing token until expiry.`);
143
+ return this.toCredentials(freshToken.accessToken);
132
144
  }
133
145
  throw new CredentialsProviderError(`Failed to refresh token: ${String(error)}. Please re-authenticate using aws login`, { logger: this.logger });
134
146
  }
@@ -136,12 +148,7 @@ var LoginCredentialsFetcher = class _LoginCredentialsFetcher {
136
148
  async loadToken() {
137
149
  const tokenFilePath = this.getTokenFilePath();
138
150
  try {
139
- let tokenData;
140
- try {
141
- tokenData = await readFile(tokenFilePath, { ignoreCache: this.init?.ignoreCache });
142
- } catch {
143
- tokenData = await fs.readFile(tokenFilePath, "utf8");
144
- }
151
+ const tokenData = await fs.readFile(tokenFilePath, "utf8");
145
152
  const token = JSON.parse(tokenData);
146
153
  const missingFields = ["accessToken", "clientId", "refreshToken", "dpopKey"].filter((k) => !token[k]);
147
154
  if (!token.accessToken?.accountId) {
@@ -284,4 +291,4 @@ var fromLoginCredentials = (init) => async ({ callerClientConfig } = {}) => {
284
291
  export {
285
292
  fromLoginCredentials
286
293
  };
287
- //# sourceMappingURL=dist-es-C3XGVVKR.js.map
294
+ //# sourceMappingURL=dist-es-WLYFLMD3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../node_modules/@aws-sdk/credential-provider-login/dist-es/LoginCredentialsFetcher.js","../../../node_modules/@aws-sdk/credential-provider-login/dist-es/fromLoginCredentials.js"],"sourcesContent":["import { CredentialsProviderError } from \"@smithy/core/config\";\nimport { HttpRequest } from \"@smithy/core/protocols\";\nimport { createHash, createPrivateKey, createPublicKey, sign } from \"node:crypto\";\nimport { promises as fs } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\nexport class LoginCredentialsFetcher {\n profileData;\n init;\n callerClientConfig;\n static REFRESH_THRESHOLD = 5 * 60 * 1000;\n constructor(profileData, init, callerClientConfig) {\n this.profileData = profileData;\n this.init = init;\n this.callerClientConfig = callerClientConfig;\n }\n async loadCredentials() {\n const token = await this.loadToken();\n if (!token) {\n throw new CredentialsProviderError(`Failed to load a token for session ${this.loginSession}, please re-authenticate using aws login`, { tryNextLink: false, logger: this.logger });\n }\n const accessToken = token.accessToken;\n const now = Date.now();\n const expiryTime = new Date(accessToken.expiresAt).getTime();\n const timeUntilExpiry = expiryTime - now;\n if (timeUntilExpiry <= LoginCredentialsFetcher.REFRESH_THRESHOLD) {\n return this.refresh(token);\n }\n return this.toCredentials(token.accessToken);\n }\n get logger() {\n return this.init?.logger;\n }\n get loginSession() {\n return this.profileData.login_session;\n }\n toCredentials(token) {\n return {\n accessKeyId: token.accessKeyId,\n secretAccessKey: token.secretAccessKey,\n sessionToken: token.sessionToken,\n accountId: token.accountId,\n expiration: new Date(token.expiresAt),\n };\n }\n async refresh(token) {\n const diskToken = await this.loadToken().catch(() => token);\n const now = Date.now();\n const diskExpiry = new Date(diskToken.accessToken.expiresAt).getTime();\n const tokenExpiry = new Date(token.accessToken.expiresAt).getTime();\n const freshToken = diskExpiry <= now && tokenExpiry > now ? token : diskToken;\n const freshExpiry = new Date(freshToken.accessToken.expiresAt).getTime();\n if (freshExpiry - Date.now() > LoginCredentialsFetcher.REFRESH_THRESHOLD) {\n return this.toCredentials(freshToken.accessToken);\n }\n const { SigninClient, CreateOAuth2TokenCommand } = await import(\"@aws-sdk/nested-clients/signin\");\n const { logger, userAgentAppId } = this.callerClientConfig ?? {};\n const isH2 = (requestHandler) => {\n return requestHandler?.metadata?.handlerProtocol === \"h2\";\n };\n const requestHandler = isH2(this.callerClientConfig?.requestHandler)\n ? undefined\n : this.callerClientConfig?.requestHandler;\n const region = this.profileData.region ?? (await this.callerClientConfig?.region?.()) ?? process.env.AWS_REGION;\n const client = new SigninClient({\n credentials: {\n accessKeyId: \"\",\n secretAccessKey: \"\",\n },\n region,\n requestHandler,\n logger,\n userAgentAppId,\n ...this.init?.clientConfig,\n });\n this.createDPoPInterceptor(client.middlewareStack);\n const commandInput = {\n tokenInput: {\n clientId: freshToken.clientId,\n refreshToken: freshToken.refreshToken,\n grantType: \"refresh_token\",\n },\n };\n try {\n const response = await client.send(new CreateOAuth2TokenCommand(commandInput));\n const { accessKeyId, secretAccessKey, sessionToken } = response.tokenOutput?.accessToken ?? {};\n const { refreshToken, expiresIn } = response.tokenOutput ?? {};\n if (!accessKeyId || !secretAccessKey || !sessionToken || !refreshToken) {\n throw new CredentialsProviderError(\"Token refresh response missing required fields\", {\n logger: this.logger,\n tryNextLink: false,\n });\n }\n const expiresInMs = (expiresIn ?? 900) * 1000;\n const expiration = new Date(Date.now() + expiresInMs);\n const updatedToken = {\n ...freshToken,\n accessToken: {\n ...freshToken.accessToken,\n accessKeyId,\n secretAccessKey,\n sessionToken,\n expiresAt: expiration.toISOString(),\n },\n refreshToken,\n };\n await this.saveToken(updatedToken);\n return this.toCredentials(updatedToken.accessToken);\n }\n catch (error) {\n if (error.name === \"AccessDeniedException\") {\n const errorType = error.error;\n let message;\n switch (errorType) {\n case \"TOKEN_EXPIRED\":\n message = \"Your session has expired. Please reauthenticate.\";\n break;\n case \"USER_CREDENTIALS_CHANGED\":\n message =\n \"Unable to refresh credentials because of a change in your password. Please reauthenticate with your new password.\";\n break;\n case \"INSUFFICIENT_PERMISSIONS\":\n message =\n \"Unable to refresh credentials due to insufficient permissions. You may be missing permission for the 'CreateOAuth2Token' action.\";\n break;\n default:\n message = `Failed to refresh token: ${String(error)}. Please re-authenticate using \\`aws login\\``;\n }\n throw new CredentialsProviderError(message, {\n logger: this.logger,\n tryNextLink: false,\n });\n }\n const tokenExpiry = new Date(freshToken.accessToken.expiresAt).getTime();\n if (tokenExpiry > Date.now()) {\n this.logger?.warn?.(`Failed to refresh token: ${String(error)}. Using existing token until expiry.`);\n return this.toCredentials(freshToken.accessToken);\n }\n throw new CredentialsProviderError(`Failed to refresh token: ${String(error)}. Please re-authenticate using aws login`, { logger: this.logger });\n }\n }\n async loadToken() {\n const tokenFilePath = this.getTokenFilePath();\n try {\n const tokenData = await fs.readFile(tokenFilePath, \"utf8\");\n const token = JSON.parse(tokenData);\n const missingFields = [\"accessToken\", \"clientId\", \"refreshToken\", \"dpopKey\"].filter((k) => !token[k]);\n if (!token.accessToken?.accountId) {\n missingFields.push(\"accountId\");\n }\n if (missingFields.length > 0) {\n throw new CredentialsProviderError(`Token validation failed, missing fields: ${missingFields.join(\", \")}`, {\n logger: this.logger,\n tryNextLink: false,\n });\n }\n return token;\n }\n catch (error) {\n throw new CredentialsProviderError(`Failed to load token from ${tokenFilePath}: ${String(error)}`, {\n logger: this.logger,\n tryNextLink: false,\n });\n }\n }\n async saveToken(token) {\n const tokenFilePath = this.getTokenFilePath();\n const directory = dirname(tokenFilePath);\n try {\n await fs.mkdir(directory, { recursive: true });\n }\n catch (error) {\n }\n await fs.writeFile(tokenFilePath, JSON.stringify(token, null, 2), \"utf8\");\n }\n getTokenFilePath() {\n const directory = process.env.AWS_LOGIN_CACHE_DIRECTORY ?? join(homedir(), \".aws\", \"login\", \"cache\");\n const loginSessionBytes = Buffer.from(this.loginSession, \"utf8\");\n const loginSessionSha256 = createHash(\"sha256\").update(loginSessionBytes).digest(\"hex\");\n return join(directory, `${loginSessionSha256}.json`);\n }\n derToRawSignature(derSignature) {\n let offset = 2;\n if (derSignature[offset] !== 0x02) {\n throw new Error(\"Invalid DER signature\");\n }\n offset++;\n const rLength = derSignature[offset++];\n let r = derSignature.subarray(offset, offset + rLength);\n offset += rLength;\n if (derSignature[offset] !== 0x02) {\n throw new Error(\"Invalid DER signature\");\n }\n offset++;\n const sLength = derSignature[offset++];\n let s = derSignature.subarray(offset, offset + sLength);\n r = r[0] === 0x00 ? r.subarray(1) : r;\n s = s[0] === 0x00 ? s.subarray(1) : s;\n const rPadded = Buffer.concat([Buffer.alloc(32 - r.length), r]);\n const sPadded = Buffer.concat([Buffer.alloc(32 - s.length), s]);\n return Buffer.concat([rPadded, sPadded]);\n }\n createDPoPInterceptor(middlewareStack) {\n middlewareStack.add((next) => async (args) => {\n if (HttpRequest.isInstance(args.request)) {\n const request = args.request;\n const actualEndpoint = `${request.protocol}//${request.hostname}${request.port ? `:${request.port}` : \"\"}${request.path}`;\n const dpop = await this.generateDpop(request.method, actualEndpoint);\n request.headers = {\n ...request.headers,\n DPoP: dpop,\n };\n }\n return next(args);\n }, {\n step: \"finalizeRequest\",\n name: \"dpopInterceptor\",\n override: true,\n });\n }\n async generateDpop(method = \"POST\", endpoint) {\n const token = await this.loadToken();\n try {\n const privateKey = createPrivateKey({\n key: token.dpopKey,\n format: \"pem\",\n type: \"sec1\",\n });\n const publicKey = createPublicKey(privateKey);\n const publicDer = publicKey.export({ format: \"der\", type: \"spki\" });\n let pointStart = -1;\n for (let i = 0; i < publicDer.length; i++) {\n if (publicDer[i] === 0x04) {\n pointStart = i;\n break;\n }\n }\n const x = publicDer.slice(pointStart + 1, pointStart + 33);\n const y = publicDer.slice(pointStart + 33, pointStart + 65);\n const header = {\n alg: \"ES256\",\n typ: \"dpop+jwt\",\n jwk: {\n kty: \"EC\",\n crv: \"P-256\",\n x: x.toString(\"base64url\"),\n y: y.toString(\"base64url\"),\n },\n };\n const payload = {\n jti: crypto.randomUUID(),\n htm: method,\n htu: endpoint,\n iat: Math.floor(Date.now() / 1000),\n };\n const headerB64 = Buffer.from(JSON.stringify(header)).toString(\"base64url\");\n const payloadB64 = Buffer.from(JSON.stringify(payload)).toString(\"base64url\");\n const message = `${headerB64}.${payloadB64}`;\n const asn1Signature = sign(\"sha256\", Buffer.from(message), privateKey);\n const rawSignature = this.derToRawSignature(asn1Signature);\n const signatureB64 = rawSignature.toString(\"base64url\");\n return `${message}.${signatureB64}`;\n }\n catch (error) {\n throw new CredentialsProviderError(`Failed to generate Dpop proof: ${error instanceof Error ? error.message : String(error)}`, { logger: this.logger, tryNextLink: false });\n }\n }\n}\n","import { setCredentialFeature } from \"@aws-sdk/core/client\";\nimport { CredentialsProviderError, getProfileName, parseKnownFiles } from \"@smithy/core/config\";\nimport { LoginCredentialsFetcher } from \"./LoginCredentialsFetcher\";\nexport const fromLoginCredentials = (init) => async ({ callerClientConfig } = {}) => {\n init?.logger?.debug?.(\"@aws-sdk/credential-providers - fromLoginCredentials\");\n const profiles = await parseKnownFiles(init || {});\n const profileName = getProfileName({\n profile: init?.profile ?? callerClientConfig?.profile,\n });\n const profile = profiles[profileName];\n if (!profile?.login_session) {\n throw new CredentialsProviderError(`Profile ${profileName} does not contain login_session.`, {\n tryNextLink: true,\n logger: init?.logger,\n });\n }\n const fetcher = new LoginCredentialsFetcher(profile, init, callerClientConfig);\n const credentials = await fetcher.loadCredentials();\n return setCredentialFeature(credentials, \"CREDENTIALS_LOGIN\", \"AD\");\n};\n"],"mappings":"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","names":["requestHandler","tokenExpiry"]}
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  setCredentialFeature
3
- } from "./chunk-ZPTG6NGD.js";
3
+ } from "./chunk-RBRHTAJN.js";
4
4
  import {
5
5
  CredentialsProviderError,
6
6
  externalDataInterceptor
7
- } from "./chunk-7WLIHNPO.js";
7
+ } from "./chunk-YYVVWLB2.js";
8
8
  import "./chunk-GPJBZ6EG.js";
9
9
 
10
10
  // ../../node_modules/@aws-sdk/credential-provider-web-identity/dist-es/fromTokenFile.js
@@ -16,7 +16,7 @@ var fromWebToken = (init) => async (awsIdentityProperties) => {
16
16
  const { roleArn, roleSessionName, webIdentityToken, providerId, policyArns, policy, durationSeconds } = init;
17
17
  let { roleAssumerWithWebIdentity } = init;
18
18
  if (!roleAssumerWithWebIdentity) {
19
- const { getDefaultRoleAssumerWithWebIdentity } = await import("./sts-4YKAIUZO.js");
19
+ const { getDefaultRoleAssumerWithWebIdentity } = await import("./sts-ZKQ7LNEG.js");
20
20
  roleAssumerWithWebIdentity = getDefaultRoleAssumerWithWebIdentity({
21
21
  ...init.clientConfig,
22
22
  credentialProviderLogger: init.logger,
@@ -66,4 +66,4 @@ export {
66
66
  fromTokenFile,
67
67
  fromWebToken
68
68
  };
69
- //# sourceMappingURL=dist-es-ZOQMUI6H.js.map
69
+ //# sourceMappingURL=dist-es-WS6NDSQ5.js.map
package/dist/index.d.ts CHANGED
@@ -1,5 +1,15 @@
1
1
  import { ResourceDescriptor, ResourceId, UpdateResourceInput, ResourceFilter, CreateAnnotationInternal, Annotation, AnnotationId, AnnotationCategory, GraphConnection, GraphPath, EntityTypeStats, GraphServiceConfig, Logger } from '@semiont/core';
2
2
 
3
+ /**
4
+ * Newest first, ties broken by id — the ordering every `listResources` result
5
+ * must carry.
6
+ *
7
+ * The tiebreak is not cosmetic: browse pages these results with offset/limit,
8
+ * and a partial order lets two pages repeat or drop rows. Ids compare by code
9
+ * point rather than locale so the JS backends agree with the engines, whose
10
+ * `ORDER BY` is codepoint-ordered.
11
+ */
12
+ declare function compareByRecencyThenId(a: ResourceDescriptor, b: ResourceDescriptor): number;
3
13
  interface GraphDatabase {
4
14
  connect(): Promise<void>;
5
15
  disconnect(): Promise<void>;
@@ -12,7 +22,6 @@ interface GraphDatabase {
12
22
  resources: ResourceDescriptor[];
13
23
  total: number;
14
24
  }>;
15
- searchResources(query: string, limit?: number): Promise<ResourceDescriptor[]>;
16
25
  createAnnotation(input: CreateAnnotationInternal): Promise<Annotation>;
17
26
  getAnnotation(id: AnnotationId): Promise<Annotation | null>;
18
27
  updateAnnotation(id: AnnotationId, updates: Partial<Annotation>): Promise<Annotation>;
@@ -102,7 +111,6 @@ declare class Neo4jGraphDatabase implements GraphDatabase {
102
111
  resources: ResourceDescriptor[];
103
112
  total: number;
104
113
  }>;
105
- searchResources(query: string, limit?: number): Promise<ResourceDescriptor[]>;
106
114
  createAnnotation(input: CreateAnnotationInternal): Promise<Annotation>;
107
115
  getAnnotation(id: AnnotationId): Promise<Annotation | null>;
108
116
  updateAnnotation(id: AnnotationId, updates: Partial<Annotation>): Promise<Annotation>;
@@ -173,11 +181,28 @@ declare class NeptuneGraphDatabase implements GraphDatabase {
173
181
  getResource(id: ResourceId): Promise<ResourceDescriptor | null>;
174
182
  updateResource(id: ResourceId, input: UpdateResourceInput): Promise<ResourceDescriptor>;
175
183
  deleteResource(id: ResourceId): Promise<void>;
184
+ /**
185
+ * Filtering, ranking and pagination happen in JS rather than in Gremlin.
186
+ *
187
+ * The ranking ladder (exact name over prefix over substring over path- or
188
+ * tag-assisted) has no natural Gremlin expression, and a rank applied after
189
+ * `range()` would order one page instead of the match set. JanusGraph
190
+ * post-filters for the same reason. Both share `queryResources` with the
191
+ * memory backend so search cannot mean three different things across three
192
+ * backends.
193
+ *
194
+ * The cost is explicit and accepted: this materializes every `Resource`
195
+ * vertex per call, so it is O(N) in the size of the KB rather than in the
196
+ * size of the result. Neo4j is the production path and pushes the whole
197
+ * query — filter, rank, page — into Cypher; Neptune and JanusGraph are not
198
+ * deployment targets today. If either becomes one at scale, the fix is a
199
+ * Gremlin rank expression (`choose` over `toLower`, engine-version
200
+ * permitting), not a return to per-backend search semantics.
201
+ */
176
202
  listResources(filter: ResourceFilter): Promise<{
177
203
  resources: ResourceDescriptor[];
178
204
  total: number;
179
205
  }>;
180
- searchResources(query: string, limit?: number): Promise<ResourceDescriptor[]>;
181
206
  createAnnotation(input: CreateAnnotationInternal): Promise<Annotation>;
182
207
  getAnnotation(id: AnnotationId): Promise<Annotation | null>;
183
208
  updateAnnotation(id: AnnotationId, updates: Partial<Annotation>): Promise<Annotation>;
@@ -253,7 +278,6 @@ declare class JanusGraphDatabase implements GraphDatabase {
253
278
  resources: ResourceDescriptor[];
254
279
  total: number;
255
280
  }>;
256
- searchResources(query: string, limit?: number): Promise<ResourceDescriptor[]>;
257
281
  createAnnotation(input: CreateAnnotationInternal): Promise<Annotation>;
258
282
  getAnnotation(id: AnnotationId): Promise<Annotation | null>;
259
283
  updateAnnotation(id: AnnotationId, updates: Partial<Annotation>): Promise<Annotation>;
@@ -309,7 +333,6 @@ declare class MemoryGraphDatabase implements GraphDatabase {
309
333
  resources: ResourceDescriptor[];
310
334
  total: number;
311
335
  }>;
312
- searchResources(query: string, limit?: number): Promise<ResourceDescriptor[]>;
313
336
  createAnnotation(input: CreateAnnotationInternal): Promise<Annotation>;
314
337
  getAnnotation(id: AnnotationId): Promise<Annotation | null>;
315
338
  updateAnnotation(id: AnnotationId, updates: Partial<Annotation>): Promise<Annotation>;
@@ -355,5 +378,5 @@ declare class MemoryGraphDatabase implements GraphDatabase {
355
378
  clearDatabase(): Promise<void>;
356
379
  }
357
380
 
358
- export { JanusGraphDatabase, MemoryGraphDatabase, Neo4jGraphDatabase, NeptuneGraphDatabase, closeGraphDatabase, createGraphDatabase, getGraphDatabase };
381
+ export { JanusGraphDatabase, MemoryGraphDatabase, Neo4jGraphDatabase, NeptuneGraphDatabase, closeGraphDatabase, compareByRecencyThenId, createGraphDatabase, getGraphDatabase };
359
382
  export type { GraphDatabase };