diff --git a/.github/workflows/pr-build.yml b/.github/workflows/pr-build.yml index da7e612..2aa4457 100644 --- a/.github/workflows/pr-build.yml +++ b/.github/workflows/pr-build.yml @@ -60,5 +60,4 @@ jobs: run: pnpm test env: STATELY_STORE_ID: ${{ vars.STATELY_STORE_ID}} - STATELY_CLIENT_ID: ${{ vars.STATELY_CLIENT_ID }} - STATELY_CLIENT_SECRET: ${{ secrets.STATELY_CLIENT_SECRET }} + STATELY_ACCESS_KEY: ${{ secrets.STATELY_ACCESS_KEY }} diff --git a/api/db/index.ts b/api/db/index.ts index b54a37c..1bcb675 100644 --- a/api/db/index.ts +++ b/api/db/index.ts @@ -21,7 +21,7 @@ pool.on('acquire', () => { }); pool.on('error', (e: Error) => { metrics.increment('db.pool.error.count'); - metrics.increment(`db.pool.error.${ e.name }.count`); + metrics.increment(`db.pool.error.${e.name}.count`); }); pool.on('remove', () => { metrics.increment('db.pool.remove.count'); diff --git a/api/stately/apps-queries.ts b/api/stately/apps-queries.ts index 3d55cdd..e3e0560 100644 --- a/api/stately/apps-queries.ts +++ b/api/stately/apps-queries.ts @@ -74,8 +74,8 @@ export async function getAppById(id: string): Promise { */ export async function insertApp(app: ApiApp): Promise { let resultApp: ApiApp | undefined; - // TODO: wish I could set an if-not-exists condition here, to avoid - // accidentally updating an app. Instead I got a transaction. + // We can't use `mustNotExist` here because we want to return the existing app + // on conflict. const result = await client.transaction(async (txn) => { const getResult = await txn.get('ApiApp', keyPathFor(app.id)); if (getResult) { diff --git a/api/stately/generated/stately_item_types.d.ts b/api/stately/generated/stately_item_types.d.ts index fcb7a7a..7ef330d 100644 --- a/api/stately/generated/stately_item_types.d.ts +++ b/api/stately/generated/stately_item_types.d.ts @@ -1,75 +1,78 @@ // @generated by Stately. DO NOT EDIT. -/* eslint-disable */ -import type { DatabaseClient as GenericDatabaseClient, StoreID, ClientOptions } from "@stately-cloud/client"; +import type { + ClientOptions, + DatabaseClient as GenericDatabaseClient, + StoreID, +} from '@stately-cloud/client'; import type { ApiApp, - GlobalSettings, - ItemAnnotation, - ItemHashTag, - Loadout, - LoadoutShare, - Search, - Settings, - Triumph, ApiAppSchema, - GlobalSettingsSchema, - ItemAnnotationSchema, - ItemHashTagSchema, - LoadoutSchema, - LoadoutShareSchema, - SearchSchema, - SettingsSchema, - TriumphSchema, ArtifactUnlocksSchema, CollapsedSectionSchema, CustomStatDefSchema, CustomStatWeightsEntrySchema, CustomStatsEntrySchema, + GlobalSettings, + GlobalSettingsSchema, InGameLoadoutIdentifiersSchema, + ItemAnnotation, + ItemAnnotationSchema, + ItemHashTag, + ItemHashTagSchema, + Loadout, LoadoutItemSchema, LoadoutParametersSchema, + LoadoutSchema, + LoadoutShare, + LoadoutShareSchema, ModsByBucketEntrySchema, + Search, + SearchSchema, + Settings, + SettingsSchema, SocketOverrideSchema, StatConstraintSchema, StatConstraintsEntrySchema, -} from "./stately_pb.js"; + Triumph, + TriumphSchema, +} from './stately_pb.js'; export declare const itemTypeToSchema: { - "ApiApp": typeof ApiAppSchema, - "GlobalSettings": typeof GlobalSettingsSchema, - "ItemAnnotation": typeof ItemAnnotationSchema, - "ItemHashTag": typeof ItemHashTagSchema, - "Loadout": typeof LoadoutSchema, - "LoadoutShare": typeof LoadoutShareSchema, - "Search": typeof SearchSchema, - "Settings": typeof SettingsSchema, - "Triumph": typeof TriumphSchema, - "ArtifactUnlocks": typeof ArtifactUnlocksSchema, - "CollapsedSection": typeof CollapsedSectionSchema, - "CustomStatDef": typeof CustomStatDefSchema, - "CustomStatWeightsEntry": typeof CustomStatWeightsEntrySchema, - "CustomStatsEntry": typeof CustomStatsEntrySchema, - "InGameLoadoutIdentifiers": typeof InGameLoadoutIdentifiersSchema, - "LoadoutItem": typeof LoadoutItemSchema, - "LoadoutParameters": typeof LoadoutParametersSchema, - "ModsByBucketEntry": typeof ModsByBucketEntrySchema, - "SocketOverride": typeof SocketOverrideSchema, - "StatConstraint": typeof StatConstraintSchema, - "StatConstraintsEntry": typeof StatConstraintsEntrySchema, + ApiApp: typeof ApiAppSchema; + GlobalSettings: typeof GlobalSettingsSchema; + ItemAnnotation: typeof ItemAnnotationSchema; + ItemHashTag: typeof ItemHashTagSchema; + Loadout: typeof LoadoutSchema; + LoadoutShare: typeof LoadoutShareSchema; + Search: typeof SearchSchema; + Settings: typeof SettingsSchema; + Triumph: typeof TriumphSchema; + ArtifactUnlocks: typeof ArtifactUnlocksSchema; + CollapsedSection: typeof CollapsedSectionSchema; + CustomStatDef: typeof CustomStatDefSchema; + CustomStatWeightsEntry: typeof CustomStatWeightsEntrySchema; + CustomStatsEntry: typeof CustomStatsEntrySchema; + InGameLoadoutIdentifiers: typeof InGameLoadoutIdentifiersSchema; + LoadoutItem: typeof LoadoutItemSchema; + LoadoutParameters: typeof LoadoutParametersSchema; + ModsByBucketEntry: typeof ModsByBucketEntrySchema; + SocketOverride: typeof SocketOverrideSchema; + StatConstraint: typeof StatConstraintSchema; + StatConstraintsEntry: typeof StatConstraintsEntrySchema; }; // AllItemTypes is a convenience type that represents all item type names in your schema. export type AllItemTypes = - | "ApiApp" - | "GlobalSettings" - | "ItemAnnotation" - | "ItemHashTag" - | "Loadout" - | "LoadoutShare" - | "Search" - | "Settings" - | "Triumph"; + | 'ApiApp' + | 'GlobalSettings' + | 'ItemAnnotation' + | 'ItemHashTag' + | 'Loadout' + | 'LoadoutShare' + | 'Search' + | 'Settings' + | 'Triumph'; // AnyItem is a convenience type that represents any item shape in your schema. export type AnyItem = @@ -87,7 +90,4 @@ export type AnyItem = export type DatabaseClient = GenericDatabaseClient; // createClient creates a new database client with your schema. -export declare function createClient( - storeId: StoreID, - opts?: ClientOptions, -): DatabaseClient; +export declare function createClient(storeId: StoreID, opts?: ClientOptions): DatabaseClient; diff --git a/api/stately/generated/stately_pb.js b/api/stately/generated/stately_pb.js index 0738fa5..5a8f27d 100644 --- a/api/stately/generated/stately_pb.js +++ b/api/stately/generated/stately_pb.js @@ -8,7 +8,7 @@ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/code * Describes the file stately.proto. */ export const file_stately = /*@__PURE__*/ - fileDesc("Cg1zdGF0ZWx5LnByb3RvEhFzdGF0ZWx5LmdlbmVyYXRlZCJgCgZBcGlBcHASCgoCaWQYASABKAkSFAoMYnVuZ2llQXBpS2V5GAIgASgJEhEKCWRpbUFwaUtleRgDIAEoCRIOCgZvcmlnaW4YBCABKAkSEQoJcGFydGl0aW9uGAUgASgEIkMKD0FydGlmYWN0VW5sb2NrcxIaChJ1bmxvY2tlZEl0ZW1IYXNoZXMYASADKA0SFAoMc2Vhc29uTnVtYmVyGAIgASgNIjIKEENvbGxhcHNlZFNlY3Rpb24SCwoDa2V5GAEgASgJEhEKCWNvbGxhcHNlZBgCIAEoCCKwAQoNQ3VzdG9tU3RhdERlZhIQCghzdGF0SGFzaBgBIAEoDRINCgVsYWJlbBgCIAEoCRISCgpzaG9ydExhYmVsGAMgASgJEi4KBWNsYXNzGAQgASgOMh8uc3RhdGVseS5nZW5lcmF0ZWQuRGVzdGlueUNsYXNzEjoKB3dlaWdodHMYBSADKAsyKS5zdGF0ZWx5LmdlbmVyYXRlZC5DdXN0b21TdGF0V2VpZ2h0c0VudHJ5IjoKFkN1c3RvbVN0YXRXZWlnaHRzRW50cnkSEAoIc3RhdEhhc2gYASABKA0SDgoGd2VpZ2h0GAIgASgBIlsKEEN1c3RvbVN0YXRzRW50cnkSMgoJY2xhc3NUeXBlGAEgASgOMh8uc3RhdGVseS5nZW5lcmF0ZWQuRGVzdGlueUNsYXNzEhMKC2N1c3RvbVN0YXRzGAIgAygNIpkCCg5HbG9iYWxTZXR0aW5ncxINCgVzdGFnZRgBIAEoCRIVCg1kaW1BcGlFbmFibGVkGAIgASgIEiwKJGRlc3RpbnlQcm9maWxlTWluaW11bVJlZnJlc2hJbnRlcnZhbBgDIAEoEhIlCh1kZXN0aW55UHJvZmlsZVJlZnJlc2hJbnRlcnZhbBgEIAEoEhITCgthdXRvUmVmcmVzaBgFIAEoCBIfChdyZWZyZXNoUHJvZmlsZU9uVmlzaWJsZRgGIAEoCBIoCiBkaW1Qcm9maWxlTWluaW11bVJlZnJlc2hJbnRlcnZhbBgHIAEoEhIXCg9zaG93SXNzdWVCYW5uZXIYCCABKAgSEwoLbGFzdFVwZGF0ZWQYCSABKBIiUQoYSW5HYW1lTG9hZG91dElkZW50aWZpZXJzEhEKCWNvbG9ySGFzaBgBIAEoDRIQCghpY29uSGFzaBgCIAEoDRIQCghuYW1lSGFzaBgDIAEoDSKVAQoOSXRlbUFubm90YXRpb24SEQoJcHJvZmlsZUlkGAEgASgEEhYKDmRlc3RpbnlWZXJzaW9uGAIgASgNEigKA3RhZxgDIAEoDjIbLnN0YXRlbHkuZ2VuZXJhdGVkLlRhZ1ZhbHVlEg0KBW5vdGVzGAQgASgJEgoKAmlkGAUgASgEEhMKC2NyYWZ0ZWREYXRlGAYgASgSIn8KC0l0ZW1IYXNoVGFnEhEKCXByb2ZpbGVJZBgBIAEoBBIWCg5kZXN0aW55VmVyc2lvbhgCIAEoDRIoCgN0YWcYAyABKA4yGy5zdGF0ZWx5LmdlbmVyYXRlZC5UYWdWYWx1ZRINCgVub3RlcxgEIAEoCRIMCgRoYXNoGAUgASgNItsCCgdMb2Fkb3V0EgoKAmlkGAEgASgMEgwKBG5hbWUYAiABKAkSDQoFbm90ZXMYAyABKAkSMgoJY2xhc3NUeXBlGAQgASgOMh8uc3RhdGVseS5nZW5lcmF0ZWQuRGVzdGlueUNsYXNzEjAKCGVxdWlwcGVkGAUgAygLMh4uc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dEl0ZW0SMgoKdW5lcXVpcHBlZBgGIAMoCzIeLnN0YXRlbHkuZ2VuZXJhdGVkLkxvYWRvdXRJdGVtEjgKCnBhcmFtZXRlcnMYByABKAsyJC5zdGF0ZWx5LmdlbmVyYXRlZC5Mb2Fkb3V0UGFyYW1ldGVycxIRCgljcmVhdGVkQXQYCCABKBISFQoNbGFzdFVwZGF0ZWRBdBgJIAEoEhIWCg5kZXN0aW55VmVyc2lvbhgKIAEoDRIRCglwcm9maWxlSWQYCyABKAQiiAEKC0xvYWRvdXRJdGVtEgoKAmlkGAEgASgEEgwKBGhhc2gYAiABKA0SDgoGYW1vdW50GAMgASgNEjoKD3NvY2tldE92ZXJyaWRlcxgEIAMoCzIhLnN0YXRlbHkuZ2VuZXJhdGVkLlNvY2tldE92ZXJyaWRlEhMKC2NyYWZ0ZWREYXRlGAUgASgSIoYEChFMb2Fkb3V0UGFyYW1ldGVycxI6Cg9zdGF0Q29uc3RyYWludHMYASADKAsyIS5zdGF0ZWx5LmdlbmVyYXRlZC5TdGF0Q29uc3RyYWludBIMCgRtb2RzGAIgAygNEhEKCWNsZWFyTW9kcxgDIAEoCBIUCgxjbGVhcldlYXBvbnMYBCABKAgSEgoKY2xlYXJBcm1vchgFIAEoCBI6Cgxtb2RzQnlCdWNrZXQYBiADKAsyJC5zdGF0ZWx5LmdlbmVyYXRlZC5Nb2RzQnlCdWNrZXRFbnRyeRI7Cg9hcnRpZmFjdFVubG9ja3MYByABKAsyIi5zdGF0ZWx5LmdlbmVyYXRlZC5BcnRpZmFjdFVubG9ja3MSFAoMYXV0b1N0YXRNb2RzGAggASgIEg0KBXF1ZXJ5GAkgASgJEkcKFWFzc3VtZUFybW9yTWFzdGVyd29yaxgKIAEoDjIoLnN0YXRlbHkuZ2VuZXJhdGVkLkFzc3VtZUFybW9yTWFzdGVyd29yaxIXCg9leG90aWNBcm1vckhhc2gYCyABKAMSRgoRaW5HYW1lSWRlbnRpZmllcnMYDCABKAsyKy5zdGF0ZWx5LmdlbmVyYXRlZC5JbkdhbWVMb2Fkb3V0SWRlbnRpZmllcnMSIgoaaW5jbHVkZVJ1bnRpbWVTdGF0QmVuZWZpdHMYDSABKAgi8wIKDExvYWRvdXRTaGFyZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEg0KBW5vdGVzGAMgASgJEjIKCWNsYXNzVHlwZRgEIAEoDjIfLnN0YXRlbHkuZ2VuZXJhdGVkLkRlc3RpbnlDbGFzcxIwCghlcXVpcHBlZBgFIAMoCzIeLnN0YXRlbHkuZ2VuZXJhdGVkLkxvYWRvdXRJdGVtEjIKCnVuZXF1aXBwZWQYBiADKAsyHi5zdGF0ZWx5LmdlbmVyYXRlZC5Mb2Fkb3V0SXRlbRI4CgpwYXJhbWV0ZXJzGAcgASgLMiQuc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dFBhcmFtZXRlcnMSEQoJY3JlYXRlZEF0GAggASgSEhUKDWxhc3RVcGRhdGVkQXQYCSABKBISFgoOZGVzdGlueVZlcnNpb24YCiABKA0SEQoJcHJvZmlsZUlkGAsgASgEEhEKCXZpZXdDb3VudBgPIAEoDSI6ChFNb2RzQnlCdWNrZXRFbnRyeRISCgpidWNrZXRIYXNoGAEgASgNEhEKCW1vZEhhc2hlcxgCIAMoDSK0AQoGU2VhcmNoEg0KBXF1ZXJ5GAEgASgJEhIKCnVzYWdlQ291bnQYAiABKA0SDQoFc2F2ZWQYAyABKAgSEQoJbGFzdFVzYWdlGAQgASgSEisKBHR5cGUYBSABKA4yHS5zdGF0ZWx5LmdlbmVyYXRlZC5TZWFyY2hUeXBlEg0KBXFoYXNoGAYgASgMEhEKCXByb2ZpbGVJZBgHIAEoBBIWCg5kZXN0aW55VmVyc2lvbhgIIAEoDSLKDAoIU2V0dGluZ3MSEAoIbWVtYmVySWQYASABKAQSEwoLaXRlbVF1YWxpdHkYAiABKAgSFAoMc2hvd05ld0l0ZW1zGAMgASgIEjkKDmNoYXJhY3Rlck9yZGVyGAQgASgOMiEuc3RhdGVseS5nZW5lcmF0ZWQuQ2hhcmFjdGVyT3JkZXISGwoTaXRlbVNvcnRPcmRlckN1c3RvbRgFIAMoCRIZChFpdGVtU29ydFJldmVyc2FscxgGIAMoCRIPCgdjaGFyQ29sGAcgASgNEhUKDWNoYXJDb2xNb2JpbGUYCCABKA0SEAoIaXRlbVNpemUYCSABKA0SPgoRY29sbGFwc2VkU2VjdGlvbnMYCiADKAsyIy5zdGF0ZWx5LmdlbmVyYXRlZC5Db2xsYXBzZWRTZWN0aW9uEh4KFmNvbXBsZXRlZFJlY29yZHNIaWRkZW4YCyABKAgSHwoXcmVkYWN0ZWRSZWNvcmRzUmV2ZWFsZWQYDCABKAgSHwoXZmFybWluZ01ha2VSb29tRm9ySXRlbXMYDSABKAgSHAoUaW52ZW50b3J5Q2xlYXJTcGFjZXMYDiABKA0SHAoUaGlkZUNvbXBsZXRlZFJlY29yZHMYDyABKAgSGwoTY3VzdG9tQ2hhcmFjdGVyU29ydBgQIAMoCRI9ChFpbmZ1c2lvbkRpcmVjdGlvbhgRIAEoDjIiLnN0YXRlbHkuZ2VuZXJhdGVkLkluZnVzZURpcmVjdGlvbhIQCghsYW5ndWFnZRgSIAEoCRIXCg93aXNoTGlzdFNvdXJjZXMYEyADKAkSOgoMbG9QYXJhbWV0ZXJzGBQgASgLMiQuc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dFBhcmFtZXRlcnMSSQoYbG9TdGF0Q29uc3RyYWludHNCeUNsYXNzGBUgAygLMicuc3RhdGVseS5nZW5lcmF0ZWQuU3RhdENvbnN0cmFpbnRzRW50cnkSRAoXY3VzdG9tVG90YWxTdGF0c0J5Q2xhc3MYFiADKAsyIy5zdGF0ZWx5LmdlbmVyYXRlZC5DdXN0b21TdGF0c0VudHJ5Eh8KF29yZ2FuaXplckNvbHVtbnNXZWFwb25zGBcgAygJEh0KFW9yZ2FuaXplckNvbHVtbnNBcm1vchgYIAMoCRIdChVvcmdhbml6ZXJDb2x1bW5zR2hvc3QYGSADKAkSGAoQY29tcGFyZUJhc2VTdGF0cxgaIAEoCBIYChBzaWRlY2FyQ29sbGFwc2VkGBsgASgIEhcKD3NpbmdsZUNoYXJhY3RlchgcIAEoCBIXCg9iYWRnZVBvc3RtYXN0ZXIYHSABKAgSEAoIcGVya0xpc3QYHiABKAgSMwoLbG9hZG91dFNvcnQYHyABKA4yHi5zdGF0ZWx5LmdlbmVyYXRlZC5Mb2Fkb3V0U29ydBIaChJpdGVtRmVlZEhpZGVUYWdnZWQYICABKAgSGAoQaXRlbUZlZWRFeHBhbmRlZBghIAEoCBIeChZoaWRlUHVsbEZyb21Qb3N0bWFzdGVyGCIgASgIEkQKFWRlc2NyaXB0aW9uc1RvRGlzcGxheRgjIAEoDjIlLnN0YXRlbHkuZ2VuZXJhdGVkLkRlc2NyaXB0aW9uT3B0aW9ucxIfChdjb21wYXJlV2VhcG9uTWFzdGVyd29yaxgkIAEoCBIZChFpdGVtRmVlZFdhdGVybWFyaxglIAEoBBI1CgtjdXN0b21TdGF0cxgmIAMoCzIgLnN0YXRlbHkuZ2VuZXJhdGVkLkN1c3RvbVN0YXREZWYSFgoOYXV0b0xvY2tUYWdnZWQYJyABKAgSDQoFdGhlbWUYKCABKAkSHQoVc29ydFJlY29yZFByb2dyZXNzaW9uGCkgASgIEh4KFnZlbmRvcnNIaWRlU2lsdmVySXRlbXMYKiABKAgSGwoTdmF1bHRXZWFwb25Hcm91cGluZxgrIAEoCRJNChh2YXVsdFdlYXBvbkdyb3VwaW5nU3R5bGUYLCABKA4yKy5zdGF0ZWx5LmdlbmVyYXRlZC5WYXVsdFdlYXBvbkdyb3VwaW5nU3R5bGUSNQoMaXRlbVBvcHVwVGFiGC0gASgOMh8uc3RhdGVseS5nZW5lcmF0ZWQuSXRlbVBvcHVwVGFiIjcKDlNvY2tldE92ZXJyaWRlEhMKC3NvY2tldEluZGV4GAEgASgNEhAKCGl0ZW1IYXNoGAIgASgNIkQKDlN0YXRDb25zdHJhaW50EhAKCHN0YXRIYXNoGAEgASgNEg8KB21pblRpZXIYAiABKA0SDwoHbWF4VGllchgDIAEoDSKCAQoUU3RhdENvbnN0cmFpbnRzRW50cnkSMgoJY2xhc3NUeXBlGAEgASgOMh8uc3RhdGVseS5nZW5lcmF0ZWQuRGVzdGlueUNsYXNzEjYKC2NvbnN0cmFpbnRzGAIgAygLMiEuc3RhdGVseS5nZW5lcmF0ZWQuU3RhdENvbnN0cmFpbnQiSAoHVHJpdW1waBISCgpyZWNvcmRIYXNoGAEgASgNEhEKCXByb2ZpbGVJZBgCIAEoBBIWCg5kZXN0aW55VmVyc2lvbhgHIAEoDSqlAQoVQXNzdW1lQXJtb3JNYXN0ZXJ3b3JrEh4KGkFzc3VtZUFybW9yTWFzdGVyd29ya19Ob25lEAASIwofQXNzdW1lQXJtb3JNYXN0ZXJ3b3JrX0xlZ2VuZGFyeRABEh0KGUFzc3VtZUFybW9yTWFzdGVyd29ya19BbGwQAhIoCiRBc3N1bWVBcm1vck1hc3RlcndvcmtfQXJ0aWZpY2VFeG90aWMQAyqqAQoOQ2hhcmFjdGVyT3JkZXISHgoaQ2hhcmFjdGVyT3JkZXJfVU5TUEVDSUZJRUQQABIdChlDaGFyYWN0ZXJPcmRlcl9tb3N0UmVjZW50EAESJAogQ2hhcmFjdGVyT3JkZXJfbW9zdFJlY2VudFJldmVyc2UQAhIYChRDaGFyYWN0ZXJPcmRlcl9maXhlZBADEhkKFUNoYXJhY3Rlck9yZGVyX2N1c3RvbRAEKpYBChJEZXNjcmlwdGlvbk9wdGlvbnMSIgoeRGVzY3JpcHRpb25PcHRpb25zX1VOU1BFQ0lGSUVEEAASHQoZRGVzY3JpcHRpb25PcHRpb25zX2J1bmdpZRABEiAKHERlc2NyaXB0aW9uT3B0aW9uc19jb21tdW5pdHkQAhIbChdEZXNjcmlwdGlvbk9wdGlvbnNfYm90aBADKnMKDERlc3RpbnlDbGFzcxIWChJEZXN0aW55Q2xhc3NfVGl0YW4QABIXChNEZXN0aW55Q2xhc3NfSHVudGVyEAESGAoURGVzdGlueUNsYXNzX1dhcmxvY2sQAhIYChREZXN0aW55Q2xhc3NfVW5rbm93bhADKmgKD0luZnVzZURpcmVjdGlvbhIfChtJbmZ1c2VEaXJlY3Rpb25fVU5TUEVDSUZJRUQQABIaChZJbmZ1c2VEaXJlY3Rpb25fSW5mdXNlEAESGAoUSW5mdXNlRGlyZWN0aW9uX0Z1ZWwQAipCCgxJdGVtUG9wdXBUYWISGQoVSXRlbVBvcHVwVGFiX092ZXJ2aWV3EAASFwoTSXRlbVBvcHVwVGFiX1RyaWFnZRABKkEKC0xvYWRvdXRTb3J0EhoKFkxvYWRvdXRTb3J0X0J5RWRpdFRpbWUQABIWChJMb2Fkb3V0U29ydF9CeU5hbWUQASo5CgpTZWFyY2hUeXBlEhMKD1NlYXJjaFR5cGVfSXRlbRAAEhYKElNlYXJjaFR5cGVfTG9hZG91dBABKowBCghUYWdWYWx1ZRIYChRUYWdWYWx1ZV9VTlNQRUNJRklFRBAAEhUKEVRhZ1ZhbHVlX2Zhdm9yaXRlEAESEQoNVGFnVmFsdWVfa2VlcBACEhMKD1RhZ1ZhbHVlX2luZnVzZRADEhEKDVRhZ1ZhbHVlX2p1bmsQBBIUChBUYWdWYWx1ZV9hcmNoaXZlEAUqYwoYVmF1bHRXZWFwb25Hcm91cGluZ1N0eWxlEiIKHlZhdWx0V2VhcG9uR3JvdXBpbmdTdHlsZV9MaW5lcxAAEiMKH1ZhdWx0V2VhcG9uR3JvdXBpbmdTdHlsZV9JbmxpbmUQAWIGcHJvdG8z"); + fileDesc("Cg1zdGF0ZWx5LnByb3RvEhFzdGF0ZWx5LmdlbmVyYXRlZCJsCgZBcGlBcHASDAoCaWQYASABKAlCABIWCgxidW5naWVBcGlLZXkYAiABKAlCABITCglkaW1BcGlLZXkYAyABKAlCABIQCgZvcmlnaW4YBCABKAlCABITCglwYXJ0aXRpb24YBSABKARCADoAIkcKD0FydGlmYWN0VW5sb2NrcxIcChJ1bmxvY2tlZEl0ZW1IYXNoZXMYASADKA1CABIWCgxzZWFzb25OdW1iZXIYAiABKA1CACI2ChBDb2xsYXBzZWRTZWN0aW9uEg0KA2tleRgBIAEoCUIAEhMKCWNvbGxhcHNlZBgCIAEoCEIAIroBCg1DdXN0b21TdGF0RGVmEhIKCHN0YXRIYXNoGAEgASgNQgASDwoFbGFiZWwYAiABKAlCABIUCgpzaG9ydExhYmVsGAMgASgJQgASMAoFY2xhc3MYBCABKA4yHy5zdGF0ZWx5LmdlbmVyYXRlZC5EZXN0aW55Q2xhc3NCABI8Cgd3ZWlnaHRzGAUgAygLMikuc3RhdGVseS5nZW5lcmF0ZWQuQ3VzdG9tU3RhdFdlaWdodHNFbnRyeUIAIj4KFkN1c3RvbVN0YXRXZWlnaHRzRW50cnkSEgoIc3RhdEhhc2gYASABKA1CABIQCgZ3ZWlnaHQYAiABKAFCACJfChBDdXN0b21TdGF0c0VudHJ5EjQKCWNsYXNzVHlwZRgBIAEoDjIfLnN0YXRlbHkuZ2VuZXJhdGVkLkRlc3RpbnlDbGFzc0IAEhUKC2N1c3RvbVN0YXRzGAIgAygNQgAirQIKDkdsb2JhbFNldHRpbmdzEg8KBXN0YWdlGAEgASgJQgASFwoNZGltQXBpRW5hYmxlZBgCIAEoCEIAEi4KJGRlc3RpbnlQcm9maWxlTWluaW11bVJlZnJlc2hJbnRlcnZhbBgDIAEoEkIAEicKHWRlc3RpbnlQcm9maWxlUmVmcmVzaEludGVydmFsGAQgASgSQgASFQoLYXV0b1JlZnJlc2gYBSABKAhCABIhChdyZWZyZXNoUHJvZmlsZU9uVmlzaWJsZRgGIAEoCEIAEioKIGRpbVByb2ZpbGVNaW5pbXVtUmVmcmVzaEludGVydmFsGAcgASgSQgASGQoPc2hvd0lzc3VlQmFubmVyGAggASgIQgASFQoLbGFzdFVwZGF0ZWQYCSABKBJCADoAIlcKGEluR2FtZUxvYWRvdXRJZGVudGlmaWVycxITCgljb2xvckhhc2gYASABKA1CABISCghpY29uSGFzaBgCIAEoDUIAEhIKCG5hbWVIYXNoGAMgASgNQgAiowEKDkl0ZW1Bbm5vdGF0aW9uEhMKCXByb2ZpbGVJZBgBIAEoBEIAEhgKDmRlc3RpbnlWZXJzaW9uGAIgASgNQgASKgoDdGFnGAMgASgOMhsuc3RhdGVseS5nZW5lcmF0ZWQuVGFnVmFsdWVCABIPCgVub3RlcxgEIAEoCUIAEgwKAmlkGAUgASgEQgASFQoLY3JhZnRlZERhdGUYBiABKBJCADoAIosBCgtJdGVtSGFzaFRhZxITCglwcm9maWxlSWQYASABKARCABIYCg5kZXN0aW55VmVyc2lvbhgCIAEoDUIAEioKA3RhZxgDIAEoDjIbLnN0YXRlbHkuZ2VuZXJhdGVkLlRhZ1ZhbHVlQgASDwoFbm90ZXMYBCABKAlCABIOCgRoYXNoGAUgASgNQgA6ACLzAgoHTG9hZG91dBIMCgJpZBgBIAEoDEIAEg4KBG5hbWUYAiABKAlCABIPCgVub3RlcxgDIAEoCUIAEjQKCWNsYXNzVHlwZRgEIAEoDjIfLnN0YXRlbHkuZ2VuZXJhdGVkLkRlc3RpbnlDbGFzc0IAEjIKCGVxdWlwcGVkGAUgAygLMh4uc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dEl0ZW1CABI0Cgp1bmVxdWlwcGVkGAYgAygLMh4uc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dEl0ZW1CABI6CgpwYXJhbWV0ZXJzGAcgASgLMiQuc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dFBhcmFtZXRlcnNCABITCgljcmVhdGVkQXQYCCABKBJCABIXCg1sYXN0VXBkYXRlZEF0GAkgASgSQgASGAoOZGVzdGlueVZlcnNpb24YCiABKA1CABITCglwcm9maWxlSWQYCyABKARCADoAIpIBCgtMb2Fkb3V0SXRlbRIMCgJpZBgBIAEoBEIAEg4KBGhhc2gYAiABKA1CABIQCgZhbW91bnQYAyABKA1CABI8Cg9zb2NrZXRPdmVycmlkZXMYBCADKAsyIS5zdGF0ZWx5LmdlbmVyYXRlZC5Tb2NrZXRPdmVycmlkZUIAEhUKC2NyYWZ0ZWREYXRlGAUgASgSQgAioAQKEUxvYWRvdXRQYXJhbWV0ZXJzEjwKD3N0YXRDb25zdHJhaW50cxgBIAMoCzIhLnN0YXRlbHkuZ2VuZXJhdGVkLlN0YXRDb25zdHJhaW50QgASDgoEbW9kcxgCIAMoDUIAEhMKCWNsZWFyTW9kcxgDIAEoCEIAEhYKDGNsZWFyV2VhcG9ucxgEIAEoCEIAEhQKCmNsZWFyQXJtb3IYBSABKAhCABI8Cgxtb2RzQnlCdWNrZXQYBiADKAsyJC5zdGF0ZWx5LmdlbmVyYXRlZC5Nb2RzQnlCdWNrZXRFbnRyeUIAEj0KD2FydGlmYWN0VW5sb2NrcxgHIAEoCzIiLnN0YXRlbHkuZ2VuZXJhdGVkLkFydGlmYWN0VW5sb2Nrc0IAEhYKDGF1dG9TdGF0TW9kcxgIIAEoCEIAEg8KBXF1ZXJ5GAkgASgJQgASSQoVYXNzdW1lQXJtb3JNYXN0ZXJ3b3JrGAogASgOMiguc3RhdGVseS5nZW5lcmF0ZWQuQXNzdW1lQXJtb3JNYXN0ZXJ3b3JrQgASGQoPZXhvdGljQXJtb3JIYXNoGAsgASgDQgASSAoRaW5HYW1lSWRlbnRpZmllcnMYDCABKAsyKy5zdGF0ZWx5LmdlbmVyYXRlZC5JbkdhbWVMb2Fkb3V0SWRlbnRpZmllcnNCABIkChppbmNsdWRlUnVudGltZVN0YXRCZW5lZml0cxgNIAEoCEIAIo0DCgxMb2Fkb3V0U2hhcmUSDAoCaWQYASABKAlCABIOCgRuYW1lGAIgASgJQgASDwoFbm90ZXMYAyABKAlCABI0CgljbGFzc1R5cGUYBCABKA4yHy5zdGF0ZWx5LmdlbmVyYXRlZC5EZXN0aW55Q2xhc3NCABIyCghlcXVpcHBlZBgFIAMoCzIeLnN0YXRlbHkuZ2VuZXJhdGVkLkxvYWRvdXRJdGVtQgASNAoKdW5lcXVpcHBlZBgGIAMoCzIeLnN0YXRlbHkuZ2VuZXJhdGVkLkxvYWRvdXRJdGVtQgASOgoKcGFyYW1ldGVycxgHIAEoCzIkLnN0YXRlbHkuZ2VuZXJhdGVkLkxvYWRvdXRQYXJhbWV0ZXJzQgASEwoJY3JlYXRlZEF0GAggASgSQgASFwoNbGFzdFVwZGF0ZWRBdBgJIAEoEkIAEhgKDmRlc3RpbnlWZXJzaW9uGAogASgNQgASEwoJcHJvZmlsZUlkGAsgASgEQgASEwoJdmlld0NvdW50GA8gASgNQgA6ACI+ChFNb2RzQnlCdWNrZXRFbnRyeRIUCgpidWNrZXRIYXNoGAEgASgNQgASEwoJbW9kSGFzaGVzGAIgAygNQgAixgEKBlNlYXJjaBIPCgVxdWVyeRgBIAEoCUIAEhQKCnVzYWdlQ291bnQYAiABKA1CABIPCgVzYXZlZBgDIAEoCEIAEhMKCWxhc3RVc2FnZRgEIAEoEkIAEi0KBHR5cGUYBSABKA4yHS5zdGF0ZWx5LmdlbmVyYXRlZC5TZWFyY2hUeXBlQgASDwoFcWhhc2gYBiABKAxCABITCglwcm9maWxlSWQYByABKARCABIYCg5kZXN0aW55VmVyc2lvbhgIIAEoDUIAOgAipg0KCFNldHRpbmdzEhIKCG1lbWJlcklkGAEgASgEQgASFQoLaXRlbVF1YWxpdHkYAiABKAhCABIWCgxzaG93TmV3SXRlbXMYAyABKAhCABI7Cg5jaGFyYWN0ZXJPcmRlchgEIAEoDjIhLnN0YXRlbHkuZ2VuZXJhdGVkLkNoYXJhY3Rlck9yZGVyQgASHQoTaXRlbVNvcnRPcmRlckN1c3RvbRgFIAMoCUIAEhsKEWl0ZW1Tb3J0UmV2ZXJzYWxzGAYgAygJQgASEQoHY2hhckNvbBgHIAEoDUIAEhcKDWNoYXJDb2xNb2JpbGUYCCABKA1CABISCghpdGVtU2l6ZRgJIAEoDUIAEkAKEWNvbGxhcHNlZFNlY3Rpb25zGAogAygLMiMuc3RhdGVseS5nZW5lcmF0ZWQuQ29sbGFwc2VkU2VjdGlvbkIAEiAKFmNvbXBsZXRlZFJlY29yZHNIaWRkZW4YCyABKAhCABIhChdyZWRhY3RlZFJlY29yZHNSZXZlYWxlZBgMIAEoCEIAEiEKF2Zhcm1pbmdNYWtlUm9vbUZvckl0ZW1zGA0gASgIQgASHgoUaW52ZW50b3J5Q2xlYXJTcGFjZXMYDiABKA1CABIeChRoaWRlQ29tcGxldGVkUmVjb3JkcxgPIAEoCEIAEh0KE2N1c3RvbUNoYXJhY3RlclNvcnQYECADKAlCABI/ChFpbmZ1c2lvbkRpcmVjdGlvbhgRIAEoDjIiLnN0YXRlbHkuZ2VuZXJhdGVkLkluZnVzZURpcmVjdGlvbkIAEhIKCGxhbmd1YWdlGBIgASgJQgASGQoPd2lzaExpc3RTb3VyY2VzGBMgAygJQgASPAoMbG9QYXJhbWV0ZXJzGBQgASgLMiQuc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dFBhcmFtZXRlcnNCABJLChhsb1N0YXRDb25zdHJhaW50c0J5Q2xhc3MYFSADKAsyJy5zdGF0ZWx5LmdlbmVyYXRlZC5TdGF0Q29uc3RyYWludHNFbnRyeUIAEkYKF2N1c3RvbVRvdGFsU3RhdHNCeUNsYXNzGBYgAygLMiMuc3RhdGVseS5nZW5lcmF0ZWQuQ3VzdG9tU3RhdHNFbnRyeUIAEiEKF29yZ2FuaXplckNvbHVtbnNXZWFwb25zGBcgAygJQgASHwoVb3JnYW5pemVyQ29sdW1uc0FybW9yGBggAygJQgASHwoVb3JnYW5pemVyQ29sdW1uc0dob3N0GBkgAygJQgASGgoQY29tcGFyZUJhc2VTdGF0cxgaIAEoCEIAEhoKEHNpZGVjYXJDb2xsYXBzZWQYGyABKAhCABIZCg9zaW5nbGVDaGFyYWN0ZXIYHCABKAhCABIZCg9iYWRnZVBvc3RtYXN0ZXIYHSABKAhCABISCghwZXJrTGlzdBgeIAEoCEIAEjUKC2xvYWRvdXRTb3J0GB8gASgOMh4uc3RhdGVseS5nZW5lcmF0ZWQuTG9hZG91dFNvcnRCABIcChJpdGVtRmVlZEhpZGVUYWdnZWQYICABKAhCABIaChBpdGVtRmVlZEV4cGFuZGVkGCEgASgIQgASIAoWaGlkZVB1bGxGcm9tUG9zdG1hc3RlchgiIAEoCEIAEkYKFWRlc2NyaXB0aW9uc1RvRGlzcGxheRgjIAEoDjIlLnN0YXRlbHkuZ2VuZXJhdGVkLkRlc2NyaXB0aW9uT3B0aW9uc0IAEiEKF2NvbXBhcmVXZWFwb25NYXN0ZXJ3b3JrGCQgASgIQgASGwoRaXRlbUZlZWRXYXRlcm1hcmsYJSABKARCABI3CgtjdXN0b21TdGF0cxgmIAMoCzIgLnN0YXRlbHkuZ2VuZXJhdGVkLkN1c3RvbVN0YXREZWZCABIYCg5hdXRvTG9ja1RhZ2dlZBgnIAEoCEIAEg8KBXRoZW1lGCggASgJQgASHwoVc29ydFJlY29yZFByb2dyZXNzaW9uGCkgASgIQgASIAoWdmVuZG9yc0hpZGVTaWx2ZXJJdGVtcxgqIAEoCEIAEh0KE3ZhdWx0V2VhcG9uR3JvdXBpbmcYKyABKAlCABJPChh2YXVsdFdlYXBvbkdyb3VwaW5nU3R5bGUYLCABKA4yKy5zdGF0ZWx5LmdlbmVyYXRlZC5WYXVsdFdlYXBvbkdyb3VwaW5nU3R5bGVCABI3CgxpdGVtUG9wdXBUYWIYLSABKA4yHy5zdGF0ZWx5LmdlbmVyYXRlZC5JdGVtUG9wdXBUYWJCADoAIjsKDlNvY2tldE92ZXJyaWRlEhUKC3NvY2tldEluZGV4GAEgASgNQgASEgoIaXRlbUhhc2gYAiABKA1CACJKCg5TdGF0Q29uc3RyYWludBISCghzdGF0SGFzaBgBIAEoDUIAEhEKB21pblRpZXIYAiABKA1CABIRCgdtYXhUaWVyGAMgASgNQgAihgEKFFN0YXRDb25zdHJhaW50c0VudHJ5EjQKCWNsYXNzVHlwZRgBIAEoDjIfLnN0YXRlbHkuZ2VuZXJhdGVkLkRlc3RpbnlDbGFzc0IAEjgKC2NvbnN0cmFpbnRzGAIgAygLMiEuc3RhdGVseS5nZW5lcmF0ZWQuU3RhdENvbnN0cmFpbnRCACJQCgdUcml1bXBoEhQKCnJlY29yZEhhc2gYASABKA1CABITCglwcm9maWxlSWQYAiABKARCABIYCg5kZXN0aW55VmVyc2lvbhgHIAEoDUIAOgAqpQEKFUFzc3VtZUFybW9yTWFzdGVyd29yaxIeChpBc3N1bWVBcm1vck1hc3RlcndvcmtfTm9uZRAAEiMKH0Fzc3VtZUFybW9yTWFzdGVyd29ya19MZWdlbmRhcnkQARIdChlBc3N1bWVBcm1vck1hc3RlcndvcmtfQWxsEAISKAokQXNzdW1lQXJtb3JNYXN0ZXJ3b3JrX0FydGlmaWNlRXhvdGljEAMqqgEKDkNoYXJhY3Rlck9yZGVyEh4KGkNoYXJhY3Rlck9yZGVyX1VOU1BFQ0lGSUVEEAASHQoZQ2hhcmFjdGVyT3JkZXJfbW9zdFJlY2VudBABEiQKIENoYXJhY3Rlck9yZGVyX21vc3RSZWNlbnRSZXZlcnNlEAISGAoUQ2hhcmFjdGVyT3JkZXJfZml4ZWQQAxIZChVDaGFyYWN0ZXJPcmRlcl9jdXN0b20QBCqWAQoSRGVzY3JpcHRpb25PcHRpb25zEiIKHkRlc2NyaXB0aW9uT3B0aW9uc19VTlNQRUNJRklFRBAAEh0KGURlc2NyaXB0aW9uT3B0aW9uc19idW5naWUQARIgChxEZXNjcmlwdGlvbk9wdGlvbnNfY29tbXVuaXR5EAISGwoXRGVzY3JpcHRpb25PcHRpb25zX2JvdGgQAypzCgxEZXN0aW55Q2xhc3MSFgoSRGVzdGlueUNsYXNzX1RpdGFuEAASFwoTRGVzdGlueUNsYXNzX0h1bnRlchABEhgKFERlc3RpbnlDbGFzc19XYXJsb2NrEAISGAoURGVzdGlueUNsYXNzX1Vua25vd24QAypoCg9JbmZ1c2VEaXJlY3Rpb24SHwobSW5mdXNlRGlyZWN0aW9uX1VOU1BFQ0lGSUVEEAASGgoWSW5mdXNlRGlyZWN0aW9uX0luZnVzZRABEhgKFEluZnVzZURpcmVjdGlvbl9GdWVsEAIqQgoMSXRlbVBvcHVwVGFiEhkKFUl0ZW1Qb3B1cFRhYl9PdmVydmlldxAAEhcKE0l0ZW1Qb3B1cFRhYl9UcmlhZ2UQASpBCgtMb2Fkb3V0U29ydBIaChZMb2Fkb3V0U29ydF9CeUVkaXRUaW1lEAASFgoSTG9hZG91dFNvcnRfQnlOYW1lEAEqOQoKU2VhcmNoVHlwZRITCg9TZWFyY2hUeXBlX0l0ZW0QABIWChJTZWFyY2hUeXBlX0xvYWRvdXQQASqMAQoIVGFnVmFsdWUSGAoUVGFnVmFsdWVfVU5TUEVDSUZJRUQQABIVChFUYWdWYWx1ZV9mYXZvcml0ZRABEhEKDVRhZ1ZhbHVlX2tlZXAQAhITCg9UYWdWYWx1ZV9pbmZ1c2UQAxIRCg1UYWdWYWx1ZV9qdW5rEAQSFAoQVGFnVmFsdWVfYXJjaGl2ZRAFKmMKGFZhdWx0V2VhcG9uR3JvdXBpbmdTdHlsZRIiCh5WYXVsdFdlYXBvbkdyb3VwaW5nU3R5bGVfTGluZXMQABIjCh9WYXVsdFdlYXBvbkdyb3VwaW5nU3R5bGVfSW5saW5lEAFiBnByb3RvMw"); /** * Describes the message stately.generated.ApiApp. diff --git a/api/stately/item-annotations-queries.ts b/api/stately/item-annotations-queries.ts index 6f9eb31..1d88e33 100644 --- a/api/stately/item-annotations-queries.ts +++ b/api/stately/item-annotations-queries.ts @@ -95,6 +95,8 @@ export async function updateItemAnnotation( return deleteItemAnnotation(platformMembershipId, destinyVersion, itemAnnotation.id); } + // We want to merge the incoming values with the existing values, so we need + // to read the existing values first in a transaction. await client.transaction(async (txn) => { let existing = await txn.get( 'ItemAnnotation', diff --git a/api/stately/item-hash-tags-queries.ts b/api/stately/item-hash-tags-queries.ts index 9b6b71c..ab29f91 100644 --- a/api/stately/item-hash-tags-queries.ts +++ b/api/stately/item-hash-tags-queries.ts @@ -57,6 +57,8 @@ export async function updateItemHashTag( return deleteItemHashTag(platformMembershipId, itemHashTag.hash); } + // We want to merge the incoming values with the existing values, so we need + // to read the existing values first in a transaction. await client.transaction(async (txn) => { let existing = await txn.get('ItemHashTag', keyFor(platformMembershipId, itemHashTag.hash)); if (!existing) { diff --git a/api/stately/loadout-share-queries.ts b/api/stately/loadout-share-queries.ts index 3a4582e..bd18830 100644 --- a/api/stately/loadout-share-queries.ts +++ b/api/stately/loadout-share-queries.ts @@ -1,4 +1,4 @@ -import { keyPath } from '@stately-cloud/client'; +import { keyPath, StatelyError } from '@stately-cloud/client'; import { Loadout } from '../shapes/loadouts.js'; import { client } from './client.js'; import { LoadoutShare as StatelyLoadoutShare } from './generated/index.js'; @@ -47,18 +47,13 @@ export async function addLoadoutShare( loadout: Loadout, ): Promise { const loadoutShare = convertLoadoutShareToStately(loadout, platformMembershipId, shareId); - - // TODO: This would be a nice place for Stately's initialValue option which - // would guarantee uniqueness. But it'd have to support our weird shareIDs.s - await client.transaction(async (txn) => { - const existing = await txn.get('LoadoutShare', keyFor(shareId)); - // We do not want to overwrite an existing share! This is another place - // where a Put-If-Not-Exists would be nice. - if (existing) { + try { + await client.put(loadoutShare, { mustNotExist: true }); + } catch (e) { + if (e instanceof StatelyError && e.statelyCode === 'ConditionalCheckFailed') { throw new LoadoutShareCollision(); } - await txn.put(loadoutShare); - }); + } } /** diff --git a/api/stately/schema/types.ts b/api/stately/schema/types.ts index dd9c7d2..7990110 100644 --- a/api/stately/schema/types.ts +++ b/api/stately/schema/types.ts @@ -6,19 +6,17 @@ export const uint32 = type('uint32', FieldDescriptorProto_Type.UINT32); // it included some signed special values. export const LockedExoticHash = type('LockedExoticHash', FieldDescriptorProto_Type.INT64); -export const ItemID = type('ItemID', uint, { docs: 'The unique ID of an inventory item' }); +/** The unique ID of an inventory item */ +export const ItemID = type('ItemID', uint); +/** The hash ID of a definition */ // Manifest hashes are actually a uint32 -export const HashID = type('HashID', uint32, { - docs: 'The hash ID of a definition', -}); +export const HashID = type('HashID', uint32); -export const MembershipID = type('MembershipID', uint, { - docs: 'The unique ID of a Bungie.net membership', -}); -export const ProfileID = type('ProfileID', uint, { - docs: 'The unique ID of a Destiny profile. These can be moved between different Bungie.net memberships.', -}); +/** The unique ID of a Bungie.net membership */ +export const MembershipID = type('MembershipID', uint); +/** The unique ID of a Destiny profile. These can be moved between different Bungie.net memberships. */ +export const ProfileID = type('ProfileID', uint); // This could be an enum, but it's easy enough as a constrained number. export const DestinyVersion = type('DestinyVersion', uint32, { diff --git a/kubernetes/ingress-nginx-config.yaml b/kubernetes/ingress-nginx-config.yaml index 3765d0a..c44e00b 100644 --- a/kubernetes/ingress-nginx-config.yaml +++ b/kubernetes/ingress-nginx-config.yaml @@ -18,5 +18,5 @@ data: enable-modsecurity: "true" enable-owasp-modsecurity-crs: "false" proxy-body-size: "2m" - use-gzip: "true" - enable-brotli: "true" + #use-gzip: "true" + #enable-brotli: "true" diff --git a/package.json b/package.json index 46e04c1..00cd2c5 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "test": "NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest --detectOpenHandles --verbose --coverage --forceExit", "test:watch": "jest --watch", "eslint-inspect": "pnpm dlx @eslint/config-inspector", - "generate": "stately schema generate -l js --schema-id 8030842688320564 --version 2 api/stately/generated", + "generate": "stately schema generate -l js --schema-id 8030842688320564 api/stately/generated", "generate-preview": "stately schema generate -l js --preview api/stately/schema/index.ts api/stately/generated", "dim-api-types:build": "./build-dim-api-types.sh" }, @@ -35,7 +35,7 @@ "@rollup/plugin-babel": "^6.0.4", "@rollup/plugin-node-resolve": "^15.3.0", "@sentry/cli": "^2.38.2", - "@stately-cloud/schema": "^0.10.0", + "@stately-cloud/schema": "^0.12.0", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", "@types/jest": "^29.5.14", @@ -71,7 +71,7 @@ "@google-cloud/profiler": "^6.0.2", "@sentry/node": "^7.119.2", "@sentry/tracing": "^7.114.0", - "@stately-cloud/client": "^0.12.0", + "@stately-cloud/client": "^0.17.0", "bungie-api-ts": "^5.1.0", "cors": "^2.8.5", "dotenv": "^16.4.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e92c7b8..ac2b534 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,8 +21,8 @@ dependencies: specifier: ^7.114.0 version: 7.114.0 '@stately-cloud/client': - specifier: ^0.12.0 - version: 0.12.0(@bufbuild/protobuf@2.2.2) + specifier: ^0.17.0 + version: 0.17.0(@bufbuild/protobuf@2.2.2) bungie-api-ts: specifier: ^5.1.0 version: 5.1.0 @@ -110,8 +110,8 @@ devDependencies: specifier: ^2.38.2 version: 2.38.2 '@stately-cloud/schema': - specifier: ^0.10.0 - version: 0.10.0 + specifier: ^0.12.0 + version: 0.12.0 '@types/cors': specifier: ^2.8.17 version: 2.8.17 @@ -1460,19 +1460,19 @@ packages: engines: {node: '>=0.1.90'} dev: true - /@connectrpc/connect-node@2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3): - resolution: {integrity: sha512-lJEuqkpCfkELX0G8HFClLxh+3/lbwAC8EylXMTCL1+XUTwLXYc4DFORTmqCNObp723fW2mPlGDOpWy5t9m/fYg==} + /@connectrpc/connect-node@2.0.0(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0): + resolution: {integrity: sha512-DoI5T+SUvlS/8QBsxt2iDoUg15dSxqhckegrgZpWOtADtmGohBIVbx1UjtWmjLBrP4RdD0FeBw+XyRUSbpKnJQ==} engines: {node: '>=18.14.1'} peerDependencies: '@bufbuild/protobuf': ^2.2.0 - '@connectrpc/connect': 2.0.0-rc.3 + '@connectrpc/connect': 2.0.0 dependencies: '@bufbuild/protobuf': 2.2.2 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) + '@connectrpc/connect': 2.0.0(@bufbuild/protobuf@2.2.2) dev: false - /@connectrpc/connect@2.0.0-rc.3(@bufbuild/protobuf@2.2.2): - resolution: {integrity: sha512-ARBt64yEyKbanyRETTjcjJuHr2YXorzQo0etyS5+P6oSeW8xEuzajA9g+zDnMcj1hlX2dQE93foIWQGfpru7gQ==} + /@connectrpc/connect@2.0.0(@bufbuild/protobuf@2.2.2): + resolution: {integrity: sha512-Usm8jgaaULANJU8vVnhWssSA6nrZ4DJEAbkNtXSoZay2YD5fDyMukCxu8NEhCvFzfHvrhxhcjttvgpyhOM7xAQ==} peerDependencies: '@bufbuild/protobuf': ^2.2.0 dependencies: @@ -2659,19 +2659,19 @@ packages: '@sinonjs/commons': 3.0.1 dev: true - /@stately-cloud/client@0.12.0(@bufbuild/protobuf@2.2.2): - resolution: {integrity: sha512-Sp4uwTVm5S5a+RBhvpc2cLfyzexLnreTuRUZJOrmEYXGB9fZ6fj/5eE1AP2+4tfByo+ImmlY8igy9QWMvLmxCw==} + /@stately-cloud/client@0.17.0(@bufbuild/protobuf@2.2.2): + resolution: {integrity: sha512-V4C4okX7VhAKRkbB/LC82L7M6t8FxmWmi1dvdCd9aU909vFMYV2/+5sSVPtUICu0rI9jxXcGT3CWcjp2bcJ6+w==} engines: {node: '>=18'} peerDependencies: '@bufbuild/protobuf': ^2.2.0 dependencies: '@bufbuild/protobuf': 2.2.2 - '@connectrpc/connect': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2) - '@connectrpc/connect-node': 2.0.0-rc.3(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0-rc.3) + '@connectrpc/connect': 2.0.0(@bufbuild/protobuf@2.2.2) + '@connectrpc/connect-node': 2.0.0(@bufbuild/protobuf@2.2.2)(@connectrpc/connect@2.0.0) dev: false - /@stately-cloud/schema@0.10.0: - resolution: {integrity: sha512-MgkuVKBN5HSZ+U8+cs9f1mCtB9wrQpE0Ho652RLnOAvuBG6vK4OEwy8fTSAoFxruB90tYXQSk9tfRnADbOmfeA==} + /@stately-cloud/schema@0.12.0: + resolution: {integrity: sha512-+uzFh4OFs8gmeFN1sN1McGQoK4gphuuQxP8+xKv0IjHm/QCDKJHmrP2X/tEZ91cfaVoJu5PoolJEgpmg840cBw==} hasBin: true dependencies: '@bufbuild/protobuf': 2.2.2