@nocobase/plugin-idp-oauth 2.1.0-alpha.10
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/LICENSE.txt +107 -0
- package/README.md +14 -0
- package/build.config.ts +46 -0
- package/client.d.ts +2 -0
- package/client.js +1 -0
- package/dist/client/ErrorPage.d.ts +11 -0
- package/dist/client/InteractionPage.d.ts +11 -0
- package/dist/client/index.d.ts +9 -0
- package/dist/client/index.js +10 -0
- package/dist/client/locale.d.ts +10 -0
- package/dist/client/models/index.d.ts +11 -0
- package/dist/client/plugin.d.ts +13 -0
- package/dist/externalVersion.js +18 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +48 -0
- package/dist/locale/en-US.json +1 -0
- package/dist/locale/zh-CN.json +1 -0
- package/dist/node_modules/eta/LICENSE +7 -0
- package/dist/node_modules/eta/README.md +185 -0
- package/dist/node_modules/eta/dist/core.d.ts +179 -0
- package/dist/node_modules/eta/dist/core.d.ts.map +1 -0
- package/dist/node_modules/eta/dist/core.js +42 -0
- package/dist/node_modules/eta/dist/core.js.map +1 -0
- package/dist/node_modules/eta/dist/index.cjs +542 -0
- package/dist/node_modules/eta/dist/index.cjs.map +1 -0
- package/dist/node_modules/eta/dist/index.d.cts +187 -0
- package/dist/node_modules/eta/dist/index.d.cts.map +1 -0
- package/dist/node_modules/eta/dist/index.d.mts +187 -0
- package/dist/node_modules/eta/dist/index.d.mts.map +1 -0
- package/dist/node_modules/eta/dist/index.mjs +512 -0
- package/dist/node_modules/eta/dist/index.mjs.map +1 -0
- package/dist/node_modules/eta/package.json +75 -0
- package/dist/node_modules/jose/LICENSE.md +21 -0
- package/dist/node_modules/jose/README.md +153 -0
- package/dist/node_modules/jose/dist/types/index.d.ts +55 -0
- package/dist/node_modules/jose/dist/types/jwe/compact/decrypt.d.ts +31 -0
- package/dist/node_modules/jose/dist/types/jwe/compact/encrypt.d.ts +65 -0
- package/dist/node_modules/jose/dist/types/jwe/flattened/decrypt.d.ts +31 -0
- package/dist/node_modules/jose/dist/types/jwe/flattened/encrypt.d.ts +83 -0
- package/dist/node_modules/jose/dist/types/jwe/general/decrypt.d.ts +38 -0
- package/dist/node_modules/jose/dist/types/jwe/general/encrypt.d.ts +74 -0
- package/dist/node_modules/jose/dist/types/jwk/embedded.d.ts +17 -0
- package/dist/node_modules/jose/dist/types/jwk/thumbprint.d.ts +32 -0
- package/dist/node_modules/jose/dist/types/jwks/local.d.ts +29 -0
- package/dist/node_modules/jose/dist/types/jwks/remote.d.ts +237 -0
- package/dist/node_modules/jose/dist/types/jws/compact/sign.d.ts +36 -0
- package/dist/node_modules/jose/dist/types/jws/compact/verify.d.ts +33 -0
- package/dist/node_modules/jose/dist/types/jws/flattened/sign.d.ts +42 -0
- package/dist/node_modules/jose/dist/types/jws/flattened/verify.d.ts +33 -0
- package/dist/node_modules/jose/dist/types/jws/general/sign.d.ts +53 -0
- package/dist/node_modules/jose/dist/types/jws/general/verify.d.ts +41 -0
- package/dist/node_modules/jose/dist/types/jwt/decrypt.d.ts +35 -0
- package/dist/node_modules/jose/dist/types/jwt/encrypt.d.ts +91 -0
- package/dist/node_modules/jose/dist/types/jwt/sign.d.ts +43 -0
- package/dist/node_modules/jose/dist/types/jwt/unsecured.d.ts +43 -0
- package/dist/node_modules/jose/dist/types/jwt/verify.d.ts +37 -0
- package/dist/node_modules/jose/dist/types/key/export.d.ts +33 -0
- package/dist/node_modules/jose/dist/types/key/generate_key_pair.d.ts +47 -0
- package/dist/node_modules/jose/dist/types/key/generate_secret.d.ts +35 -0
- package/dist/node_modules/jose/dist/types/key/import.d.ts +83 -0
- package/dist/node_modules/jose/dist/types/types.d.ts +852 -0
- package/dist/node_modules/jose/dist/types/util/base64url.d.ts +9 -0
- package/dist/node_modules/jose/dist/types/util/decode_jwt.d.ts +18 -0
- package/dist/node_modules/jose/dist/types/util/decode_protected_header.d.ts +17 -0
- package/dist/node_modules/jose/dist/types/util/errors.d.ts +213 -0
- package/dist/node_modules/jose/dist/webapi/index.js +32 -0
- package/dist/node_modules/jose/dist/webapi/jwe/compact/decrypt.js +27 -0
- package/dist/node_modules/jose/dist/webapi/jwe/compact/encrypt.js +27 -0
- package/dist/node_modules/jose/dist/webapi/jwe/flattened/decrypt.js +155 -0
- package/dist/node_modules/jose/dist/webapi/jwe/flattened/encrypt.js +165 -0
- package/dist/node_modules/jose/dist/webapi/jwe/general/decrypt.js +31 -0
- package/dist/node_modules/jose/dist/webapi/jwe/general/encrypt.js +182 -0
- package/dist/node_modules/jose/dist/webapi/jwk/embedded.js +17 -0
- package/dist/node_modules/jose/dist/webapi/jwk/thumbprint.js +68 -0
- package/dist/node_modules/jose/dist/webapi/jwks/local.js +119 -0
- package/dist/node_modules/jose/dist/webapi/jwks/remote.js +179 -0
- package/dist/node_modules/jose/dist/webapi/jws/compact/sign.js +18 -0
- package/dist/node_modules/jose/dist/webapi/jws/compact/verify.js +21 -0
- package/dist/node_modules/jose/dist/webapi/jws/flattened/sign.js +89 -0
- package/dist/node_modules/jose/dist/webapi/jws/flattened/verify.js +110 -0
- package/dist/node_modules/jose/dist/webapi/jws/general/sign.js +70 -0
- package/dist/node_modules/jose/dist/webapi/jws/general/verify.js +24 -0
- package/dist/node_modules/jose/dist/webapi/jwt/decrypt.js +23 -0
- package/dist/node_modules/jose/dist/webapi/jwt/encrypt.js +101 -0
- package/dist/node_modules/jose/dist/webapi/jwt/sign.js +52 -0
- package/dist/node_modules/jose/dist/webapi/jwt/unsecured.js +63 -0
- package/dist/node_modules/jose/dist/webapi/jwt/verify.js +15 -0
- package/dist/node_modules/jose/dist/webapi/key/export.js +11 -0
- package/dist/node_modules/jose/dist/webapi/key/generate_key_pair.js +97 -0
- package/dist/node_modules/jose/dist/webapi/key/generate_secret.js +40 -0
- package/dist/node_modules/jose/dist/webapi/key/import.js +57 -0
- package/dist/node_modules/jose/dist/webapi/lib/aesgcmkw.js +15 -0
- package/dist/node_modules/jose/dist/webapi/lib/aeskw.js +25 -0
- package/dist/node_modules/jose/dist/webapi/lib/asn1.js +243 -0
- package/dist/node_modules/jose/dist/webapi/lib/base64.js +22 -0
- package/dist/node_modules/jose/dist/webapi/lib/buffer_utils.js +43 -0
- package/dist/node_modules/jose/dist/webapi/lib/check_key_type.js +122 -0
- package/dist/node_modules/jose/dist/webapi/lib/content_encryption.js +217 -0
- package/dist/node_modules/jose/dist/webapi/lib/crypto_key.js +136 -0
- package/dist/node_modules/jose/dist/webapi/lib/deflate.js +44 -0
- package/dist/node_modules/jose/dist/webapi/lib/ecdhes.js +52 -0
- package/dist/node_modules/jose/dist/webapi/lib/helpers.js +19 -0
- package/dist/node_modules/jose/dist/webapi/lib/invalid_key_input.js +27 -0
- package/dist/node_modules/jose/dist/webapi/lib/is_key_like.js +17 -0
- package/dist/node_modules/jose/dist/webapi/lib/jwk_to_key.js +107 -0
- package/dist/node_modules/jose/dist/webapi/lib/jwt_claims_set.js +238 -0
- package/dist/node_modules/jose/dist/webapi/lib/key_management.js +186 -0
- package/dist/node_modules/jose/dist/webapi/lib/key_to_jwk.js +31 -0
- package/dist/node_modules/jose/dist/webapi/lib/normalize_key.js +166 -0
- package/dist/node_modules/jose/dist/webapi/lib/pbes2kw.js +39 -0
- package/dist/node_modules/jose/dist/webapi/lib/rsaes.js +24 -0
- package/dist/node_modules/jose/dist/webapi/lib/signing.js +68 -0
- package/dist/node_modules/jose/dist/webapi/lib/type_checks.js +40 -0
- package/dist/node_modules/jose/dist/webapi/lib/validate_algorithms.js +10 -0
- package/dist/node_modules/jose/dist/webapi/lib/validate_crit.js +33 -0
- package/dist/node_modules/jose/dist/webapi/util/base64url.js +30 -0
- package/dist/node_modules/jose/dist/webapi/util/decode_jwt.js +32 -0
- package/dist/node_modules/jose/dist/webapi/util/decode_protected_header.js +34 -0
- package/dist/node_modules/jose/dist/webapi/util/errors.js +99 -0
- package/dist/node_modules/jose/package.json +200 -0
- package/dist/node_modules/light-my-request/.gitattributes +2 -0
- package/dist/node_modules/light-my-request/.github/dependabot.yml +13 -0
- package/dist/node_modules/light-my-request/.github/stale.yml +21 -0
- package/dist/node_modules/light-my-request/.github/workflows/benchmark.yml +30 -0
- package/dist/node_modules/light-my-request/.github/workflows/ci.yml +23 -0
- package/dist/node_modules/light-my-request/LICENSE +32 -0
- package/dist/node_modules/light-my-request/benchmark/benchmark.js +164 -0
- package/dist/node_modules/light-my-request/build/build-validation.js +100 -0
- package/dist/node_modules/light-my-request/eslint.config.js +9 -0
- package/dist/node_modules/light-my-request/index.js +2 -0
- package/dist/node_modules/light-my-request/lib/config-validator.js +919 -0
- package/dist/node_modules/light-my-request/lib/form-data.js +79 -0
- package/dist/node_modules/light-my-request/lib/parse-url.js +47 -0
- package/dist/node_modules/light-my-request/lib/request.js +290 -0
- package/dist/node_modules/light-my-request/lib/response.js +240 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/.gitattributes +2 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/.github/dependabot.yml +13 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/.github/workflows/ci.yml +24 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/.taprc +2 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/benchmarks/warn.js +25 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/eslint.config.js +6 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/examples/example.js +11 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/index.js +124 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/package.json +73 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/emit-interpolated-string.test.js +29 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/emit-once-only.test.js +28 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/emit-reset.test.js +36 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/emit-set.test.js +30 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/emit-unlimited.test.js +37 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/index.test.js +99 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/issue-88.test.js +33 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/jest.test.js +22 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/test/no-warnings.test.js +80 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/types/index.d.ts +37 -0
- package/dist/node_modules/light-my-request/node_modules/process-warning/types/index.test-d.ts +36 -0
- package/dist/node_modules/light-my-request/package.json +1 -0
- package/dist/node_modules/light-my-request/test/async-await.test.js +55 -0
- package/dist/node_modules/light-my-request/test/index.test.js +2316 -0
- package/dist/node_modules/light-my-request/test/request.test.js +16 -0
- package/dist/node_modules/light-my-request/test/response.test.js +19 -0
- package/dist/node_modules/light-my-request/test/stream.test.js +359 -0
- package/dist/node_modules/light-my-request/types/index.d.ts +128 -0
- package/dist/node_modules/light-my-request/types/index.test-d.ts +149 -0
- package/dist/node_modules/oidc-provider/LICENSE.md +21 -0
- package/dist/node_modules/oidc-provider/README.md +174 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/assign_claims.js +28 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/assign_defaults.js +17 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/authenticated_client_id.js +6 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/backchannel_request_remap_errors.js +17 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/backchannel_request_response.js +41 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_ciba_context.js +12 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_claims.js +68 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_client.js +21 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_client_grant_type.js +21 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_dpop_jkt.js +35 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_extra_params.js +18 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_id_token_hint.js +23 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_max_age.js +25 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_openid_scope.js +47 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_pkce.js +41 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_prompt.js +25 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_redirect_uri.js +41 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_requested_expiry.js +16 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_response_mode.js +54 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_response_type.js +26 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/check_scope.js +53 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/ciba_load_account.js +58 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/ciba_required.js +13 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/device_authorization_response.js +31 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/device_user_flow.js +31 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/device_user_flow_errors.js +37 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/device_user_flow_response.js +55 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/index.js +200 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/interaction_emit.js +9 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/interactions.js +149 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/load_account.js +15 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/load_grant.js +29 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/load_pushed_authorization_request.js +36 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/oauth_required.js +11 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/oidc_required.js +27 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/one_redirect_uri_clients.js +20 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/process_request_object.js +214 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/pushed_authorization_request_remap_errors.js +17 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/pushed_authorization_request_response.js +65 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/reject_registration.js +12 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/reject_request_and_uri.js +12 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/reject_unsupported.js +33 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/respond.js +46 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/resume.js +111 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/strip_outside_jar_params.js +19 -0
- package/dist/node_modules/oidc-provider/lib/actions/authorization/unsupported_rar.js +9 -0
- package/dist/node_modules/oidc-provider/lib/actions/challenge.js +22 -0
- package/dist/node_modules/oidc-provider/lib/actions/code_verification.js +122 -0
- package/dist/node_modules/oidc-provider/lib/actions/discovery.js +151 -0
- package/dist/node_modules/oidc-provider/lib/actions/end_session.js +222 -0
- package/dist/node_modules/oidc-provider/lib/actions/grants/authorization_code.js +144 -0
- package/dist/node_modules/oidc-provider/lib/actions/grants/ciba.js +127 -0
- package/dist/node_modules/oidc-provider/lib/actions/grants/client_credentials.js +79 -0
- package/dist/node_modules/oidc-provider/lib/actions/grants/device_code.js +125 -0
- package/dist/node_modules/oidc-provider/lib/actions/grants/index.js +7 -0
- package/dist/node_modules/oidc-provider/lib/actions/grants/refresh_token.js +229 -0
- package/dist/node_modules/oidc-provider/lib/actions/index.js +25 -0
- package/dist/node_modules/oidc-provider/lib/actions/interaction.js +150 -0
- package/dist/node_modules/oidc-provider/lib/actions/introspection.js +164 -0
- package/dist/node_modules/oidc-provider/lib/actions/jwks.js +7 -0
- package/dist/node_modules/oidc-provider/lib/actions/registration.js +274 -0
- package/dist/node_modules/oidc-provider/lib/actions/revocation.js +81 -0
- package/dist/node_modules/oidc-provider/lib/actions/token.js +74 -0
- package/dist/node_modules/oidc-provider/lib/actions/userinfo.js +183 -0
- package/dist/node_modules/oidc-provider/lib/adapters/memory_adapter.js +95 -0
- package/dist/node_modules/oidc-provider/lib/consts/client_attributes.js +211 -0
- package/dist/node_modules/oidc-provider/lib/consts/dev_keystore.js +18 -0
- package/dist/node_modules/oidc-provider/lib/consts/index.js +13 -0
- package/dist/node_modules/oidc-provider/lib/consts/jwa.js +47 -0
- package/dist/node_modules/oidc-provider/lib/consts/non_rejectable_claims.js +1 -0
- package/dist/node_modules/oidc-provider/lib/consts/param_list.js +23 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/camel_case.js +1 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/defaults.js +28 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/difference.js +1 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/is_plain_object.js +1 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/map_keys.js +9 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/merge.js +25 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/omit_by.js +11 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/pick.js +10 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/pick_by.js +10 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/remove.js +9 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/set.js +18 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/snake_case.js +1 -0
- package/dist/node_modules/oidc-provider/lib/helpers/_/upper_first.js +1 -0
- package/dist/node_modules/oidc-provider/lib/helpers/account_claims.js +6 -0
- package/dist/node_modules/oidc-provider/lib/helpers/add_client.js +14 -0
- package/dist/node_modules/oidc-provider/lib/helpers/als.js +3 -0
- package/dist/node_modules/oidc-provider/lib/helpers/append_www_authenticate.js +9 -0
- package/dist/node_modules/oidc-provider/lib/helpers/attention.js +23 -0
- package/dist/node_modules/oidc-provider/lib/helpers/base64url.js +11 -0
- package/dist/node_modules/oidc-provider/lib/helpers/certificate_thumbprint.js +15 -0
- package/dist/node_modules/oidc-provider/lib/helpers/challenge.js +111 -0
- package/dist/node_modules/oidc-provider/lib/helpers/check_attest_binding.js +10 -0
- package/dist/node_modules/oidc-provider/lib/helpers/claims.js +79 -0
- package/dist/node_modules/oidc-provider/lib/helpers/client_id_metadata_document.js +198 -0
- package/dist/node_modules/oidc-provider/lib/helpers/client_schema.js +700 -0
- package/dist/node_modules/oidc-provider/lib/helpers/combined_scope.js +17 -0
- package/dist/node_modules/oidc-provider/lib/helpers/configuration.js +544 -0
- package/dist/node_modules/oidc-provider/lib/helpers/constant_equals.js +20 -0
- package/dist/node_modules/oidc-provider/lib/helpers/defaults.js +3510 -0
- package/dist/node_modules/oidc-provider/lib/helpers/epoch_time.js +1 -0
- package/dist/node_modules/oidc-provider/lib/helpers/err_out.js +17 -0
- package/dist/node_modules/oidc-provider/lib/helpers/errors.js +161 -0
- package/dist/node_modules/oidc-provider/lib/helpers/features.js +51 -0
- package/dist/node_modules/oidc-provider/lib/helpers/fetch_body_check.js +25 -0
- package/dist/node_modules/oidc-provider/lib/helpers/fetch_request.js +221 -0
- package/dist/node_modules/oidc-provider/lib/helpers/filter_claims.js +16 -0
- package/dist/node_modules/oidc-provider/lib/helpers/formatters.js +24 -0
- package/dist/node_modules/oidc-provider/lib/helpers/grant_common.js +214 -0
- package/dist/node_modules/oidc-provider/lib/helpers/html_safe.js +19 -0
- package/dist/node_modules/oidc-provider/lib/helpers/initialize_adapter.js +24 -0
- package/dist/node_modules/oidc-provider/lib/helpers/initialize_app.js +243 -0
- package/dist/node_modules/oidc-provider/lib/helpers/initialize_clients.js +24 -0
- package/dist/node_modules/oidc-provider/lib/helpers/initialize_keystore.js +310 -0
- package/dist/node_modules/oidc-provider/lib/helpers/interaction_policy/check.js +21 -0
- package/dist/node_modules/oidc-provider/lib/helpers/interaction_policy/index.js +43 -0
- package/dist/node_modules/oidc-provider/lib/helpers/interaction_policy/prompt.js +95 -0
- package/dist/node_modules/oidc-provider/lib/helpers/interaction_policy/prompts/consent.js +105 -0
- package/dist/node_modules/oidc-provider/lib/helpers/interaction_policy/prompts/login.js +162 -0
- package/dist/node_modules/oidc-provider/lib/helpers/jwt.js +211 -0
- package/dist/node_modules/oidc-provider/lib/helpers/keystore.js +301 -0
- package/dist/node_modules/oidc-provider/lib/helpers/nanoid.js +5 -0
- package/dist/node_modules/oidc-provider/lib/helpers/oidc_context.js +284 -0
- package/dist/node_modules/oidc-provider/lib/helpers/params.js +27 -0
- package/dist/node_modules/oidc-provider/lib/helpers/pkce.js +30 -0
- package/dist/node_modules/oidc-provider/lib/helpers/pkce_format.js +17 -0
- package/dist/node_modules/oidc-provider/lib/helpers/process_response_types.js +202 -0
- package/dist/node_modules/oidc-provider/lib/helpers/re_render_errors.js +39 -0
- package/dist/node_modules/oidc-provider/lib/helpers/redirect_uri.js +16 -0
- package/dist/node_modules/oidc-provider/lib/helpers/resolve_resource.js +33 -0
- package/dist/node_modules/oidc-provider/lib/helpers/resolve_response_mode.js +7 -0
- package/dist/node_modules/oidc-provider/lib/helpers/resource_server.js +20 -0
- package/dist/node_modules/oidc-provider/lib/helpers/revoke.js +27 -0
- package/dist/node_modules/oidc-provider/lib/helpers/script_src_sha.js +21 -0
- package/dist/node_modules/oidc-provider/lib/helpers/sector_identifier.js +19 -0
- package/dist/node_modules/oidc-provider/lib/helpers/sector_validate.js +55 -0
- package/dist/node_modules/oidc-provider/lib/helpers/set_rt_bindings.js +21 -0
- package/dist/node_modules/oidc-provider/lib/helpers/token_find.js +51 -0
- package/dist/node_modules/oidc-provider/lib/helpers/type_validators.js +8 -0
- package/dist/node_modules/oidc-provider/lib/helpers/user_code_form.js +19 -0
- package/dist/node_modules/oidc-provider/lib/helpers/user_codes.js +38 -0
- package/dist/node_modules/oidc-provider/lib/helpers/valid_url.js +8 -0
- package/dist/node_modules/oidc-provider/lib/helpers/validate_dpop.js +129 -0
- package/dist/node_modules/oidc-provider/lib/helpers/validate_presence.js +17 -0
- package/dist/node_modules/oidc-provider/lib/helpers/weak_cache.js +11 -0
- package/dist/node_modules/oidc-provider/lib/index.js +21 -0
- package/dist/node_modules/oidc-provider/lib/models/access_token.js +31 -0
- package/dist/node_modules/oidc-provider/lib/models/authorization_code.js +27 -0
- package/dist/node_modules/oidc-provider/lib/models/backchannel_authentication_request.js +26 -0
- package/dist/node_modules/oidc-provider/lib/models/base_model.js +141 -0
- package/dist/node_modules/oidc-provider/lib/models/base_token.js +86 -0
- package/dist/node_modules/oidc-provider/lib/models/client.js +593 -0
- package/dist/node_modules/oidc-provider/lib/models/client_credentials.js +19 -0
- package/dist/node_modules/oidc-provider/lib/models/device_code.js +44 -0
- package/dist/node_modules/oidc-provider/lib/models/formats/dynamic.js +21 -0
- package/dist/node_modules/oidc-provider/lib/models/formats/index.js +14 -0
- package/dist/node_modules/oidc-provider/lib/models/formats/jwt.js +198 -0
- package/dist/node_modules/oidc-provider/lib/models/formats/opaque.js +58 -0
- package/dist/node_modules/oidc-provider/lib/models/grant.js +243 -0
- package/dist/node_modules/oidc-provider/lib/models/id_token.js +271 -0
- package/dist/node_modules/oidc-provider/lib/models/index.js +37 -0
- package/dist/node_modules/oidc-provider/lib/models/initial_access_token.js +12 -0
- package/dist/node_modules/oidc-provider/lib/models/interaction.js +73 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/apply.js +4 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/consumable.js +17 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/has_format.js +46 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/has_grant_id.js +12 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/has_grant_type.js +8 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/has_policies.js +38 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/is_attestation_constrained.js +15 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/is_sender_constrained.js +50 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/is_session_bound.js +38 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/set_audience.js +21 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/stores_auth.js +16 -0
- package/dist/node_modules/oidc-provider/lib/models/mixins/stores_pkce.js +9 -0
- package/dist/node_modules/oidc-provider/lib/models/pushed_authorization_request.js +21 -0
- package/dist/node_modules/oidc-provider/lib/models/refresh_token.js +47 -0
- package/dist/node_modules/oidc-provider/lib/models/registration_access_token.js +8 -0
- package/dist/node_modules/oidc-provider/lib/models/replay_detection.js +31 -0
- package/dist/node_modules/oidc-provider/lib/models/session.js +192 -0
- package/dist/node_modules/oidc-provider/lib/provider.js +453 -0
- package/dist/node_modules/oidc-provider/lib/response_modes/form_post.js +36 -0
- package/dist/node_modules/oidc-provider/lib/response_modes/fragment.js +7 -0
- package/dist/node_modules/oidc-provider/lib/response_modes/index.js +15 -0
- package/dist/node_modules/oidc-provider/lib/response_modes/jwt.js +43 -0
- package/dist/node_modules/oidc-provider/lib/response_modes/query.js +7 -0
- package/dist/node_modules/oidc-provider/lib/response_modes/web_message.js +55 -0
- package/dist/node_modules/oidc-provider/lib/shared/assemble_params.js +7 -0
- package/dist/node_modules/oidc-provider/lib/shared/attest_client_auth.js +111 -0
- package/dist/node_modules/oidc-provider/lib/shared/authorization_error_handler.js +104 -0
- package/dist/node_modules/oidc-provider/lib/shared/check_rar.js +75 -0
- package/dist/node_modules/oidc-provider/lib/shared/check_resource.js +77 -0
- package/dist/node_modules/oidc-provider/lib/shared/client_auth.js +263 -0
- package/dist/node_modules/oidc-provider/lib/shared/conditional_body.js +9 -0
- package/dist/node_modules/oidc-provider/lib/shared/cors.js +49 -0
- package/dist/node_modules/oidc-provider/lib/shared/error_handler.js +59 -0
- package/dist/node_modules/oidc-provider/lib/shared/jwt_client_auth.js +79 -0
- package/dist/node_modules/oidc-provider/lib/shared/no_cache.js +4 -0
- package/dist/node_modules/oidc-provider/lib/shared/reject_dupes.js +45 -0
- package/dist/node_modules/oidc-provider/lib/shared/reject_structured_tokens.js +18 -0
- package/dist/node_modules/oidc-provider/lib/shared/selective_body.js +60 -0
- package/dist/node_modules/oidc-provider/lib/shared/session.js +68 -0
- package/dist/node_modules/oidc-provider/lib/shared/set_www_authenticate_header.js +52 -0
- package/dist/node_modules/oidc-provider/lib/views/index.js +22 -0
- package/dist/node_modules/oidc-provider/lib/views/interaction.js +171 -0
- package/dist/node_modules/oidc-provider/lib/views/layout.js +237 -0
- package/dist/node_modules/oidc-provider/lib/views/login.js +43 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/LICENSE +21 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/README.md +1370 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/dist/index.d.mts +1003 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/dist/index.d.ts +1003 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/dist/index.js +1616 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/dist/index.mjs +1573 -0
- package/dist/node_modules/oidc-provider/node_modules/@koa/router/package.json +122 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/LICENSE +20 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/README.md +481 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/package.json +64 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/src/browser.js +272 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/src/common.js +292 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/src/index.js +10 -0
- package/dist/node_modules/oidc-provider/node_modules/debug/src/node.js +263 -0
- package/dist/node_modules/oidc-provider/node_modules/http-errors/HISTORY.md +186 -0
- package/dist/node_modules/oidc-provider/node_modules/http-errors/LICENSE +23 -0
- package/dist/node_modules/oidc-provider/node_modules/http-errors/README.md +169 -0
- package/dist/node_modules/oidc-provider/node_modules/http-errors/index.js +290 -0
- package/dist/node_modules/oidc-provider/node_modules/http-errors/package.json +54 -0
- package/dist/node_modules/oidc-provider/node_modules/jsesc/LICENSE-MIT.txt +20 -0
- package/dist/node_modules/oidc-provider/node_modules/jsesc/README.md +422 -0
- package/dist/node_modules/oidc-provider/node_modules/jsesc/bin/jsesc +148 -0
- package/dist/node_modules/oidc-provider/node_modules/jsesc/jsesc.js +337 -0
- package/dist/node_modules/oidc-provider/node_modules/jsesc/man/jsesc.1 +94 -0
- package/dist/node_modules/oidc-provider/node_modules/jsesc/package.json +56 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/LICENSE +20 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/README.md +38 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/bin/nanoid.js +55 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/index.browser.js +29 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/index.d.ts +106 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/index.js +47 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/nanoid.js +1 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/non-secure/index.d.ts +48 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/non-secure/index.js +21 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/package.json +46 -0
- package/dist/node_modules/oidc-provider/node_modules/nanoid/url-alphabet/index.js +2 -0
- package/dist/node_modules/oidc-provider/node_modules/path-to-regexp/LICENSE +21 -0
- package/dist/node_modules/oidc-provider/node_modules/path-to-regexp/Readme.md +224 -0
- package/dist/node_modules/oidc-provider/node_modules/path-to-regexp/dist/index.d.ts +144 -0
- package/dist/node_modules/oidc-provider/node_modules/path-to-regexp/dist/index.js +409 -0
- package/dist/node_modules/oidc-provider/node_modules/path-to-regexp/dist/index.js.map +1 -0
- package/dist/node_modules/oidc-provider/node_modules/path-to-regexp/package.json +64 -0
- package/dist/node_modules/oidc-provider/node_modules/statuses/HISTORY.md +87 -0
- package/dist/node_modules/oidc-provider/node_modules/statuses/LICENSE +23 -0
- package/dist/node_modules/oidc-provider/node_modules/statuses/README.md +139 -0
- package/dist/node_modules/oidc-provider/node_modules/statuses/codes.json +65 -0
- package/dist/node_modules/oidc-provider/node_modules/statuses/index.js +146 -0
- package/dist/node_modules/oidc-provider/node_modules/statuses/package.json +49 -0
- package/dist/node_modules/oidc-provider/package.json +95 -0
- package/dist/node_modules/quick-lru/index.d.ts +178 -0
- package/dist/node_modules/quick-lru/index.js +329 -0
- package/dist/node_modules/quick-lru/license +9 -0
- package/dist/node_modules/quick-lru/package.json +54 -0
- package/dist/node_modules/quick-lru/readme.md +236 -0
- package/dist/node_modules/statuses/HISTORY.md +65 -0
- package/dist/node_modules/statuses/LICENSE +23 -0
- package/dist/node_modules/statuses/README.md +127 -0
- package/dist/node_modules/statuses/codes.json +66 -0
- package/dist/node_modules/statuses/index.js +113 -0
- package/dist/node_modules/statuses/package.json +48 -0
- package/dist/server/cache-adapter.d.ts +33 -0
- package/dist/server/cache-adapter.js +159 -0
- package/dist/server/index.d.ts +10 -0
- package/dist/server/index.js +48 -0
- package/dist/server/interaction.d.ts +26 -0
- package/dist/server/interaction.js +172 -0
- package/dist/server/paths.d.ts +19 -0
- package/dist/server/paths.js +64 -0
- package/dist/server/plugin.d.ts +16 -0
- package/dist/server/plugin.js +108 -0
- package/dist/server/provider-dispatch.d.ts +32 -0
- package/dist/server/provider-dispatch.js +252 -0
- package/dist/server/service.d.ts +63 -0
- package/dist/server/service.js +540 -0
- package/dist/server/utils.d.ts +12 -0
- package/dist/server/utils.js +58 -0
- package/package.json +24 -0
- package/server.d.ts +2 -0
- package/server.js +1 -0
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
export default class QuickLRU extends Map {
|
|
2
|
+
#size = 0;
|
|
3
|
+
#cache = new Map();
|
|
4
|
+
#oldCache = new Map();
|
|
5
|
+
#maxSize;
|
|
6
|
+
#maxAge;
|
|
7
|
+
#onEviction;
|
|
8
|
+
|
|
9
|
+
constructor(options = {}) {
|
|
10
|
+
super();
|
|
11
|
+
|
|
12
|
+
if (!(options.maxSize && options.maxSize > 0)) {
|
|
13
|
+
throw new TypeError('`maxSize` must be a number greater than 0');
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
if (typeof options.maxAge === 'number' && options.maxAge === 0) {
|
|
17
|
+
throw new TypeError('`maxAge` must be a number greater than 0');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
this.#maxSize = options.maxSize;
|
|
21
|
+
this.#maxAge = options.maxAge || Number.POSITIVE_INFINITY;
|
|
22
|
+
this.#onEviction = options.onEviction;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// For tests.
|
|
26
|
+
get __oldCache() {
|
|
27
|
+
return this.#oldCache;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#emitEvictions(cache) {
|
|
31
|
+
if (typeof this.#onEviction !== 'function') {
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
for (const [key, item] of cache) {
|
|
36
|
+
this.#onEviction(key, item.value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
#deleteIfExpired(key, item) {
|
|
41
|
+
if (typeof item.expiry === 'number' && item.expiry <= Date.now()) {
|
|
42
|
+
if (typeof this.#onEviction === 'function') {
|
|
43
|
+
this.#onEviction(key, item.value);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return this.delete(key);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
#getOrDeleteIfExpired(key, item) {
|
|
53
|
+
const deleted = this.#deleteIfExpired(key, item);
|
|
54
|
+
if (deleted === false) {
|
|
55
|
+
return item.value;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#getItemValue(key, item) {
|
|
60
|
+
return item.expiry ? this.#getOrDeleteIfExpired(key, item) : item.value;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
#peek(key, cache) {
|
|
64
|
+
const item = cache.get(key);
|
|
65
|
+
return this.#getItemValue(key, item);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#set(key, value) {
|
|
69
|
+
this.#cache.set(key, value);
|
|
70
|
+
this.#size++;
|
|
71
|
+
|
|
72
|
+
if (this.#size >= this.#maxSize) {
|
|
73
|
+
this.#size = 0;
|
|
74
|
+
this.#emitEvictions(this.#oldCache);
|
|
75
|
+
this.#oldCache = this.#cache;
|
|
76
|
+
this.#cache = new Map();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
#moveToRecent(key, item) {
|
|
81
|
+
this.#oldCache.delete(key);
|
|
82
|
+
this.#set(key, item);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
* #entriesAscending() {
|
|
86
|
+
for (const item of this.#oldCache) {
|
|
87
|
+
const [key, value] = item;
|
|
88
|
+
if (!this.#cache.has(key)) {
|
|
89
|
+
const deleted = this.#deleteIfExpired(key, value);
|
|
90
|
+
if (deleted === false) {
|
|
91
|
+
yield item;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
for (const item of this.#cache) {
|
|
97
|
+
const [key, value] = item;
|
|
98
|
+
const deleted = this.#deleteIfExpired(key, value);
|
|
99
|
+
if (deleted === false) {
|
|
100
|
+
yield item;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
get(key) {
|
|
106
|
+
if (this.#cache.has(key)) {
|
|
107
|
+
const item = this.#cache.get(key);
|
|
108
|
+
return this.#getItemValue(key, item);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (this.#oldCache.has(key)) {
|
|
112
|
+
const item = this.#oldCache.get(key);
|
|
113
|
+
if (this.#deleteIfExpired(key, item) === false) {
|
|
114
|
+
this.#moveToRecent(key, item);
|
|
115
|
+
return item.value;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
set(key, value, {maxAge = this.#maxAge} = {}) {
|
|
121
|
+
const expiry = typeof maxAge === 'number' && maxAge !== Number.POSITIVE_INFINITY
|
|
122
|
+
? (Date.now() + maxAge)
|
|
123
|
+
: undefined;
|
|
124
|
+
|
|
125
|
+
if (this.#cache.has(key)) {
|
|
126
|
+
this.#cache.set(key, {
|
|
127
|
+
value,
|
|
128
|
+
expiry,
|
|
129
|
+
});
|
|
130
|
+
} else {
|
|
131
|
+
this.#set(key, {value, expiry});
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
has(key) {
|
|
138
|
+
if (this.#cache.has(key)) {
|
|
139
|
+
return !this.#deleteIfExpired(key, this.#cache.get(key));
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (this.#oldCache.has(key)) {
|
|
143
|
+
return !this.#deleteIfExpired(key, this.#oldCache.get(key));
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return false;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
peek(key) {
|
|
150
|
+
if (this.#cache.has(key)) {
|
|
151
|
+
return this.#peek(key, this.#cache);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
if (this.#oldCache.has(key)) {
|
|
155
|
+
return this.#peek(key, this.#oldCache);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
expiresIn(key) {
|
|
160
|
+
const item = this.#cache.get(key) ?? this.#oldCache.get(key);
|
|
161
|
+
if (item) {
|
|
162
|
+
return item.expiry ? item.expiry - Date.now() : Number.POSITIVE_INFINITY;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
delete(key) {
|
|
167
|
+
const deleted = this.#cache.delete(key);
|
|
168
|
+
if (deleted) {
|
|
169
|
+
this.#size--;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return this.#oldCache.delete(key) || deleted;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
clear() {
|
|
176
|
+
this.#cache.clear();
|
|
177
|
+
this.#oldCache.clear();
|
|
178
|
+
this.#size = 0;
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
resize(newSize) {
|
|
182
|
+
if (!(newSize && newSize > 0)) {
|
|
183
|
+
throw new TypeError('`maxSize` must be a number greater than 0');
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
const items = [...this.#entriesAscending()];
|
|
187
|
+
const removeCount = items.length - newSize;
|
|
188
|
+
if (removeCount < 0) {
|
|
189
|
+
this.#cache = new Map(items);
|
|
190
|
+
this.#oldCache = new Map();
|
|
191
|
+
this.#size = items.length;
|
|
192
|
+
} else {
|
|
193
|
+
if (removeCount > 0) {
|
|
194
|
+
this.#emitEvictions(items.slice(0, removeCount));
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
this.#oldCache = new Map(items.slice(removeCount));
|
|
198
|
+
this.#cache = new Map();
|
|
199
|
+
this.#size = 0;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
this.#maxSize = newSize;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
evict(count = 1) {
|
|
206
|
+
const requested = Number(count);
|
|
207
|
+
if (!requested || requested <= 0) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const items = [...this.#entriesAscending()];
|
|
212
|
+
const evictCount = Math.trunc(Math.min(requested, Math.max(items.length - 1, 0)));
|
|
213
|
+
if (evictCount <= 0) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
this.#emitEvictions(items.slice(0, evictCount));
|
|
218
|
+
this.#oldCache = new Map(items.slice(evictCount));
|
|
219
|
+
this.#cache = new Map();
|
|
220
|
+
this.#size = 0;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
* keys() {
|
|
224
|
+
for (const [key] of this) {
|
|
225
|
+
yield key;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
* values() {
|
|
230
|
+
for (const [, value] of this) {
|
|
231
|
+
yield value;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
* [Symbol.iterator]() {
|
|
236
|
+
for (const item of this.#cache) {
|
|
237
|
+
const [key, value] = item;
|
|
238
|
+
const deleted = this.#deleteIfExpired(key, value);
|
|
239
|
+
if (deleted === false) {
|
|
240
|
+
yield [key, value.value];
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
for (const item of this.#oldCache) {
|
|
245
|
+
const [key, value] = item;
|
|
246
|
+
if (!this.#cache.has(key)) {
|
|
247
|
+
const deleted = this.#deleteIfExpired(key, value);
|
|
248
|
+
if (deleted === false) {
|
|
249
|
+
yield [key, value.value];
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
* entriesDescending() {
|
|
256
|
+
let items = [...this.#cache];
|
|
257
|
+
for (let i = items.length - 1; i >= 0; --i) {
|
|
258
|
+
const item = items[i];
|
|
259
|
+
const [key, value] = item;
|
|
260
|
+
const deleted = this.#deleteIfExpired(key, value);
|
|
261
|
+
if (deleted === false) {
|
|
262
|
+
yield [key, value.value];
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
items = [...this.#oldCache];
|
|
267
|
+
for (let i = items.length - 1; i >= 0; --i) {
|
|
268
|
+
const item = items[i];
|
|
269
|
+
const [key, value] = item;
|
|
270
|
+
if (!this.#cache.has(key)) {
|
|
271
|
+
const deleted = this.#deleteIfExpired(key, value);
|
|
272
|
+
if (deleted === false) {
|
|
273
|
+
yield [key, value.value];
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
* entriesAscending() {
|
|
280
|
+
for (const [key, value] of this.#entriesAscending()) {
|
|
281
|
+
yield [key, value.value];
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
get size() {
|
|
286
|
+
if (!this.#size) {
|
|
287
|
+
return this.#oldCache.size;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
let oldCacheSize = 0;
|
|
291
|
+
for (const key of this.#oldCache.keys()) {
|
|
292
|
+
if (!this.#cache.has(key)) {
|
|
293
|
+
oldCacheSize++;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
return Math.min(this.#size + oldCacheSize, this.#maxSize);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
get maxSize() {
|
|
301
|
+
return this.#maxSize;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
get maxAge() {
|
|
305
|
+
return this.#maxAge;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
entries() {
|
|
309
|
+
return this.entriesAscending();
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
forEach(callbackFunction, thisArgument = this) {
|
|
313
|
+
for (const [key, value] of this.entriesAscending()) {
|
|
314
|
+
callbackFunction.call(thisArgument, value, key, this);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
get [Symbol.toStringTag]() {
|
|
319
|
+
return 'QuickLRU';
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
toString() {
|
|
323
|
+
return `QuickLRU(${this.size}/${this.maxSize})`;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
[Symbol.for('nodejs.util.inspect.custom')]() {
|
|
327
|
+
return this.toString();
|
|
328
|
+
}
|
|
329
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "quick-lru",
|
|
3
|
+
"version": "7.3.0",
|
|
4
|
+
"description": "Simple “Least Recently Used” (LRU) cache",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"repository": "sindresorhus/quick-lru",
|
|
7
|
+
"funding": "https://github.com/sponsors/sindresorhus",
|
|
8
|
+
"author": {
|
|
9
|
+
"name": "Sindre Sorhus",
|
|
10
|
+
"email": "sindresorhus@gmail.com",
|
|
11
|
+
"url": "https://sindresorhus.com"
|
|
12
|
+
},
|
|
13
|
+
"type": "module",
|
|
14
|
+
"exports": {
|
|
15
|
+
"types": "./index.d.ts",
|
|
16
|
+
"default": "./index.js"
|
|
17
|
+
},
|
|
18
|
+
"sideEffects": false,
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=18"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"test": "xo && nyc ava && tsd"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"index.js",
|
|
27
|
+
"index.d.ts"
|
|
28
|
+
],
|
|
29
|
+
"keywords": [
|
|
30
|
+
"lru",
|
|
31
|
+
"quick",
|
|
32
|
+
"cache",
|
|
33
|
+
"caching",
|
|
34
|
+
"least",
|
|
35
|
+
"recently",
|
|
36
|
+
"used",
|
|
37
|
+
"fast",
|
|
38
|
+
"map",
|
|
39
|
+
"hash",
|
|
40
|
+
"buffer"
|
|
41
|
+
],
|
|
42
|
+
"devDependencies": {
|
|
43
|
+
"ava": "^5.3.1",
|
|
44
|
+
"nyc": "^15.1.0",
|
|
45
|
+
"tsd": "^0.29.0",
|
|
46
|
+
"xo": "^0.56.0"
|
|
47
|
+
},
|
|
48
|
+
"nyc": {
|
|
49
|
+
"reporter": [
|
|
50
|
+
"text",
|
|
51
|
+
"lcov"
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
# quick-lru [](https://codecov.io/gh/sindresorhus/quick-lru/branch/main)
|
|
2
|
+
|
|
3
|
+
> Simple [“Least Recently Used” (LRU) cache](https://en.m.wikipedia.org/wiki/Cache_replacement_policies#Least_Recently_Used_.28LRU.29)
|
|
4
|
+
|
|
5
|
+
Useful when you need to cache something and limit memory usage.
|
|
6
|
+
|
|
7
|
+
See the [algorithm section](#algorithm) for implementation details.
|
|
8
|
+
|
|
9
|
+
## Install
|
|
10
|
+
|
|
11
|
+
```sh
|
|
12
|
+
npm install quick-lru
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
## Usage
|
|
16
|
+
|
|
17
|
+
```js
|
|
18
|
+
import QuickLRU from 'quick-lru';
|
|
19
|
+
|
|
20
|
+
const lru = new QuickLRU({maxSize: 1000});
|
|
21
|
+
|
|
22
|
+
lru.set('🦄', '🌈');
|
|
23
|
+
|
|
24
|
+
lru.has('🦄');
|
|
25
|
+
//=> true
|
|
26
|
+
|
|
27
|
+
lru.get('🦄');
|
|
28
|
+
//=> '🌈'
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## API
|
|
32
|
+
|
|
33
|
+
### new QuickLRU(options?)
|
|
34
|
+
|
|
35
|
+
Returns a new instance.
|
|
36
|
+
|
|
37
|
+
It's a [`Map`](https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Map) subclass.
|
|
38
|
+
|
|
39
|
+
### options
|
|
40
|
+
|
|
41
|
+
Type: `object`
|
|
42
|
+
|
|
43
|
+
#### maxSize
|
|
44
|
+
|
|
45
|
+
*Required*\
|
|
46
|
+
Type: `number`
|
|
47
|
+
|
|
48
|
+
The target maximum number of items before evicting the least recently used items.
|
|
49
|
+
|
|
50
|
+
> [!NOTE]
|
|
51
|
+
> This package uses an [algorithm](#algorithm) which maintains between `maxSize` and `2 × maxSize` items for performance reasons. The cache may temporarily contain up to twice the specified size due to the dual-cache design that avoids expensive delete operations.
|
|
52
|
+
|
|
53
|
+
#### maxAge
|
|
54
|
+
|
|
55
|
+
Type: `number`\
|
|
56
|
+
Default: `Infinity`
|
|
57
|
+
|
|
58
|
+
The maximum number of milliseconds an item should remain in the cache.
|
|
59
|
+
By default, `maxAge` will be `Infinity`, which means that items will never expire.
|
|
60
|
+
|
|
61
|
+
Lazy expiration occurs upon the next `write` or `read` call.
|
|
62
|
+
|
|
63
|
+
Individual expiration of an item can be specified by the `set(key, value, options)` method.
|
|
64
|
+
|
|
65
|
+
#### onEviction
|
|
66
|
+
|
|
67
|
+
*Optional*\
|
|
68
|
+
Type: `(key, value) => void`
|
|
69
|
+
|
|
70
|
+
Called right before an item is evicted from the cache due to LRU pressure, TTL expiration, or manual eviction via `evict()`.
|
|
71
|
+
|
|
72
|
+
Useful for side effects or for items like object URLs that need explicit cleanup (`revokeObjectURL`).
|
|
73
|
+
|
|
74
|
+
> [!NOTE]
|
|
75
|
+
> This callback is **not** called for manual removals via `delete()` or `clear()`. It fires for automatic evictions and manual evictions via `evict()`.
|
|
76
|
+
|
|
77
|
+
### Instance
|
|
78
|
+
|
|
79
|
+
The instance is an [`Iterable`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Iteration_protocols) of `[key, value]` pairs so you can use it directly in a [`for…of`](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/for...of) loop.
|
|
80
|
+
|
|
81
|
+
Both `key` and `value` can be of any type.
|
|
82
|
+
|
|
83
|
+
#### .set(key, value, options?)
|
|
84
|
+
|
|
85
|
+
Set an item. Returns the instance.
|
|
86
|
+
|
|
87
|
+
Individual expiration of an item can be specified with the `maxAge` option. If not specified, the global `maxAge` value will be used in case it is specified in the constructor; otherwise, the item will never expire.
|
|
88
|
+
|
|
89
|
+
#### .get(key)
|
|
90
|
+
|
|
91
|
+
Get an item.
|
|
92
|
+
|
|
93
|
+
#### .has(key)
|
|
94
|
+
|
|
95
|
+
Check if an item exists.
|
|
96
|
+
|
|
97
|
+
#### .peek(key)
|
|
98
|
+
|
|
99
|
+
Get an item without marking it as recently used.
|
|
100
|
+
|
|
101
|
+
#### .delete(key)
|
|
102
|
+
|
|
103
|
+
Delete an item.
|
|
104
|
+
|
|
105
|
+
Returns `true` if the item is removed or `false` if the item doesn't exist.
|
|
106
|
+
|
|
107
|
+
#### .clear()
|
|
108
|
+
|
|
109
|
+
Delete all items.
|
|
110
|
+
|
|
111
|
+
#### .expiresIn(key)
|
|
112
|
+
|
|
113
|
+
Get the remaining time to live (in milliseconds) for the given item, or `undefined` if the item is not in the cache.
|
|
114
|
+
|
|
115
|
+
- Does not mark the item as recently used.
|
|
116
|
+
- Does not trigger lazy expiration or remove the entry when it’s expired.
|
|
117
|
+
- Returns `Infinity` if the item has no expiration (`maxAge` not set for the item and no global `maxAge`).
|
|
118
|
+
- May return a negative number if the item has already expired but has not yet been lazily removed.
|
|
119
|
+
|
|
120
|
+
#### .resize(maxSize)
|
|
121
|
+
|
|
122
|
+
Update the `maxSize`, discarding items as necessary. Insertion order is mostly preserved, though this is not a strong guarantee.
|
|
123
|
+
|
|
124
|
+
Useful for on-the-fly tuning of cache sizes in live systems.
|
|
125
|
+
|
|
126
|
+
#### .evict(count?)
|
|
127
|
+
|
|
128
|
+
Evict the least recently used items from the cache.
|
|
129
|
+
|
|
130
|
+
The `count` parameter specifies how many items to evict. Defaults to 1.
|
|
131
|
+
|
|
132
|
+
It will always keep at least one item in the cache.
|
|
133
|
+
|
|
134
|
+
```js
|
|
135
|
+
import QuickLRU from 'quick-lru';
|
|
136
|
+
|
|
137
|
+
const lru = new QuickLRU({maxSize: 10});
|
|
138
|
+
|
|
139
|
+
lru.set('a', 1);
|
|
140
|
+
lru.set('b', 2);
|
|
141
|
+
lru.set('c', 3);
|
|
142
|
+
|
|
143
|
+
lru.evict(2); // Evicts 'a' and 'b'
|
|
144
|
+
|
|
145
|
+
console.log(lru.has('a'));
|
|
146
|
+
//=> false
|
|
147
|
+
|
|
148
|
+
console.log(lru.has('c'));
|
|
149
|
+
//=> true
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
#### .keys()
|
|
153
|
+
|
|
154
|
+
Iterable for all the keys.
|
|
155
|
+
|
|
156
|
+
#### .values()
|
|
157
|
+
|
|
158
|
+
Iterable for all the values.
|
|
159
|
+
|
|
160
|
+
#### .entriesAscending()
|
|
161
|
+
|
|
162
|
+
Iterable for all entries, starting with the oldest (ascending in recency).
|
|
163
|
+
|
|
164
|
+
#### .entriesDescending()
|
|
165
|
+
|
|
166
|
+
Iterable for all entries, starting with the newest (descending in recency).
|
|
167
|
+
|
|
168
|
+
#### .entries()
|
|
169
|
+
|
|
170
|
+
Iterable for all entries, starting with the oldest (ascending in recency).
|
|
171
|
+
|
|
172
|
+
**This method exists for `Map` compatibility. Prefer [.entriesAscending()](#entriesascending) instead.**
|
|
173
|
+
|
|
174
|
+
#### .forEach(callbackFunction, thisArgument)
|
|
175
|
+
|
|
176
|
+
Loop over entries calling the `callbackFunction` for each entry (ascending in recency).
|
|
177
|
+
|
|
178
|
+
**This method exists for `Map` compatibility. Prefer [.entriesAscending()](#entriesascending) instead.**
|
|
179
|
+
|
|
180
|
+
#### .size *(getter)*
|
|
181
|
+
|
|
182
|
+
The stored item count.
|
|
183
|
+
|
|
184
|
+
#### .maxSize *(getter)*
|
|
185
|
+
|
|
186
|
+
The set max size.
|
|
187
|
+
|
|
188
|
+
#### .maxAge *(getter)*
|
|
189
|
+
|
|
190
|
+
The set max age.
|
|
191
|
+
|
|
192
|
+
## Algorithm
|
|
193
|
+
|
|
194
|
+
This library implements a variant of the [hashlru algorithm](https://github.com/dominictarr/hashlru#algorithm) using JavaScript's `Map` for broader key type support.
|
|
195
|
+
|
|
196
|
+
### How it works
|
|
197
|
+
|
|
198
|
+
The algorithm uses a dual-cache approach with two `Map` objects:
|
|
199
|
+
|
|
200
|
+
1. New cache - Stores recently accessed items
|
|
201
|
+
2. Old cache - Stores less recently accessed items
|
|
202
|
+
|
|
203
|
+
On `set()` operations:
|
|
204
|
+
- If the key exists in the new cache, update it
|
|
205
|
+
- Otherwise, add the key-value pair to the new cache
|
|
206
|
+
- When the new cache reaches `maxSize`, promote it to become the old cache and create a fresh new cache
|
|
207
|
+
|
|
208
|
+
On `get()` operations:
|
|
209
|
+
- If the key is in the new cache, return it directly
|
|
210
|
+
- If the key is in the old cache, move it to the new cache (promoting its recency)
|
|
211
|
+
|
|
212
|
+
### Benefits
|
|
213
|
+
|
|
214
|
+
- Performance: Avoids expensive `delete` operations that can cause performance issues in JavaScript engines
|
|
215
|
+
- Simplicity: No complex linked list management required
|
|
216
|
+
- Cache efficiency: Maintains LRU semantics while being much faster than traditional implementations
|
|
217
|
+
|
|
218
|
+
### Trade-offs
|
|
219
|
+
|
|
220
|
+
- Size variance: The cache can contain between `maxSize` and `2 × maxSize` items temporarily
|
|
221
|
+
- Memory overhead: Uses up to twice the target memory compared to strict LRU implementations
|
|
222
|
+
|
|
223
|
+
### When to use
|
|
224
|
+
|
|
225
|
+
Choose this implementation when:
|
|
226
|
+
- You need high-performance caching with many operations
|
|
227
|
+
- You can tolerate temporary size variance for better performance
|
|
228
|
+
- You want simple, reliable caching without complex data structures
|
|
229
|
+
|
|
230
|
+
Consider alternatives when:
|
|
231
|
+
- You need strict memory limits (exactly `maxSize` items)
|
|
232
|
+
- Memory usage is more critical than performance
|
|
233
|
+
|
|
234
|
+
## Related
|
|
235
|
+
|
|
236
|
+
- [yocto-queue](https://github.com/sindresorhus/yocto-queue) - Tiny queue data structure
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
1.5.0 / 2018-03-27
|
|
2
|
+
==================
|
|
3
|
+
|
|
4
|
+
* Add `103 Early Hints`
|
|
5
|
+
|
|
6
|
+
1.4.0 / 2017-10-20
|
|
7
|
+
==================
|
|
8
|
+
|
|
9
|
+
* Add `STATUS_CODES` export
|
|
10
|
+
|
|
11
|
+
1.3.1 / 2016-11-11
|
|
12
|
+
==================
|
|
13
|
+
|
|
14
|
+
* Fix return type in JSDoc
|
|
15
|
+
|
|
16
|
+
1.3.0 / 2016-05-17
|
|
17
|
+
==================
|
|
18
|
+
|
|
19
|
+
* Add `421 Misdirected Request`
|
|
20
|
+
* perf: enable strict mode
|
|
21
|
+
|
|
22
|
+
1.2.1 / 2015-02-01
|
|
23
|
+
==================
|
|
24
|
+
|
|
25
|
+
* Fix message for status 451
|
|
26
|
+
- `451 Unavailable For Legal Reasons`
|
|
27
|
+
|
|
28
|
+
1.2.0 / 2014-09-28
|
|
29
|
+
==================
|
|
30
|
+
|
|
31
|
+
* Add `208 Already Repored`
|
|
32
|
+
* Add `226 IM Used`
|
|
33
|
+
* Add `306 (Unused)`
|
|
34
|
+
* Add `415 Unable For Legal Reasons`
|
|
35
|
+
* Add `508 Loop Detected`
|
|
36
|
+
|
|
37
|
+
1.1.1 / 2014-09-24
|
|
38
|
+
==================
|
|
39
|
+
|
|
40
|
+
* Add missing 308 to `codes.json`
|
|
41
|
+
|
|
42
|
+
1.1.0 / 2014-09-21
|
|
43
|
+
==================
|
|
44
|
+
|
|
45
|
+
* Add `codes.json` for universal support
|
|
46
|
+
|
|
47
|
+
1.0.4 / 2014-08-20
|
|
48
|
+
==================
|
|
49
|
+
|
|
50
|
+
* Package cleanup
|
|
51
|
+
|
|
52
|
+
1.0.3 / 2014-06-08
|
|
53
|
+
==================
|
|
54
|
+
|
|
55
|
+
* Add 308 to `.redirect` category
|
|
56
|
+
|
|
57
|
+
1.0.2 / 2014-03-13
|
|
58
|
+
==================
|
|
59
|
+
|
|
60
|
+
* Add `.retry` category
|
|
61
|
+
|
|
62
|
+
1.0.1 / 2014-03-12
|
|
63
|
+
==================
|
|
64
|
+
|
|
65
|
+
* Initial release
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
|
|
2
|
+
The MIT License (MIT)
|
|
3
|
+
|
|
4
|
+
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
5
|
+
Copyright (c) 2016 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
6
|
+
|
|
7
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
8
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
9
|
+
in the Software without restriction, including without limitation the rights
|
|
10
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
11
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
12
|
+
furnished to do so, subject to the following conditions:
|
|
13
|
+
|
|
14
|
+
The above copyright notice and this permission notice shall be included in
|
|
15
|
+
all copies or substantial portions of the Software.
|
|
16
|
+
|
|
17
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
18
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
19
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
20
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
21
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
22
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
23
|
+
THE SOFTWARE.
|