( set, get )
| 70 | }; |
| 71 | |
| 72 | export const createInstanceSlice: AppSliceCreator<InstanceSlice> = ( |
| 73 | set, |
| 74 | get |
| 75 | ) => { |
| 76 | const unknownInstance = createUnknownInstance(); |
| 77 | |
| 78 | // Immutable bulk upsert into the by-name cache. |
| 79 | const upsertInstances = (instances: Instance[]): Instance[] => { |
| 80 | set((state) => { |
| 81 | const instancesByName = { ...state.instancesByName }; |
| 82 | for (const instance of instances) { |
| 83 | instancesByName[instance.name] = instance; |
| 84 | } |
| 85 | return { instancesByName }; |
| 86 | }); |
| 87 | return instances; |
| 88 | }; |
| 89 | |
| 90 | return { |
| 91 | instancesByName: {}, |
| 92 | instanceRequests: {}, |
| 93 | instanceErrorsByName: {}, |
| 94 | |
| 95 | resetInstances: () => { |
| 96 | set({ |
| 97 | instancesByName: {}, |
| 98 | instanceRequests: {}, |
| 99 | instanceErrorsByName: {}, |
| 100 | }); |
| 101 | }, |
| 102 | |
| 103 | fetchInstance: async (name) => { |
| 104 | if (!isValidInstanceName(name) || name === UNKNOWN_INSTANCE_NAME) { |
| 105 | return undefined; |
| 106 | } |
| 107 | const existing = get().instancesByName[name]; |
| 108 | if (existing) return existing; |
| 109 | const pending = get().instanceRequests[name]; |
| 110 | if (pending) return pending; |
| 111 | |
| 112 | const request = instanceServiceClientConnect |
| 113 | .getInstance(createProto(GetInstanceRequestSchema, { name })) |
| 114 | .then((instance: Instance) => { |
| 115 | set((state) => { |
| 116 | const { [name]: _, ...instanceRequests } = state.instanceRequests; |
| 117 | return { |
| 118 | instancesByName: { |
| 119 | ...state.instancesByName, |
| 120 | [instance.name]: instance, |
| 121 | }, |
| 122 | instanceErrorsByName: { |
| 123 | ...state.instanceErrorsByName, |
| 124 | [name]: undefined, |
| 125 | }, |
| 126 | instanceRequests, |
| 127 | }; |
| 128 | }); |
| 129 | return instance; |
no test coverage detected